###goframe已有了模板的功能
{{"string"}} // 一般 string
{{`raw string`}} // 原始 string
{{'c'}} // byte
{{print nil}} // nil 也被支持
{{. | FuncA | FuncB | FuncC}}
{{if .condition}}
...
{{else}}
{{if .condition2}}
...
{{end}}
{{end}}
{{range $key, $value := .MapContent}}
{{$key}}:{{$value}}
{{end}}
{{include "模板文件名(需要带完整文件名后缀)" .}}
{{/*
comment content
support new line
*/}}
删除空白符号
删除移除空格换行符
# 使用{{-语法去除模板内容左侧的所有空白符号, 使用-}}去除模板内容右侧的所有空白符号。
# 注意:-要紧挨{{和}},同时与模板值之间需要使用空格分隔。
{{- .Name -}}
{{- range $key, $value := .list}}
"{{$value}}"
{{- end}}
模版的选择
在https://sc.chinaz.com/moban/找到喜欢的模板
前台模版:https://sc.chinaz.com/mobandemo.aspx?downloadid=19202411041264
后台模版:https://sc.chinaz.com/mobandemo.aspx?downloadid=1202491158443
本文是为了开发传统的界面,以利于SEO,而不是开发vue react,进行完全的前后端分离。
将静态文放到其需的地方。
在resource 的template存放到相关的目录,front 前端, admin 后台。
在开发过程中发现前端过于繁杂,又换了一个,大家以后可以去下载。
路由及controller的开发
在api/admin中加入login.go,来定义一下API接口定义,包含请求/响应结构体
// 定义包名为 admin,表示这是管理后台相关的 API
package admin
import (
"context" // 用于处理上下文
"github.com/gogf/gf/v2/frame/g" // GoFrame 框架的核心包
)
// LoginReq 登录请求结构体
type LoginReq struct {
// g.Meta 是 GoFrame 的路由元数据,使用结构体标签定义路由信息
g.Meta `path:"/login" // 路由路径为 /login
tags:"Hello" // Swagger 文档标签
method:"get" // HTTP 请求方法为 GET
summary:"You first hello api"` // API 描述
}
// LoginRes 登录响应结构体
type LoginRes struct {
// 可以在这里添加需要返回的字段
// 例如:
// Token string `json:"token" dc:"登录令牌"`
// UserInfo map[string]interface{} `json:"userInfo" dc:"用户信息"`
}
// LogoutReq 登出请求结构体
type LogoutReq struct {
g.Meta `path:"/logout" // 路由路径为 /logout
tags:"Hello" // Swagger 文档标签
method:"post" // HTTP 请求方法为 POST
summary:"Admin logout api"` // API 描述
}
// LogoutRes 登出响应结构体
type LogoutRes struct {
// 可以在这里添加需要返回的字段
// 例如:
// Message string `json:"message" dc:"退出信息"`
}
// ILogin 定义登录模块的接口
type ILogin interface {
// Login 处理登录请求
// ctx: 上下文,用于处理请求的整个生命周期
// req: 登录请求参数
// 返回值:
// - res: 登录响应
// - err: 错误信息
Login(ctx context.Context, req *LoginReq) (res *LoginRes, err error)
// Logout 处理登出请求
// ctx: 上下文
// req: 登出请求参数
// 返回值:
// - res: 登出响应
// - err: 错误信息
Logout(ctx context.Context, req *LogoutReq) (res *LogoutRes, err error)
}
以上代码为了注解修改了格式不能直接使用
package admin
import (
"context"
"github.com/gogf/gf/v2/frame/g"
)
type LoginReq struct {
g.Meta `path:"/login" tags:"Hello" method:"get" summary:"You first hello api"`
}
type LoginRes struct {
}
type LogoutReq struct {
g.Meta `path:"/logout" tags:"Hello" method:"post" summary:"Admin logout api"`
}
type LogoutRes struct {
}
type ILogin interface {
Login(ctx context.Context, req *LoginReq) (res *LoginRes, err error)
Logout(ctx context.Context, req *LogoutReq) (res *LogoutRes, err error)
}
的internal 中的admin加入一个controller ,如下代码
// Package admin 提供后台管理相关的控制器
// Package admin 提供后台管理相关的控制器
package admin
import (
"context"
"web/api/admin"
"github.com/gogf/gf/v2/frame/g"
)
// 实现登录控制器
type Controller struct{}
// New 创建一个新的登录控制器实例
func New() admin.ILogin {
return &Controller{}
}
// Login 处理管理员登录请求
// ctx: 上下文
// req: 登录请求参数
// 返回登录响应和可能的错误
func (c *Controller) Login(ctx context.Context, req *admin.LoginReq) (res *admin.LoginRes, err error) {
g.RequestFromCtx(ctx).Response.Writeln("Login !")
return
}
func (c *Controller) Logout(ctx context.Context, req *admin.LogoutReq) (res *admin.LogoutRes, err error) {
g.RequestFromCtx(ctx).Response.Writeln("Logout success!")
return
}
在入口文件cmd.go注册路由
package cmd
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gsession"
"web/internal/controller/admin"
)
var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server() // 创建服务器实例
// 配置管理后台路由组
s.Group("/admin", func(group *ghttp.RouterGroup) {
// 注册响应处理中间件
group.Middleware(ghttp.MiddlewareHandlerResponse)
// 绑定后台控制器
group.Bind(
admin.New(), // 注册管理后台控制器
)
})
s.Run() // 启动服务器
return nil
},
}
)
运行可以看到效果!!!