Skip to content

Commit ec85ade

Browse files
奇淼(piexlmaxdzwvipZnonymous29
authored
增加自动化代码选择业务库功能,增加无边框页面功能。 (#1264)
* feat:增加无边框页面路由 * 更改基础页面文字说明 * 修复安装插件路径穿越漏洞 * 添加业务库数据库选择功能 Co-authored-by: dzwvip <[email protected]> Co-authored-by: znonymous <[email protected]>
1 parent fcda3be commit ec85ade

File tree

15 files changed

+283
-45
lines changed

15 files changed

+283
-45
lines changed

server/api/v1/system/sys_auto_code.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,15 @@ func (autoApi *AutoCodeApi) CreateTemp(c *gin.Context) {
106106
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取当前所有数据库"
107107
// @Router /autoCode/getDatabase [get]
108108
func (autoApi *AutoCodeApi) GetDB(c *gin.Context) {
109-
dbs, err := autoCodeService.Database().GetDB()
109+
businessDB := c.Query("businessDB")
110+
dbs, err := autoCodeService.Database(businessDB).GetDB(businessDB)
110111
var dbList []map[string]interface{}
111112
for _, db := range global.GVA_CONFIG.DBList {
112113
var item = make(map[string]interface{})
113114
item["aliasName"] = db.AliasName
114115
item["dbName"] = db.Dbname
115116
item["disable"] = db.Disable
117+
item["dbtype"] = db.Type
116118
dbList = append(dbList, item)
117119
}
118120
if err != nil {
@@ -133,7 +135,8 @@ func (autoApi *AutoCodeApi) GetDB(c *gin.Context) {
133135
// @Router /autoCode/getTables [get]
134136
func (autoApi *AutoCodeApi) GetTables(c *gin.Context) {
135137
dbName := c.DefaultQuery("dbName", global.GVA_CONFIG.Mysql.Dbname)
136-
tables, err := autoCodeService.Database().GetTables(dbName)
138+
businessDB := c.Query("businessDB")
139+
tables, err := autoCodeService.Database(businessDB).GetTables(businessDB, dbName)
137140
if err != nil {
138141
global.GVA_LOG.Error("查询table失败!", zap.Error(err))
139142
response.FailWithMessage("查询table失败", c)
@@ -151,9 +154,10 @@ func (autoApi *AutoCodeApi) GetTables(c *gin.Context) {
151154
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取当前表所有字段"
152155
// @Router /autoCode/getColumn [get]
153156
func (autoApi *AutoCodeApi) GetColumn(c *gin.Context) {
157+
businessDB := c.Query("businessDB")
154158
dbName := c.DefaultQuery("dbName", global.GVA_CONFIG.Mysql.Dbname)
155159
tableName := c.Query("tableName")
156-
columns, err := autoCodeService.Database().GetColumn(tableName, dbName)
160+
columns, err := autoCodeService.Database(businessDB).GetColumn(businessDB, tableName, dbName)
157161
if err != nil {
158162
global.GVA_LOG.Error("获取失败!", zap.Error(err))
159163
response.FailWithMessage("获取失败", c)

server/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type Server struct {
1212
// gorm
1313
Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
1414
Pgsql Pgsql `mapstructure:"pgsql" json:"pgsql" yaml:"pgsql"`
15+
Oracle Oracle `mapstructure:"oracle" json:"oracle" yaml:"oracle"`
1516
DBList []SpecializedDB `mapstructure:"db-list" json:"db-list" yaml:"db-list"`
1617
// oss
1718
Local Local `mapstructure:"local" json:"local" yaml:"local"`

server/config/gorm_oracle.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package config
2+
3+
type Oracle struct {
4+
GeneralDB `yaml:",inline" mapstructure:",squash"`
5+
}
6+
7+
func (m *Oracle) Dsn() string {
8+
return "oracle://" + m.Username + ":" + m.Password + "@" + m.Path + ":" + m.Port + "/" + m.Dbname + "?" + m.Config
9+
10+
}
11+
12+
func (m *Oracle) GetLogMode() string {
13+
return m.LogMode
14+
}

server/initialize/db_list.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ func DBList() {
1919
dbMap[info.AliasName] = GormMysqlByConfig(config.Mysql{GeneralDB: info.GeneralDB})
2020
case "pgsql":
2121
dbMap[info.AliasName] = GormPgSqlByConfig(config.Pgsql{GeneralDB: info.GeneralDB})
22+
case "oracle":
23+
dbMap[info.AliasName] = GormOracleByConfig(config.Oracle{GeneralDB: info.GeneralDB})
2224
default:
2325
continue
2426
}

server/initialize/gorm_oracle.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package initialize
2+
3+
import (
4+
//"github.com/dzwvip/oracle"
5+
"github.com/flipped-aurora/gin-vue-admin/server/config"
6+
"github.com/flipped-aurora/gin-vue-admin/server/global"
7+
"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
8+
9+
//_ "github.com/godror/godror"
10+
"gorm.io/driver/mysql"
11+
"gorm.io/gorm"
12+
)
13+
14+
// GormOracle 初始化oracle数据库
15+
// 如果需要Oracle库 放开import里的注释 把下方 mysql.Config 改为 oracle.Config ; mysql.New 改为 oracle.New
16+
func GormOracle() *gorm.DB {
17+
m := global.GVA_CONFIG.Oracle
18+
if m.Dbname == "" {
19+
return nil
20+
}
21+
oracleConfig := mysql.Config{
22+
DSN: m.Dsn(), // DSN data source name
23+
DefaultStringSize: 191, // string 类型字段的默认长度
24+
25+
}
26+
if db, err := gorm.Open(mysql.New(oracleConfig), internal.Gorm.Config()); err != nil {
27+
panic(err)
28+
} else {
29+
sqlDB, _ := db.DB()
30+
sqlDB.SetMaxIdleConns(m.MaxIdleConns)
31+
sqlDB.SetMaxOpenConns(m.MaxOpenConns)
32+
return db
33+
}
34+
}
35+
36+
// GormOracleByConfig 初始化Oracle数据库用过传入配置
37+
func GormOracleByConfig(m config.Oracle) *gorm.DB {
38+
if m.Dbname == "" {
39+
return nil
40+
}
41+
oracleConfig := mysql.Config{
42+
DSN: m.Dsn(), // DSN data source name
43+
DefaultStringSize: 191, // string 类型字段的默认长度
44+
45+
}
46+
if db, err := gorm.Open(mysql.New(oracleConfig), internal.Gorm.Config()); err != nil {
47+
panic(err)
48+
} else {
49+
sqlDB, _ := db.DB()
50+
sqlDB.SetMaxIdleConns(m.MaxIdleConns)
51+
sqlDB.SetMaxOpenConns(m.MaxOpenConns)
52+
return db
53+
}
54+
}

server/initialize/internal/gorm.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ func (g *_gorm) Config() *gorm.Config {
3333
logMode = &global.GVA_CONFIG.Mysql
3434
case "pgsql":
3535
logMode = &global.GVA_CONFIG.Pgsql
36+
case "oracle":
37+
logMode = &global.GVA_CONFIG.Oracle
3638
default:
3739
logMode = &global.GVA_CONFIG.Mysql
3840
}

server/service/system/sys_auto_code_interface.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,39 @@ import (
66
)
77

88
type Database interface {
9-
GetDB() (data []response.Db, err error)
10-
GetTables(dbName string) (data []response.Table, err error)
11-
GetColumn(tableName string, dbName string) (data []response.Column, err error)
9+
GetDB(businessDB string) (data []response.Db, err error)
10+
GetTables(businessDB string, dbName string) (data []response.Table, err error)
11+
GetColumn(businessDB string, tableName string, dbName string) (data []response.Column, err error)
1212
}
1313

14-
func (autoCodeService *AutoCodeService) Database() Database {
15-
switch global.GVA_CONFIG.System.DbType {
16-
case "mysql":
17-
return AutoCodeMysql
18-
case "pgsql":
19-
return AutoCodePgsql
20-
default:
14+
func (autoCodeService *AutoCodeService) Database(businessDB string) Database {
15+
16+
if businessDB == "" {
17+
switch global.GVA_CONFIG.System.DbType {
18+
case "mysql":
19+
return AutoCodeMysql
20+
case "pgsql":
21+
return AutoCodePgsql
22+
default:
23+
return AutoCodeMysql
24+
}
25+
} else {
26+
for _, info := range global.GVA_CONFIG.DBList {
27+
if info.AliasName == businessDB {
28+
29+
switch info.Type {
30+
case "mysql":
31+
return AutoCodeMysql
32+
case "pgsql":
33+
return AutoCodePgsql
34+
case "oracle":
35+
return AutoCodeOracle
36+
default:
37+
return AutoCodeMysql
38+
}
39+
}
40+
}
2141
return AutoCodeMysql
2242
}
43+
2344
}

server/service/system/sys_auto_code_mysql.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,36 @@ type autoCodeMysql struct{}
1212
// GetDB 获取数据库的所有数据库名
1313
// Author [piexlmax](https://github.com/piexlmax)
1414
// Author [SliverHorn](https://github.com/SliverHorn)
15-
func (s *autoCodeMysql) GetDB() (data []response.Db, err error) {
15+
func (s *autoCodeMysql) GetDB(businessDB string) (data []response.Db, err error) {
1616
var entities []response.Db
1717
sql := "SELECT SCHEMA_NAME AS `database` FROM INFORMATION_SCHEMA.SCHEMATA;"
18-
err = global.GVA_DB.Raw(sql).Scan(&entities).Error
18+
if businessDB == "" {
19+
err = global.GVA_DB.Raw(sql).Scan(&entities).Error
20+
} else {
21+
err = global.GVA_DBList[businessDB].Raw(sql).Scan(&entities).Error
22+
}
1923
return entities, err
2024
}
2125

2226
// GetTables 获取数据库的所有表名
2327
// Author [piexlmax](https://github.com/piexlmax)
2428
// Author [SliverHorn](https://github.com/SliverHorn)
25-
func (s *autoCodeMysql) GetTables(dbName string) (data []response.Table, err error) {
29+
func (s *autoCodeMysql) GetTables(businessDB string, dbName string) (data []response.Table, err error) {
2630
var entities []response.Table
2731
sql := `select table_name as table_name from information_schema.tables where table_schema = ?`
28-
err = global.GVA_DB.Raw(sql, dbName).Scan(&entities).Error
32+
if businessDB == "" {
33+
err = global.GVA_DB.Raw(sql, dbName).Scan(&entities).Error
34+
} else {
35+
err = global.GVA_DBList[businessDB].Raw(sql, dbName).Scan(&entities).Error
36+
}
37+
2938
return entities, err
3039
}
3140

3241
// GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
3342
// Author [piexlmax](https://github.com/piexlmax)
3443
// Author [SliverHorn](https://github.com/SliverHorn)
35-
func (s *autoCodeMysql) GetColumn(tableName string, dbName string) (data []response.Column, err error) {
44+
func (s *autoCodeMysql) GetColumn(businessDB string, tableName string, dbName string) (data []response.Column, err error) {
3645
var entities []response.Column
3746
sql := `
3847
SELECT COLUMN_NAME column_name,
@@ -50,6 +59,11 @@ func (s *autoCodeMysql) GetColumn(tableName string, dbName string) (data []respo
5059
WHERE table_name = ?
5160
AND table_schema = ?
5261
`
53-
err = global.GVA_DB.Raw(sql, tableName, dbName).Scan(&entities).Error
62+
if businessDB == "" {
63+
err = global.GVA_DB.Raw(sql, tableName, dbName).Scan(&entities).Error
64+
} else {
65+
err = global.GVA_DBList[businessDB].Raw(sql, tableName, dbName).Scan(&entities).Error
66+
}
67+
5468
return entities, err
5569
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package system
2+
3+
import (
4+
"github.com/flipped-aurora/gin-vue-admin/server/global"
5+
"github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
6+
)
7+
8+
var AutoCodeOracle = new(autoCodeOracle)
9+
10+
type autoCodeOracle struct{}
11+
12+
// GetDB 获取数据库的所有数据库名
13+
// Author [piexlmax](https://github.com/piexlmax)
14+
// Author [SliverHorn](https://github.com/SliverHorn)
15+
func (s *autoCodeOracle) GetDB(businessDB string) (data []response.Db, err error) {
16+
var entities []response.Db
17+
sql := `SELECT lower(username) AS "database" FROM all_users`
18+
19+
err = global.GVA_DBList[businessDB].Raw(sql).Scan(&entities).Error
20+
return entities, err
21+
}
22+
23+
// GetTables 获取数据库的所有表名
24+
// Author [piexlmax](https://github.com/piexlmax)
25+
// Author [SliverHorn](https://github.com/SliverHorn)
26+
func (s *autoCodeOracle) GetTables(businessDB string, dbName string) (data []response.Table, err error) {
27+
var entities []response.Table
28+
sql := `select lower(table_name) as "table_name" from all_tables where lower(owner) = ?`
29+
30+
err = global.GVA_DBList[businessDB].Raw(sql, dbName).Scan(&entities).Error
31+
return entities, err
32+
}
33+
34+
// GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
35+
// Author [piexlmax](https://github.com/piexlmax)
36+
// Author [SliverHorn](https://github.com/SliverHorn)
37+
func (s *autoCodeOracle) GetColumn(businessDB string, tableName string, dbName string) (data []response.Column, err error) {
38+
var entities []response.Column
39+
sql := `
40+
select lower(a.COLUMN_NAME) as "column_name",
41+
(CASE WHEN a.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE=0 THEN 'int' else lower(a.DATA_TYPE) end) as "data_type",
42+
(CASE WHEN a.DATA_TYPE = 'NUMBER' THEN a.DATA_PRECISION else a.DATA_LENGTH end) as "data_type_long",
43+
b.COMMENTS as "column_comment"
44+
from all_tab_columns a , all_col_comments b
45+
where a.OWNER = b.OWNER
46+
and a.TABLE_NAME = b.TABLE_NAME
47+
and a.COLUMN_NAME = b.COLUMN_NAME
48+
and lower(a.table_name) = ?
49+
and lower(a.OWNER) = ?
50+
`
51+
52+
err = global.GVA_DBList[businessDB].Raw(sql, tableName, dbName).Scan(&entities).Error
53+
return entities, err
54+
}

server/service/system/sys_auto_code_pgsql.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,37 @@ type autoCodePgsql struct{}
1616
// GetDB 获取数据库的所有数据库名
1717
// Author [piexlmax](https://github.com/piexlmax)
1818
// Author [SliverHorn](https://github.com/SliverHorn)
19-
func (a *autoCodePgsql) GetDB() (data []response.Db, err error) {
19+
func (a *autoCodePgsql) GetDB(businessDB string) (data []response.Db, err error) {
2020
var entities []response.Db
2121
sql := `SELECT datname as database FROM pg_database WHERE datistemplate = false`
22-
err = global.GVA_DB.Raw(sql).Scan(&entities).Error
22+
if businessDB == "" {
23+
err = global.GVA_DB.Raw(sql).Scan(&entities).Error
24+
} else {
25+
err = global.GVA_DBList[businessDB].Raw(sql).Scan(&entities).Error
26+
}
27+
2328
return entities, err
2429
}
2530

2631
// GetTables 获取数据库的所有表名
2732
// Author [piexlmax](https://github.com/piexlmax)
2833
// Author [SliverHorn](https://github.com/SliverHorn)
29-
func (a *autoCodePgsql) GetTables(dbName string) (data []response.Table, err error) {
34+
func (a *autoCodePgsql) GetTables(businessDB string, dbName string) (data []response.Table, err error) {
3035
var entities []response.Table
3136
sql := `select table_name as table_name from information_schema.tables where table_catalog = ? and table_schema = ?`
3237
db, _err := gorm.Open(postgres.Open(global.GVA_CONFIG.Pgsql.LinkDsn(dbName)), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
3338
if _err != nil {
3439
return nil, errors.Wrapf(err, "[pgsql] 连接 数据库(%s)的表失败!", dbName)
3540
}
41+
3642
err = db.Raw(sql, dbName, "public").Scan(&entities).Error
3743
return entities, err
3844
}
3945

4046
// GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
4147
// Author [piexlmax](https://github.com/piexlmax)
4248
// Author [SliverHorn](https://github.com/SliverHorn)
43-
func (a *autoCodePgsql) GetColumn(tableName string, dbName string) (data []response.Column, err error) {
49+
func (a *autoCodePgsql) GetColumn(businessDB string, tableName string, dbName string) (data []response.Column, err error) {
4450
// todo 数据获取不全, 待完善sql
4551
sql := `
4652
SELECT psc.COLUMN_NAME AS COLUMN_NAME,

0 commit comments

Comments
 (0)