diff --git a/internal/handler/webui/upload.go b/internal/handler/webui/upload.go index 80c3897..f63afa6 100644 --- a/internal/handler/webui/upload.go +++ b/internal/handler/webui/upload.go @@ -1,16 +1,12 @@ package webui import ( - "encoding/csv" "honoka-chan/internal/middleware" unitmodel "honoka-chan/internal/model/unit" usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/utils" "honoka-chan/pkg/db" "net/http" - "os" - "path" "strconv" "strings" "time" @@ -24,52 +20,57 @@ type ErrMsg struct { } func upload(ctx *gin.Context) { - file, err := ctx.FormFile("file") - utils.CheckErr(err) - - tmpPath := path.Join("./temp", file.Filename) - err = ctx.SaveUploadedFile(file, tmpPath) - utils.CheckErr(err) + content := strings.TrimSpace(ctx.PostForm("content")) + if content == "" { + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "请输入导入内容!"}) + return + } session := db.UserEng.NewSession() defer session.Close() - if err = session.Begin(); err != nil { + if err := session.Begin(); err != nil { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: err.Error()}) return } - f, err := os.Open(tmpPath) - if err != nil { - session.Rollback() - ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件创建失败!"}) - return - } - defer f.Close() + lines := strings.Split(content, "\n") + for _, rawLine := range lines { + line := strings.TrimSpace(rawLine) + if line == "" { + continue + } + line = strings.ReplaceAll(line, ",", ",") - r := csv.NewReader(f) - rs, err := r.ReadAll() - if err != nil { - session.Rollback() - ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"}) - return - } - for _, rr := range rs { - if len(rr) != 2 || rr[0] == "" || rr[1] == "" { + parts := strings.Split(line, ",") + if len(parts) != 2 { session.Rollback() - ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"}) + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文本解析失败,请检查每行格式是否为 卡片ID,技能等级"}) return } - skLv, err := strconv.Atoi(rr[1]) + unitNumber := strings.TrimSpace(parts[0]) + skillLevelRaw := strings.TrimSpace(parts[1]) + if unitNumber == "" || skillLevelRaw == "" { + session.Rollback() + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文本解析失败,请检查每行格式是否为 卡片ID,技能等级"}) + return + } + + skLv, err := strconv.Atoi(skillLevelRaw) if err != nil { session.Rollback() - ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"}) + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文本解析失败,请检查每行格式是否为 卡片ID,技能等级"}) return } uData := unitmodel.CommonUnitData{} - exists, err := session.Table(new(unitmodel.CommonUnitData)).Where("unit_number = ?", rr[0]).Get(&uData) + exists, err := session.Table(new(unitmodel.CommonUnitData)).Where("unit_number = ?", unitNumber).Get(&uData) + if err != nil { + session.Rollback() + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片查询失败!"}) + return + } if !exists { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片不存在!"}) @@ -102,12 +103,12 @@ func upload(ctx *gin.Context) { ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片添加失败!"}) return } + } - if err = session.Commit(); err != nil { - session.Rollback() - ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片添加失败!"}) - return - } + if err := session.Commit(); err != nil { + session.Rollback() + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片添加失败!"}) + return } ctx.JSON(http.StatusOK, ErrMsg{Error: 0, Msg: "导入成功,请重新打开游戏!"}) diff --git a/static/templates/admin/upload.html b/static/templates/admin/upload.html index 0c60c9c..5188ffb 100644 --- a/static/templates/admin/upload.html +++ b/static/templates/admin/upload.html @@ -23,9 +23,10 @@
- +
- +
@@ -39,8 +40,8 @@
  • LLSIF 查卡器 查询需要导入的卡片 ID,卡片信息上的 No.xxx 数字。
  • -
  • 使用任意文本编辑器创建一个 .txt 文件,按照卡片 ID,技能等级的格式(例如 SDS 果,技能 8 级则填入 - 3885,8)填入需要导入的卡片,每张卡片单独一行。
  • +
  • 在输入框中按卡片 ID,技能等级的格式(例如 SDS 果,技能 8 级则填入 + 3885,8)填写需要导入的卡片,每张卡片单独一行。
  • 分隔符逗号为半角 , 而非全角 ,
  • 仅需要设置技能等级,卡片默认等级MAX,宝石请在游戏内设置。
  • 仅支持导入UR卡片。
  • @@ -63,20 +64,19 @@