初始化
This commit is contained in:
95
server/scripts/fix_permissions.go
Normal file
95
server/scripts/fix_permissions.go
Normal 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!")
|
||||
}
|
||||
30
server/scripts/fix_permissions.sql
Normal file
30
server/scripts/fix_permissions.sql
Normal 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
70
server/scripts/init_db.go
Normal 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!")
|
||||
}
|
||||
56
server/scripts/reset_password.go
Normal file
56
server/scripts/reset_password.go
Normal 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
164
server/scripts/verify_db.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user