feat(admin): 添加用户编辑及多文件上传功能

- 新增用户编辑页面及路由支持 GET /user/edit 和 POST /user/doEdit
- 实现多文件上传接口,支持上传两个头像文件并保存
- 完善单文件上传接口,增加目录创建及错误处理
- 增加首页设置和获取 cookie 功能,支持 cookie 删除接口
- 修改路由配置,新增删除 cookie 路由 /deletecookie
- 新增用户编辑页面模板,示范多文件上传表单布局
This commit is contained in:
2026-02-25 15:57:02 +08:00
parent a81fbb724e
commit 4229a59d89
5 changed files with 89 additions and 1 deletions

View File

@@ -24,29 +24,70 @@ func (con UserController) Show(c *gin.Context) {
} }
func (con UserController) DoUpload(c *gin.Context) { func (con UserController) DoUpload(c *gin.Context) {
// 获取表单中的用户名
username := c.PostForm("username") username := c.PostForm("username")
// 获取上传的文件
file, err := c.FormFile("face") file, err := c.FormFile("face")
if err != nil { if err != nil {
c.JSON(400, gin.H{"error": "获取文件失败: " + err.Error()}) c.JSON(400, gin.H{"error": "获取文件失败: " + err.Error()})
return return
} }
// 创建上传目录
uploadDir := "./upload" uploadDir := "./upload"
if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil { if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil {
c.JSON(500, gin.H{"error": "创建目录失败: " + err.Error()}) c.JSON(500, gin.H{"error": "创建目录失败: " + err.Error()})
return return
} }
// 构建目标文件路径并保存文件
dst := filepath.Join(uploadDir, file.Filename) dst := filepath.Join(uploadDir, file.Filename)
if err := c.SaveUploadedFile(file, dst); err != nil { if err := c.SaveUploadedFile(file, dst); err != nil {
c.JSON(500, gin.H{"error": "保存文件失败: " + err.Error()}) c.JSON(500, gin.H{"error": "保存文件失败: " + err.Error()})
return return
} }
// 返回成功响应
c.JSON(200, gin.H{ c.JSON(200, gin.H{
"success": true, "success": true,
"username": username, "username": username,
"dst": dst, "dst": dst,
}) })
} }
func (con UserController) DoEdit(c *gin.Context) {
username := c.PostForm("username")
file1, err := c.FormFile("face1")
if err != nil {
c.JSON(400, gin.H{"error": "获取文件失败: " + err.Error()})
return
}
uploadDir := "./upload"
dst := filepath.Join(uploadDir, file1.Filename)
if err := c.SaveUploadedFile(file1, dst); err != nil {
c.JSON(500, gin.H{"error": "保存文件失败: " + err.Error()})
return
}
file2, err := c.FormFile("face2")
if err != nil {
c.JSON(400, gin.H{"error": "获取文件失败: " + err.Error()})
return
}
dst1 := filepath.Join(uploadDir, file2.Filename)
if err := c.SaveUploadedFile(file2, dst1); err != nil {
c.JSON(500, gin.H{"error": "保存文件失败: " + err.Error()})
return
}
c.JSON(200, gin.H{
"success": true,
"username": username,
"dst": dst,
"dst1": dst1,
})
}
func (con UserController) Edit(c *gin.Context) {
c.HTML(200, "admin/useredit", gin.H{})
}

View File

@@ -14,13 +14,31 @@ type DefaultController struct {
func (con DefaultController) Index(c *gin.Context) { func (con DefaultController) Index(c *gin.Context) {
fmt.Println(model.UnixToTime(1629788418)) fmt.Println(model.UnixToTime(1629788418))
//设置cookie
c.SetCookie("username", "张三", 3600, "/", "", false, false)
c.HTML(200, "pages/index", gin.H{ c.HTML(200, "pages/index", gin.H{
"title": "首页", "title": "首页",
"t": 1629788418, "t": 1629788418,
}) })
} }
func (con DefaultController) Article(c *gin.Context) { func (con DefaultController) Article(c *gin.Context) {
c.String(200, "文章详情") //获取cookie
username, err := c.Cookie("username")
if err != nil {
c.String(200, "获取cookie失败")
return
}
c.String(200, "cookie="+username)
}
func (con DefaultController) DeleteCookie(c *gin.Context) {
c.SetCookie("username", "张三", -1, "/", "", false, false)
_, err := c.Cookie("username")
if err != nil {
c.String(200, "删除cookie成功")
return
}
} }
// Success 使用继承的方式调用BaseController的success方法 // Success 使用继承的方式调用BaseController的success方法

View File

@@ -24,6 +24,10 @@ func AdminRouterInit(r *gin.Engine) {
adminRouter.POST("/user/doUpload", admin.UserController{}.DoUpload) adminRouter.POST("/user/doUpload", admin.UserController{}.DoUpload)
adminRouter.GET("/user/edit", admin.UserController{}.Edit)
adminRouter.POST("/user/doEdit", admin.UserController{}.DoEdit)
adminRouter.GET("/user/:id", admin.UserController{}.Show) adminRouter.GET("/user/:id", admin.UserController{}.Show)
} }
} }

View File

@@ -12,6 +12,7 @@ func DefaultRouterInit(r *gin.Engine) {
{ {
defaultRouter.GET("", nannanwu.DefaultController{}.Index) defaultRouter.GET("", nannanwu.DefaultController{}.Index)
defaultRouter.GET("/article", nannanwu.DefaultController{}.Article) defaultRouter.GET("/article", nannanwu.DefaultController{}.Article)
defaultRouter.GET("/deletecookie", nannanwu.DefaultController{}.DeleteCookie)
defaultRouter.GET("/success", nannanwu.DefaultController{}.Success) defaultRouter.GET("/success", nannanwu.DefaultController{}.Success)
defaultRouter.GET("/error", nannanwu.DefaultController{}.Error) defaultRouter.GET("/error", nannanwu.DefaultController{}.Error)
} }

View File

@@ -0,0 +1,24 @@
{{ define "admin/useredit" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>演示多文件上传</h1>
<form action="/admin/user/doEdit" method="post" enctype="multipart/form-data">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" placeholder="用户名">
<br>
<label for="face">头 像1</label>
<input type="file" id="face" name="face1">
<br>
<label for="face2">头 像2</label>
<input type="file" id="face2" name="face2">
<br>
<input type="submit" value="上传">
</form>
</body>
</html>
{{ end }}