初始化

This commit is contained in:
李琦
2026-01-15 13:51:44 +08:00
commit b7b6d3e39e
156 changed files with 38913 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// MySQL连接信息
username := "root"
password := "root"
hostname := "127.0.0.1"
port := "3306"
dbname := "nl_blog"
// 构建DSN
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, hostname, port, dbname)
// 连接到数据库
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open database connection: %v", err)
}
defer db.Close()
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
fmt.Println("Connected to 'nl_blog' database successfully!")
// 1. 确认 lq 用户存在且 role_id 正确
var userID, roleID int
var usernameStr string
err = db.QueryRow("SELECT id, username, role_id FROM users WHERE username = 'lq'").Scan(&userID, &usernameStr, &roleID)
if err != nil {
log.Printf("Error finding user 'lq': %v", err)
// 如果用户不存在,可以尝试修复(可选)
} else {
fmt.Printf("User found: %s (ID: %d, RoleID: %d)\n", usernameStr, userID, roleID)
}
// 2. 清空并重新填充 role_permissions 表
// 注意:这里假设 roles 表中 ID 1=admin, 2=editor, 3=viewer
// 并且 permissions 表已经有数据。如果 permissions 表也是空的,需要先填充 permissions。
// 先检查 permissions 表是否有数据
var permCount int
db.QueryRow("SELECT COUNT(*) FROM permissions").Scan(&permCount)
if permCount == 0 {
fmt.Println("Permissions table is empty! Repopulating permissions...")
// 插入权限数据 (简略版,确保核心权限存在)
perms := []string{
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Create User', 'users', 'create')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Read User', 'users', 'read')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Update User', 'users', 'update')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Delete User', 'users', 'delete')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Read Dashboard', 'dashboard', 'read')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Create Post', 'posts', 'create')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Read Post', 'posts', 'read')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Update Post', 'posts', 'update')",
"INSERT INTO `permissions` (`name`, `resource`, `action`) VALUES ('Delete Post', 'posts', 'delete')",
}
for _, sql := range perms {
if _, err := db.Exec(sql); err != nil {
log.Printf("Error inserting permission: %v", err)
}
}
}
// 清空 role_permissions
_, err = db.Exec("DELETE FROM role_permissions")
if err != nil {
log.Fatalf("Failed to clear role_permissions: %v", err)
}
// 重新关联 Admin (Role ID 1) - 赋予所有权限
res, err := db.Exec("INSERT INTO role_permissions (role_id, permission_id) SELECT 1, id FROM permissions")
if err != nil {
log.Fatalf("Failed to assign permissions to admin: %v", err)
}
rowsAffected, _ := res.RowsAffected()
fmt.Printf("Assigned %d permissions to Admin role.\n", rowsAffected)
// 重新关联 Editor (Role ID 2) - 赋予 posts 相关权限
res, err = db.Exec("INSERT INTO role_permissions (role_id, permission_id) SELECT 2, id FROM permissions WHERE resource = 'posts'")
if err != nil {
log.Printf("Failed to assign permissions to editor: %v", err)
}
fmt.Println("Database permissions fixed successfully!")
}

View File

@@ -0,0 +1,30 @@
-- 1. 确保 Admin 角色存在
INSERT IGNORE INTO `roles` (`id`, `name`, `description`) VALUES (1, 'admin', '系统管理员');
-- 2. 确保 lq 用户关联到 Admin 角色
UPDATE `users` SET `role_id` = 1 WHERE `username` = 'lq';
-- 3. 确保权限表中有数据 (如果为空)
INSERT IGNORE INTO `permissions` (`name`, `resource`, `action`) VALUES
('Create User', 'users', 'create'),
('Read User', 'users', 'read'),
('Update User', 'users', 'update'),
('Delete User', 'users', 'delete'),
('Read Dashboard', 'dashboard', 'read'),
('Create Post', 'posts', 'create'),
('Read Post', 'posts', 'read'),
('Update Post', 'posts', 'update'),
('Delete Post', 'posts', 'delete'),
('Create Role', 'roles', 'create'),
('Read Role', 'roles', 'read'),
('Update Role', 'roles', 'update'),
('Delete Role', 'roles', 'delete');
-- 4. 清空旧的关联 (为了安全起见,防止重复)
DELETE FROM `role_permissions` WHERE role_id = 1;
-- 5. 重新赋予 Admin 所有权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`)
SELECT 1, id FROM `permissions`;
SELECT 'Permissions fixed successfully' as result;

70
server/scripts/init_db.go Normal file
View File

@@ -0,0 +1,70 @@
package main
import (
"database/sql"
"fmt"
"io/ioutil"
"log"
"strings"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// MySQL连接信息
username := "root"
password := "root"
hostname := "127.0.0.1"
port := "3306"
// 构建DSN (Data Source Name)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/", username, password, hostname, port)
// 连接到MySQL服务器
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open database connection: %v", err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
fmt.Println("Connected to MySQL server successfully!")
// 读取SQL文件 (Assuming running from server root or adjusted path)
// If running from scripts/, path should be ../nl_blog.sql
sqlFile, err := ioutil.ReadFile("../nl_blog.sql")
if err != nil {
// Try current dir if run from root
sqlFile, err = ioutil.ReadFile("nl_blog.sql")
if err != nil {
log.Fatalf("Failed to read SQL file: %v", err)
}
}
// 分割SQL语句
sqlStatements := strings.Split(string(sqlFile), ";")
// 执行每个SQL语句
for _, stmt := range sqlStatements {
// 跳过空语句
stmt = strings.TrimSpace(stmt)
if stmt == "" {
continue
}
// 执行语句
_, err := db.Exec(stmt)
if err != nil {
log.Printf("Error executing statement: %v", err)
continue
}
fmt.Printf("Executed statement: %s\n", stmt)
}
fmt.Println("Database initialization completed!")
}

View File

@@ -0,0 +1,56 @@
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"golang.org/x/crypto/bcrypt"
)
func main() {
// MySQL连接信息
username := "root"
password := "root"
hostname := "127.0.0.1"
port := "3306"
dbname := "nl_blog"
// 构建DSN
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, hostname, port, dbname)
// 连接到数据库
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open database connection: %v", err)
}
defer db.Close()
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
targetUser := "lq"
newPassword := "qiqi991012"
// 生成哈希密码
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(newPassword), bcrypt.DefaultCost)
if err != nil {
log.Fatalf("Failed to hash password: %v", err)
}
// 更新密码
query := "UPDATE users SET password_hash = ? WHERE username = ?"
res, err := db.Exec(query, string(hashedPassword), targetUser)
if err != nil {
log.Fatalf("Failed to update password: %v", err)
}
rowsAffected, _ := res.RowsAffected()
if rowsAffected == 0 {
fmt.Printf("User '%s' not found or password not changed.\n", targetUser)
} else {
fmt.Printf("Password for user '%s' updated successfully.\n", targetUser)
}
}

164
server/scripts/verify_db.go Normal file
View File

@@ -0,0 +1,164 @@
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// MySQL连接信息
username := "root"
password := "root"
hostname := "127.0.0.1"
port := "3306"
// 构建DSN (Data Source Name) - 首先连接到MySQL服务器不指定数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/", username, password, hostname, port)
// 连接到MySQL服务器
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open database connection: %v", err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
fmt.Println("Connected to MySQL server successfully!")
// 1. 检查数据库是否存在
var dbExists bool
checkDBQuery := "SELECT COUNT(*) > 0 FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'nl_blog'"
err = db.QueryRow(checkDBQuery).Scan(&dbExists)
if err != nil {
log.Fatalf("Failed to check database existence: %v", err)
}
if dbExists {
fmt.Println("✅ Database 'nl_blog' exists!")
} else {
log.Fatalf("❌ Database 'nl_blog' does not exist!")
}
// 2. 连接到nl_blog数据库
dsnWithDB := fmt.Sprintf("%s:%s@tcp(%s:%s)/nl_blog", username, password, hostname, port)
db, err = sql.Open("mysql", dsnWithDB)
if err != nil {
log.Fatalf("Failed to open database connection to nl_blog: %v", err)
}
defer db.Close()
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping nl_blog database: %v", err)
}
fmt.Println("Connected to 'nl_blog' database successfully!")
// 3. 查询数据库中的所有表
showTablesQuery := "SHOW TABLES"
rows, err := db.Query(showTablesQuery)
if err != nil {
log.Fatalf("Failed to show tables: %v", err)
}
defer rows.Close()
fmt.Println("\nTables in 'nl_blog' database:")
var tableName string
tableCount := 0
for rows.Next() {
if err := rows.Scan(&tableName); err != nil {
log.Fatalf("Failed to scan table name: %v", err)
}
fmt.Printf("✅ %s\n", tableName)
tableCount++
}
if tableCount == 0 {
log.Fatalf("❌ No tables found in 'nl_blog' database!")
} else {
fmt.Printf("\nTotal tables: %d\n", tableCount)
}
// 4. 检查主要表的结构和数据
checkTableStructure(db, "works")
checkTableStructure(db, "posts")
checkTableStructure(db, "snippets")
checkTableStructure(db, "users")
checkTableStructure(db, "settings")
fmt.Println("\n✅ Database verification completed successfully!")
}
// 检查表结构和数据
func checkTableStructure(db *sql.DB, tableName string) {
fmt.Printf("\n--- Checking table: %s ---", tableName)
// 检查表是否存在
var tableExists bool
checkTableQuery := "SELECT COUNT(*) > 0 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'nl_blog' AND TABLE_NAME = ?"
err := db.QueryRow(checkTableQuery, tableName).Scan(&tableExists)
if err != nil {
log.Fatalf("Failed to check table existence: %v", err)
}
if !tableExists {
log.Fatalf("❌ Table '%s' does not exist!", tableName)
}
// 查询表中的记录数量
var count int
countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", tableName)
err = db.QueryRow(countQuery).Scan(&count)
if err != nil {
log.Fatalf("Failed to count rows in table '%s': %v", tableName, err)
}
fmt.Printf("\n✅ Table '%s' exists with %d records", tableName, count)
// 查询表结构前5个字段
// 简化查询,只获取字段名、类型、是否为空和键信息,不获取默认值和额外信息
schemaQuery := `SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'nl_blog' AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
LIMIT 5`
rows, err := db.Query(schemaQuery, tableName)
if err != nil {
log.Fatalf("Failed to get schema for table '%s': %v", tableName, err)
}
defer rows.Close()
fmt.Println("\nTable structure (top 5 fields):")
var field, fieldType, null, key string
for rows.Next() {
if err := rows.Scan(&field, &fieldType, &null, &key); err != nil {
log.Fatalf("Failed to scan field: %v", err)
}
fmt.Printf(" %s | %s | %s | %s\n", field, fieldType, null, key)
}
// 如果是posts表查询前2条记录
if tableName == "posts" && count > 0 {
fmt.Println("\nSample data (top 2 records):")
sampleQuery := "SELECT id, title, category, date FROM posts ORDER BY date DESC LIMIT 2"
rows, err := db.Query(sampleQuery)
if err != nil {
log.Fatalf("Failed to get sample data from '%s': %v", tableName, err)
}
defer rows.Close()
var id, title, category, date string
for rows.Next() {
if err := rows.Scan(&id, &title, &category, &date); err != nil {
log.Fatalf("Failed to scan sample data: %v", err)
}
fmt.Printf(" ID: %s | Title: %s | Category: %s | Date: %s\n", id, title, category, date)
}
}
}