Skip to content

Commit

Permalink
更新日志保存功能与修改文件权限功能
Browse files Browse the repository at this point in the history
  • Loading branch information
TNTcraftHIM committed Nov 1, 2022
1 parent 2f428d2 commit 78af4c8
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 47 deletions.
5 changes: 5 additions & 0 deletions configs/app.ini
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
; 日志输出配置
[log]
; 日志文件相对路径 (留空为不保存日志文件)
path = app.log

; cheverto数据库配置
[cheverto]
; ip地址
Expand Down
141 changes: 94 additions & 47 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import (
"chevereto2LskyPro/sql"
"encoding/json"
"fmt"
"io"
"io/fs"
"log"
"os"
"regexp"
"strconv"
Expand All @@ -18,30 +21,29 @@ import (
func changeData(startAt int) {
// 初始化cheverto
if !sql.InitDb1() {
fmt.Println("chevereto数据库初始化失败")
return
log.Fatalln("chevereto数据库初始化失败")
}
// 初始化lsky
if !sql.InitDb2() {
fmt.Println("lsky数据库初始化失败")
return
log.Fatalln("lsky数据库初始化失败")
}
prefix1 := common.GetConfigString("cheverto", "Prefix")
prefix2 := common.GetConfigString("lsky", "Prefix")
log.Println("开始转换数据库")

// 查询并转换所有用户
if data, err := sql.Db1Dql("SELECT user_id, COALESCE(user_name, ''), user_email, login_secret, user_is_admin, user_image_count, user_album_count, user_registration_ip, user_date FROM (SELECT * FROM " + prefix1 + "users JOIN " + prefix1 + "logins ON " + prefix1 + "logins.login_user_id = user_id AND " + prefix1 + "logins.login_type = 'password' ) AS p WHERE user_status = 'valid'"); err == nil && (startAt == 1 || startAt == 2) {
capacity := common.GetConfigString("config", "Capacity")
configs := common.GetConfigString("config", "Configs")
groupID := common.GetConfigString("config", "GroupID")
fmt.Printf("总计%d位用户, 开始转换\n", len(data))
log.Printf("总计%d位用户, 开始转换\n", len(data))
errNum := 0
for k, v := range data {
var lsky model.LskyUsers
// 用户ID
lsky.ID, err = strconv.Atoi(v[0])
if err != nil {
fmt.Printf("第%d位用户转换失败, 错误信息: %s\n", k, err.Error())
log.Printf("第%d位用户转换失败, 错误信息: %s\n", k, err.Error())
errNum++
continue
}
Expand Down Expand Up @@ -93,29 +95,29 @@ func changeData(startAt int) {
VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, lsky.ID, lsky.GroupID, lsky.Name, lsky.Email, lsky.Password, lsky.IsAdminer, lsky.Capacity, lsky.Configs, lsky.ImageNum, lsky.AlbumNum, lsky.RegisteredIp, lsky.EmailVerifiedAt, lsky.CreatedAt, lsky.UpdatedAt)
if success && err == nil {
fmt.Printf("第%d位用户转换成功!\n", k)
log.Printf("第%d位用户转换成功!\n", k)
} else {
errNum++
fmt.Printf("第%d位用户转换失败, 错误信息: %s\n", k, err.Error())
log.Printf("第%d位用户转换失败, 错误信息: %s\n", k, err.Error())
continue
}
}
fmt.Printf("转换完成, 有%d转换失败!\n", errNum)
log.Printf("转换完成, 有%d转换失败!\n", errNum)
} else {
if err != nil {
fmt.Println(err)
log.Println(err)
}
}
// 查询并转换所有相册
if data, err := sql.Db1Dql("SELECT album_id, album_user_id, album_name, COALESCE(album_description, ''), album_image_count, album_date FROM " + prefix1 + "albums WHERE album_user_id IS NOT NULL"); err == nil && startAt == 1 {
fmt.Printf("总计%d个相册, 开始转换\n", len(data))
log.Printf("总计%d个相册, 开始转换\n", len(data))
errNum := 0
for k, v := range data {
var lsky model.LskyAlbums
// 相册ID
lsky.ID, err = strconv.Atoi(v[0])
if err != nil {
fmt.Printf("第%d个相册转换失败, 错误信息: %s\n", k, err.Error())
log.Printf("第%d个相册转换失败, 错误信息: %s\n", k, err.Error())
errNum++
continue
}
Expand All @@ -141,22 +143,22 @@ func changeData(startAt int) {
VALUES
(?,?,?,?,?,?)`, lsky.ID, lsky.UserID, lsky.Name, lsky.Intro, lsky.ImageNum, lsky.CreatedAt)
if success && err == nil {
fmt.Printf("第%d个相册转换成功!\n", k)
log.Printf("第%d个相册转换成功!\n", k)
} else {
errNum++
fmt.Printf("第%d个相册转换失败, 错误信息: %s\n", k, err.Error())
log.Printf("第%d个相册转换失败, 错误信息: %s\n", k, err.Error())
continue
}
}
fmt.Printf("转换完成, 有%d转换失败!\n", errNum)
log.Printf("转换完成, 有%d转换失败!\n", errNum)
} else {
if err != nil {
fmt.Println(err)
log.Println(err)
}
}
// 查询并转换所有的图片
if data, err := sql.Db1Dql("SELECT COALESCE(image_user_id, ''), COALESCE(image_album_id, ''), image_date, image_name, image_original_filename, image_size, image_extension, image_md5, image_width, image_height, image_nsfw, image_uploader_ip FROM " + prefix1 + "images"); err == nil && startAt != 4 {
fmt.Printf("总计%d张图片, 开始转换\n", len(data))
log.Printf("总计%d张图片, 开始转换\n", len(data))
errNum := 0
for k, v := range data {
var lsky model.LskyImages
Expand Down Expand Up @@ -231,122 +233,167 @@ func changeData(startAt int) {
VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, lsky.UserID, lsky.AlbumID, lsky.StrategyID, lsky.Key, lsky.Path, lsky.Name, lsky.OriginName, lsky.Size, lsky.MimeType, lsky.Extension, lsky.Md5, "", lsky.Width, lsky.Height, lsky.IsUnhealthy, lsky.UploadedIP, lsky.CreatedAt, lsky.UpdatedAt)
if success && err == nil {
fmt.Printf("第%d张图片转换成功!\n", k)
log.Printf("第%d张图片转换成功!\n", k)
} else {
errNum++
fmt.Printf("第%d张图片转换失败, 错误信息: %s\n", k, err.Error())
log.Printf("第%d张图片转换失败, 错误信息: %s\n", k, err.Error())
continue
}
}
fmt.Printf("图片转换完成, 有%d转换失败\n", errNum)
log.Printf("图片转换完成, 有%d转换失败\n", errNum)
} else {
if err != nil {
fmt.Println(err)
log.Println(err)
}
}
// 更新策略
{
fmt.Println("开始更新策略")
log.Println("开始更新策略")
config, err := sql.Db2Dql("SELECT configs from " + prefix2 + "strategies WHERE id = 1")
if err != nil || config[0][0] == "" {
fmt.Println("策略更新失败, 错误信息: ", err)
return
log.Fatalln("策略更新失败, 错误信息: ", err)
}
// 解析json
var data map[string]interface{}
err = json.Unmarshal([]byte(config[0][0]), &data)
if err != nil {
fmt.Println("策略更新失败, 错误信息: ", err)
return
log.Fatalln("策略更新失败, 错误信息: ", err)
}
host := data["url"].(string)
pattern := regexp.MustCompile("^http(s)?://.+?/")
host = pattern.FindString(host)
if host == "" {
fmt.Println("策略更新失败, 错误信息: ", "无法找到域名")
return
log.Fatalln("策略更新失败, 错误信息: ", "无法找到域名")
}
targetPath := data["root"].(string)
path := common.GetConfigString("img", "path") + "/public/images"
data["url"] = host + "images"

symErr := os.Symlink(targetPath, path)
if symErr == nil {
fmt.Println("软链接创建成功")
log.Println("软链接创建成功")
} else {
fmt.Println("软链接创建失败, 错误信息: ", symErr)
log.Println("软链接创建失败, 错误信息: ", symErr)
}

// 更新数据库
json, DbErr := json.Marshal(data)
if DbErr != nil {
fmt.Println("数据库更新失败, 错误信息: ", err)
return
log.Fatalln("数据库更新失败, 错误信息: ", err)
}
_, DbErr = sql.Db2Dml("UPDATE "+prefix2+"strategies SET configs = ? WHERE id = 1", json)
if DbErr == nil {
fmt.Println("数据库更新成功")
log.Println("数据库更新成功")
} else {
fmt.Println("数据库更新失败, 错误信息: ", err)
log.Println("数据库更新失败, 错误信息: ", err)
}

if symErr == nil && DbErr == nil {
fmt.Println("策略更新成功")
log.Println("策略更新成功")
return
}
fmt.Println("策略更新部分失败")
log.Println("策略更新部分失败")
}
fmt.Println("转换全部完成!!!")
log.Println("转换全部完成!!!")
}

// 删除多余图片
func deleteMoreImage() {
path, err := os.Readlink(common.GetConfigString("img", "path") + "/public/images")
if err != nil {
fmt.Println("读取文件夹失败, 错误信息: ", err)
return
log.Fatalln("读取文件夹失败, 错误信息: ", err)
}
path += "/"
list := new([]string)
// 获取所有的文件
if common.GetAllFile(path, list) != nil {
fmt.Println("获取文件失败")
log.Println("获取文件失败")
}
re, _ := regexp.Compile(`\.[th|md].*?$`)
re := regexp.MustCompile(`\.[th|md].*?$`)
log.Println("开始删除重复文件")
total := 0
errNUm := 0
// 遍历删除文件夹
for _, v := range *list {
if re.MatchString(v) {
if os.Remove(v) == nil {
fmt.Println("删除" + v)
log.Println("删除" + v)
total++
} else {
errNUm++
log.Printf("第%d个文件删除失败, 错误信息: %s\n", total, err.Error())
}
}
}
// 打印成功
fmt.Printf("已为你删除%d个文件, 删除失败%d个", total, errNUm)
log.Printf("已为你删除%d个文件, 删除失败%d个", total, errNUm)
}

// 修改文件权限
func changePermissions() {
path, err := os.Readlink(common.GetConfigString("img", "path") + "/public/images")
if err != nil {
log.Fatalln("读取文件夹失败, 错误信息: ", err)
}
path += "/"
list := new([]string)
// 获取所有的文件
if common.GetAllFile(path, list) != nil {
log.Println("获取文件失败")
}
log.Println("开始修改文件权限")
total := 0
errNUm := 0
// 遍历删除文件夹
for _, v := range *list {
if os.Chmod(v, fs.FileMode(0755)) == nil {
log.Println("修改" + v)
total++
} else {
errNUm++
log.Printf("第%d个文件修改失败, 错误信息: %s\n", total, err.Error())
}
}
// 打印成功
log.Printf("已为你修改%d个文件的权限, 修改失败%d个", total, errNUm)
}

// 转换函数
func main() {
// 读取配置文件中log的配置
logConfig := common.GetConfigString("log", "path")
var logOutput io.Writer
// 设置日志文件
if logConfig != "" {
logFile, err := os.OpenFile(logConfig, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalln("Error:", err)
}
defer logFile.Close()
logOutput = io.MultiWriter(os.Stdout, logFile)
} else {
logConfig = "不保存日志文件"
logOutput = os.Stdout
}
log.SetOutput(logOutput)
fmt.Println("日志输出配置为: ", logConfig)
var input int
// 是否需要删除重复文件
fmt.Printf("欢迎使用图床转换工具\n请选择操作(1转换数据库 2删除重复文件):")
fmt.Printf("欢迎使用图床转换工具\n请选择操作(1转换数据库 2修改文件权限 3删除重复文件):")
if _, err := fmt.Scan(&input); err == nil && input == 1 {
fmt.Printf("请选择从哪个步骤开始(1从转移用户&相册开始 2从转移用户开始 3从转移图片开始 4从更新策略开始):")
if _, err := fmt.Scan(&input); err == nil && (input == 1 || input == 2 || input == 3 || input == 4) {
changeData(input)
} else {
fmt.Println("输入错误")
log.Fatalln("输入错误")
}
} else if err == nil && input == 2 {
changePermissions()
} else if err == nil && input == 3 {
deleteMoreImage()
} else if err != nil {
fmt.Println(err)
log.Fatalln(err)
} else {
fmt.Println("输入错误")
log.Fatalln("输入错误")
}
}
11 changes: 11 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@

![image](./images/04.png)

---
## 修改文件权限

图床文件转移后, 可能会出现权限问题无法访问图片

我们可以启动应用, 选择 `修改文件权限` 即可批量修改所有图片的权限

也可以手动修改images文件夹内所有文件夹与文件的权限为 `755`

修改完成后即可正常访问所有图片

**至此, 所有的数据迁移工作已经完成**

---
Expand Down

0 comments on commit 78af4c8

Please sign in to comment.