Files
ppgo_job/boot/init.go
T
2026-07-10 14:25:27 +08:00

189 lines
8.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package boot
import (
"context"
"time"
"ppgo_job/service/scheduler"
"github.com/gogf/gf/v2/frame/g"
)
func init() {
ctx := context.Background()
g.Log().Info(ctx, "PPGo_Job 正在初始化...")
autoInitDB(ctx)
scheduler.Scheduler.Init(ctx)
g.Log().Info(ctx, "PPGo_Job 初始化完成")
}
func autoInitDB(ctx context.Context) {
tables := []string{
`CREATE TABLE IF NOT EXISTS pp_uc_admin (
id INTEGER PRIMARY KEY AUTOINCREMENT,
login_name TEXT NOT NULL UNIQUE, real_name TEXT NOT NULL DEFAULT '',
password TEXT NOT NULL DEFAULT '', role_ids TEXT NOT NULL DEFAULT '',
phone TEXT NOT NULL DEFAULT '', email TEXT NOT NULL DEFAULT '',
dingtalk TEXT NOT NULL DEFAULT '', wechat TEXT NOT NULL DEFAULT '',
salt TEXT NOT NULL DEFAULT '', last_login INTEGER NOT NULL DEFAULT 0,
last_ip TEXT NOT NULL DEFAULT '', status INTEGER NOT NULL DEFAULT 1,
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS pp_uc_auth (
id INTEGER PRIMARY KEY AUTOINCREMENT,
auth_name TEXT NOT NULL DEFAULT '', auth_url TEXT NOT NULL DEFAULT '',
user_id INTEGER NOT NULL DEFAULT 0, pid INTEGER NOT NULL DEFAULT 0,
sort INTEGER NOT NULL DEFAULT 0, icon TEXT NOT NULL DEFAULT '',
is_show INTEGER NOT NULL DEFAULT 1, status INTEGER NOT NULL DEFAULT 1,
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS pp_uc_role (
id INTEGER PRIMARY KEY AUTOINCREMENT,
role_name TEXT NOT NULL DEFAULT '', detail TEXT NOT NULL DEFAULT '',
server_group_ids TEXT NOT NULL DEFAULT '', task_group_ids TEXT NOT NULL DEFAULT '',
status INTEGER NOT NULL DEFAULT 1,
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS pp_uc_role_auth (
auth_id INTEGER NOT NULL, role_id INTEGER NOT NULL,
PRIMARY KEY (auth_id, role_id)
)`,
`CREATE TABLE IF NOT EXISTS pp_task_server_group (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_name TEXT NOT NULL DEFAULT '', description TEXT NOT NULL DEFAULT '',
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0,
status INTEGER NOT NULL DEFAULT 1
)`,
`CREATE TABLE IF NOT EXISTS pp_task_server (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER NOT NULL DEFAULT 0, connection_type INTEGER NOT NULL DEFAULT 0,
server_name TEXT NOT NULL DEFAULT '', server_account TEXT NOT NULL DEFAULT '',
server_outer_ip TEXT NOT NULL DEFAULT '', server_ip TEXT NOT NULL DEFAULT '',
port INTEGER NOT NULL DEFAULT 22, password TEXT NOT NULL DEFAULT '',
private_key_src TEXT NOT NULL DEFAULT '', public_key_src TEXT NOT NULL DEFAULT '',
type INTEGER NOT NULL DEFAULT 0, detail TEXT NOT NULL DEFAULT '',
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0,
status INTEGER NOT NULL DEFAULT 1
)`,
`CREATE TABLE IF NOT EXISTS pp_task_group (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_name TEXT NOT NULL DEFAULT '', description TEXT NOT NULL DEFAULT '',
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0,
status INTEGER NOT NULL DEFAULT 1
)`,
`CREATE TABLE IF NOT EXISTS pp_task (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER NOT NULL DEFAULT 0, server_ids TEXT NOT NULL DEFAULT '',
server_type INTEGER NOT NULL DEFAULT 0, task_name TEXT NOT NULL DEFAULT '',
description TEXT NOT NULL DEFAULT '', cron_spec TEXT NOT NULL DEFAULT '',
concurrent INTEGER NOT NULL DEFAULT 0, task_type TEXT NOT NULL DEFAULT 'shell',
command TEXT NOT NULL DEFAULT '', url TEXT NOT NULL DEFAULT '',
method TEXT NOT NULL DEFAULT 'GET', headers TEXT NOT NULL DEFAULT '',
body TEXT NOT NULL DEFAULT '',
timeout INTEGER NOT NULL DEFAULT 0, execute_times INTEGER NOT NULL DEFAULT 0,
prev_time INTEGER NOT NULL DEFAULT 0, status INTEGER NOT NULL DEFAULT 2,
is_notify INTEGER NOT NULL DEFAULT 0, notify_type INTEGER NOT NULL DEFAULT 0,
notify_tpl_id INTEGER NOT NULL DEFAULT 0, notify_user_ids TEXT NOT NULL DEFAULT '',
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS pp_task_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL DEFAULT 0, server_id INTEGER NOT NULL DEFAULT 0,
server_name TEXT NOT NULL DEFAULT '', output TEXT NOT NULL DEFAULT '',
error TEXT NOT NULL DEFAULT '', status INTEGER NOT NULL DEFAULT 0,
process_time INTEGER NOT NULL DEFAULT 0, create_time INTEGER NOT NULL DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS pp_task_ban (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT NOT NULL DEFAULT '', create_time INTEGER NOT NULL DEFAULT 0,
update_time INTEGER NOT NULL DEFAULT 0, status INTEGER NOT NULL DEFAULT 1
)`,
`CREATE TABLE IF NOT EXISTS pp_notify_tpl (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL DEFAULT 'system', tpl_name TEXT NOT NULL DEFAULT '',
tpl_type INTEGER NOT NULL DEFAULT 0, title TEXT NOT NULL DEFAULT '',
content TEXT NOT NULL DEFAULT '', status INTEGER NOT NULL DEFAULT 1,
create_id INTEGER NOT NULL DEFAULT 0, update_id INTEGER NOT NULL DEFAULT 0,
create_time INTEGER NOT NULL DEFAULT 0, update_time INTEGER NOT NULL DEFAULT 0
)`,
}
for _, sql := range tables {
if _, err := g.DB().Exec(ctx, sql); err != nil {
g.Log().Warningf(ctx, "建表失败: %v", err)
}
}
// 迁移:为旧表添加新列(忽略重复添加的错误)
migrations := []string{
"ALTER TABLE pp_task ADD COLUMN task_type TEXT NOT NULL DEFAULT 'shell'",
"ALTER TABLE pp_task ADD COLUMN url TEXT NOT NULL DEFAULT ''",
"ALTER TABLE pp_task ADD COLUMN method TEXT NOT NULL DEFAULT 'GET'",
"ALTER TABLE pp_task ADD COLUMN headers TEXT NOT NULL DEFAULT ''",
"ALTER TABLE pp_task ADD COLUMN body TEXT NOT NULL DEFAULT ''",
}
for _, sql := range migrations {
if _, err := g.DB().Exec(ctx, sql); err != nil {
// 列已存在则忽略错误
}
}
var adminCount int
_ = g.DB().GetScan(ctx, &adminCount, "SELECT COUNT(*) FROM pp_uc_admin WHERE id=?", 1)
if adminCount == 0 {
_, _ = g.DB().Exec(ctx,
"INSERT INTO pp_uc_admin(id, login_name, real_name, password, role_ids, salt, status, create_time, update_time) VALUES(?,?,?,?,?,?,?,?,?)",
1, "admin", "管理员", "bc9b5718afdffe85fb13555347969ff5", "0", "abcd", 1, time.Now().Unix(), time.Now().Unix(),
)
g.Log().Info(ctx, "已创建默认管理员 admin / 123456")
}
var authCount int
_ = g.DB().GetScan(ctx, &authCount, "SELECT COUNT(*) FROM pp_uc_auth")
if authCount == 0 {
seedAuth(ctx)
}
}
func seedAuth(ctx context.Context) {
now := time.Now().Unix()
type row struct {
id, pid, sort, isShow int
name, url, icon string
}
rows := []row{
// pid=0 = 一级菜单
{1, 0, 1, 1, "任务管理", " ", "fa-tasks"},
{2, 0, 2, 1, "服务器管理", " ", "fa-server"},
{3, 0, 3, 1, "系统设置", " ", "fa-cog"},
{4, 0, 4, 1, "日志管理", " ", "fa-file-text"},
{5, 0, 5, 1, "权限管理", " ", "fa-lock"},
// 二级菜单(pid=父菜单的id
{14, 1, 1, 1, "任务列表", "/task/list", "fa-tasks"},
{15, 1, 2, 1, "任务审核", "/task/audit_list", "fa-check"},
{16, 2, 1, 1, "服务器列表", "/server/list", "fa-server"},
{6, 3, 1, 1, "任务分组", "/group/list", "fa-folder"},
{7, 3, 2, 1, "资源分组", "/server_group/list", "fa-sitemap"},
{8, 3, 3, 1, "禁用命令", "/ban/list", "fa-ban"},
{9, 3, 4, 1, "通知模板", "/notify_tpl/list", "fa-bullhorn"},
{10, 4, 1, 1, "执行日志", "/task_log/list", "fa-file"},
{11, 5, 1, 1, "权限因子", "/auth/index", "fa-key"},
{12, 5, 2, 1, "角色管理", "/role/list", "fa-group"},
{13, 5, 3, 1, "管理员管理", "/admin/list", "fa-user"},
}
for _, r := range rows {
g.DB().Exec(ctx,
"INSERT INTO pp_uc_auth(id, auth_name, auth_url, pid, sort, icon, is_show, status, create_time, update_time) VALUES(?,?,?,?,?,?,?,1,?,?)",
r.id, r.name, r.url, r.pid, r.sort, r.icon, r.isShow, now, now,
)
}
}