mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-11-23 09:26:48 +08:00
🎨 🔥 ✨ 🚑 集成前端代码的&兼容容器化部署插件的插件改造&提供了一个新的轮播图插件
This commit is contained in:
167
server/addons/migrations/flashbanner/install.pg.sql
Normal file
167
server/addons/migrations/flashbanner/install.pg.sql
Normal file
@@ -0,0 +1,167 @@
|
||||
-- 删除表(如果存在)
|
||||
DROP TABLE IF EXISTS hg_banner;
|
||||
|
||||
-- 创建表
|
||||
CREATE TABLE hg_banner (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cover VARCHAR(255) DEFAULT NULL,
|
||||
link VARCHAR(255) DEFAULT NULL,
|
||||
type INTEGER DEFAULT 0,
|
||||
status SMALLINT DEFAULT 1,
|
||||
sort INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT NULL,
|
||||
updated_at TIMESTAMP DEFAULT NULL
|
||||
);
|
||||
|
||||
-- 添加表注释
|
||||
COMMENT ON TABLE hg_banner IS '轮播图表';
|
||||
|
||||
-- 添加列注释
|
||||
COMMENT ON COLUMN hg_banner.name IS '轮播图名称';
|
||||
COMMENT ON COLUMN hg_banner.cover IS '图片URL';
|
||||
COMMENT ON COLUMN hg_banner.link IS '跳转链接,小程序内用相对地址';
|
||||
COMMENT ON COLUMN hg_banner.type IS '类型默认不传';
|
||||
COMMENT ON COLUMN hg_banner.status IS '1可用,2不可用';
|
||||
COMMENT ON COLUMN hg_banner.sort IS '排序,数字越大越靠前';
|
||||
|
||||
-- 添加 updated_at 字段的更新触发器(模拟 MySQL 的 ON UPDATE CURRENT_TIMESTAMP)
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER trigger_update_updated_at
|
||||
BEFORE UPDATE ON hg_banner
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- 添加菜单项
|
||||
-- 先查找或创建"内容管理"父菜单(如果不存在)
|
||||
INSERT INTO hg_admin_menu (pid, level, tree, title, name, path, icon, type, redirect, permissions, permission_name, component, always_show, active_menu, is_root, is_frame, frame_src, keep_alive, hidden, affix, sort, remark, status, updated_at, created_at)
|
||||
SELECT 0, 1, '', '内容管理', 'content', '/content', 'BookOutlined', 1, '/content', '', '', 'LAYOUT', 2, '', 1, 2, '', 2, 2, 2, 12, '内容管理模块', 1, NOW(), NOW()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM hg_admin_menu WHERE name = 'content');
|
||||
|
||||
-- 获取内容管理菜单ID并添加轮播图管理菜单
|
||||
WITH content_parent AS (
|
||||
SELECT id FROM hg_admin_menu WHERE name = 'content' LIMIT 1
|
||||
),
|
||||
inserted_menu AS (
|
||||
INSERT INTO hg_admin_menu (pid, level, tree, title, name, path, icon, type, redirect, permissions, permission_name, component, always_show, active_menu, is_root, is_frame, frame_src, keep_alive, hidden, affix, sort, remark, status, updated_at, created_at)
|
||||
SELECT
|
||||
cp.id,
|
||||
2,
|
||||
'tr_' || cp.id::text || ' ',
|
||||
'轮播图管理',
|
||||
'flashbanner',
|
||||
'/flashbanner',
|
||||
'',
|
||||
2,
|
||||
'',
|
||||
'/flashbanner/banner/list',
|
||||
'',
|
||||
'/addons/flashbanner/index',
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
'',
|
||||
1,
|
||||
2,
|
||||
2,
|
||||
10,
|
||||
'轮播图管理模块',
|
||||
1,
|
||||
NOW(),
|
||||
NOW()
|
||||
FROM content_parent cp
|
||||
RETURNING id
|
||||
)
|
||||
-- 添加子菜单和按钮
|
||||
INSERT INTO hg_admin_menu (pid, level, tree, title, name, path, icon, type, redirect, permissions, permission_name, component, always_show, active_menu, is_root, is_frame, frame_src, keep_alive, hidden, affix, sort, remark, status, updated_at, created_at)
|
||||
SELECT
|
||||
im.id,
|
||||
3,
|
||||
'tr_' || (SELECT id FROM content_parent)::text || ' tr_' || im.id::text || ' ',
|
||||
'新增轮播',
|
||||
'addbanner',
|
||||
'',
|
||||
'',
|
||||
3,
|
||||
'',
|
||||
'/flashbanner/banner/create',
|
||||
'',
|
||||
'',
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
10,
|
||||
'新增轮播图权限',
|
||||
1,
|
||||
NOW(),
|
||||
NOW()
|
||||
FROM inserted_menu im
|
||||
UNION ALL
|
||||
SELECT
|
||||
im.id,
|
||||
3,
|
||||
'tr_' || (SELECT id FROM content_parent)::text || ' tr_' || im.id::text || ' ',
|
||||
'轮播编辑',
|
||||
'editbanner',
|
||||
'',
|
||||
'',
|
||||
3,
|
||||
'',
|
||||
'/flashbanner/banner/update',
|
||||
'',
|
||||
'',
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
10,
|
||||
'编辑轮播图权限',
|
||||
1,
|
||||
NOW(),
|
||||
NOW()
|
||||
FROM inserted_menu im
|
||||
UNION ALL
|
||||
SELECT
|
||||
im.id,
|
||||
3,
|
||||
'tr_' || (SELECT id FROM content_parent)::text || ' tr_' || im.id::text || ' ',
|
||||
'删除轮播',
|
||||
'delbanner',
|
||||
'',
|
||||
'',
|
||||
3,
|
||||
'',
|
||||
'/flashbanner/banner/delete',
|
||||
'',
|
||||
'',
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
'',
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
10,
|
||||
'删除轮播图权限',
|
||||
1,
|
||||
NOW(),
|
||||
NOW()
|
||||
FROM inserted_menu im;
|
||||
33
server/addons/migrations/flashbanner/install.sql
Normal file
33
server/addons/migrations/flashbanner/install.sql
Normal file
@@ -0,0 +1,33 @@
|
||||
DROP TABLE IF EXISTS `hg_banner`;
|
||||
CREATE TABLE `hg_banner` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL COMMENT '轮播图名称',
|
||||
`cover` varchar(255) DEFAULT NULL COMMENT '图片URL',
|
||||
`link` varchar(255) DEFAULT NULL COMMENT '跳转链接,小程序内用相对地址',
|
||||
`type` int(11) DEFAULT 0 COMMENT '类型默认不传',
|
||||
`status` tinyint(1) DEFAULT 1 COMMENT '1可用,2不可用',
|
||||
`sort` int(11) DEFAULT 0 COMMENT '排序,数字越大越靠前',
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='轮播图表';
|
||||
|
||||
|
||||
-- 添加菜单项
|
||||
-- 先查找或创建"内容管理"父菜单(如果不存在)
|
||||
INSERT IGNORE INTO `hg_admin_menu`(`pid`, `level`, `tree`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `sort`, `remark`, `status`, `updated_at`, `created_at`) VALUES
|
||||
(0, 1, '', '内容管理', 'content', '/content', 'BookOutlined', 1, '/content', '', '', 'LAYOUT', 2, '', 1, 2, '', 2, 2, 2, 12, '内容管理模块', 1, NOW(), NOW());
|
||||
|
||||
-- 获取内容管理菜单ID并添加轮播图管理菜单
|
||||
SET @content_parent_id = (SELECT id FROM `hg_admin_menu` WHERE `name` = 'content' LIMIT 1);
|
||||
|
||||
INSERT INTO `hg_admin_menu`(`pid`, `level`, `tree`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `sort`, `remark`, `status`, `updated_at`, `created_at`) VALUES
|
||||
(@content_parent_id, 2, CONCAT('tr_', @content_parent_id, ' '), '轮播图管理', 'flashbanner', '/flashbanner', '', 2, '', '/flashbanner/banner/list', '', '/addons/flashbanner/index', 2, '', 2, 2, '', 1, 2, 2, 10, '轮播图管理模块', 1, NOW(), NOW());
|
||||
|
||||
-- 添加子菜单和按钮
|
||||
SET @flashbanner_menu_id = LAST_INSERT_ID();
|
||||
|
||||
INSERT INTO `hg_admin_menu`(`pid`, `level`, `tree`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `sort`, `remark`, `status`, `updated_at`, `created_at`) VALUES
|
||||
(@flashbanner_menu_id, 3, CONCAT('tr_', @content_parent_id, ' tr_', @flashbanner_menu_id, ' '), '新增轮播', 'addbanner', '', '', 3, '', '/flashbanner/banner/create', '', '', 2, '', 2, 2, '', 2, 2, 2, 10, '新增轮播图权限', 1, NOW(), NOW()),
|
||||
(@flashbanner_menu_id, 3, CONCAT('tr_', @content_parent_id, ' tr_', @flashbanner_menu_id, ' '), '轮播编辑', 'editbanner', '', '', 3, '', '/flashbanner/banner/update', '', '', 2, '', 2, 2, '', 2, 2, 2, 10, '编辑轮播图权限', 1, NOW(), NOW()),
|
||||
(@flashbanner_menu_id, 3, CONCAT('tr_', @content_parent_id, ' tr_', @flashbanner_menu_id, ' '), '删除轮播', 'delbanner', '', '', 3, '', '/flashbanner/banner/delete', '', '', 2, '', 2, 2, '', 2, 2, 2, 10, '删除轮播图权限', 1, NOW(), NOW());
|
||||
9
server/addons/migrations/flashbanner/uninstall.pg.sql
Normal file
9
server/addons/migrations/flashbanner/uninstall.pg.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
-- 删除表
|
||||
DROP TABLE IF EXISTS hg_banner;
|
||||
|
||||
-- 删除 flashbanner 相关菜单
|
||||
-- 先删除子菜单(权限按钮)
|
||||
DELETE FROM hg_admin_menu WHERE name IN ('addbanner', 'editbanner', 'delbanner');
|
||||
|
||||
-- 删除主菜单
|
||||
DELETE FROM hg_admin_menu WHERE name = 'flashbanner';
|
||||
9
server/addons/migrations/flashbanner/uninstall.sql
Normal file
9
server/addons/migrations/flashbanner/uninstall.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
-- 删除表
|
||||
DROP TABLE IF EXISTS `hg_banner`;
|
||||
|
||||
-- 删除 flashbanner 相关菜单
|
||||
-- 先删除子菜单(权限按钮)
|
||||
DELETE FROM `hg_admin_menu` WHERE `name` IN ('addbanner', 'editbanner', 'delbanner');
|
||||
|
||||
-- 删除主菜单
|
||||
DELETE FROM `hg_admin_menu` WHERE `name` = 'flashbanner';
|
||||
2
server/addons/migrations/readme.md
Normal file
2
server/addons/migrations/readme.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# 为了在容器映射sql所以需要独立出来
|
||||
# 兼容数据库和前端文件的迁移
|
||||
66
server/addons/migrations/sqlDo.go
Normal file
66
server/addons/migrations/sqlDo.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/container/gvar"
|
||||
)
|
||||
func DoSqlContent(ctx context.Context, sqlPath string) (string, error) {
|
||||
open, err := os.Open(sqlPath)
|
||||
if err != nil {
|
||||
return "fail", err
|
||||
}
|
||||
defer open.Close()
|
||||
sqlContent, err := io.ReadAll(open)
|
||||
if err != nil {
|
||||
return "fail", err
|
||||
}
|
||||
|
||||
// 首先尝试整个执行
|
||||
_, err = g.DB().Exec(ctx, string(sqlContent))
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, "整个执行SQL失败,尝试分句执行:", err)
|
||||
|
||||
// 整个执行失败,尝试按分号分割执行
|
||||
sqls := strings.Split(string(sqlContent), ";")
|
||||
for _, sql := range sqls {
|
||||
sql = strings.TrimSpace(sql)
|
||||
if sql != "" {
|
||||
_, err := g.DB().Exec(ctx, sql)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, "执行SQL失败:", err, sql)
|
||||
return "fail", err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return "success", nil
|
||||
}
|
||||
|
||||
func GetDbLink(ctx context.Context) *gvar.Var {
|
||||
link := g.Cfg().MustGet(ctx, "database.default")
|
||||
//读写分离
|
||||
if !link.IsSlice() {
|
||||
return g.Cfg().MustGet(ctx, "database.default.link")
|
||||
}
|
||||
for _, v := range link.Array() {
|
||||
// 只获取主库
|
||||
val := v.(map[string]interface{})
|
||||
if val["role"] == "master" {
|
||||
return gvar.New(val["link"])
|
||||
}
|
||||
}
|
||||
return gvar.New("database.default.0.link")
|
||||
}
|
||||
|
||||
func GetDbType(ctx context.Context) string {
|
||||
var (
|
||||
link = GetDbLink(ctx)
|
||||
)
|
||||
config := strings.SplitN(link.String(), ":", 2)
|
||||
return config[0]
|
||||
}
|
||||
Reference in New Issue
Block a user