mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
Add classification annotations
This commit is contained in:
280
server/admin.go
280
server/admin.go
@@ -1,138 +1,142 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
adminctl "networkDev/controllers/admin"
|
||||
"networkDev/utils"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// RegisterAdminRoutes 注册管理员后台相关路由
|
||||
// - /admin/login: 支持GET渲染登录页、POST提交登录
|
||||
// - /admin/logout: 管理员退出登录
|
||||
// - /admin/dashboard: 管理员仪表盘(示例)
|
||||
// - /admin/fragment/*: 布局内动态片段加载
|
||||
// - /admin/api/settings*: 设置接口(查询/更新)
|
||||
func RegisterAdminRoutes(router *gin.Engine) {
|
||||
// /admin 根与前缀统一入口:根据是否登录跳转
|
||||
router.GET("/admin", adminctl.AdminIndexHandler)
|
||||
router.GET("/admin/", adminctl.AdminIndexHandler)
|
||||
|
||||
// Admin 认证相关路由
|
||||
router.GET("/admin/login", adminctl.LoginPageHandler)
|
||||
router.POST("/admin/login", adminctl.LoginHandler) // CSRF验证在控制器内部处理
|
||||
|
||||
// 退出登录(无需拦截,幂等清理)
|
||||
router.POST("/admin/logout", adminctl.LogoutHandler)
|
||||
|
||||
// 验证码生成路由(无需认证)
|
||||
router.GET("/admin/captcha", adminctl.CaptchaHandler)
|
||||
|
||||
// CSRF令牌获取API(无需认证,但需要在登录页面等地方获取)
|
||||
router.GET("/admin/api/csrf-token", func(c *gin.Context) {
|
||||
// 生成新的CSRF令牌
|
||||
token, err := utils.GenerateCSRFToken()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"success": false, "message": "生成CSRF令牌失败"})
|
||||
return
|
||||
}
|
||||
|
||||
// 设置令牌到Cookie和响应头
|
||||
utils.SetCSRFToken(c, token)
|
||||
|
||||
// 返回令牌给前端
|
||||
c.JSON(200, gin.H{
|
||||
"success": true,
|
||||
"message": "CSRF令牌生成成功",
|
||||
"csrf_token": token,
|
||||
})
|
||||
})
|
||||
|
||||
// 后台布局页(需要管理员认证)
|
||||
router.GET("/admin/layout", adminctl.AdminAuthRequired(), adminctl.AdminLayoutHandler)
|
||||
|
||||
// 片段路由(需要管理员认证)
|
||||
router.GET("/admin/dashboard", adminctl.AdminAuthRequired(), adminctl.DashboardFragmentHandler)
|
||||
router.GET("/admin/user", adminctl.AdminAuthRequired(), adminctl.UserFragmentHandler)
|
||||
router.GET("/admin/settings", adminctl.AdminAuthRequired(), adminctl.SettingsFragmentHandler)
|
||||
router.GET("/admin/apps", adminctl.AdminAuthRequired(), adminctl.AppsFragmentHandler)
|
||||
router.GET("/admin/apis", adminctl.AdminAuthRequired(), adminctl.APIFragmentHandler)
|
||||
router.GET("/admin/variables", adminctl.AdminAuthRequired(), adminctl.VariableFragmentHandler)
|
||||
router.GET("/admin/functions", adminctl.AdminAuthRequired(), adminctl.FunctionFragmentHandler)
|
||||
|
||||
// 系统信息API(用于仪表盘定时刷新)
|
||||
router.GET("/admin/api/system/info", adminctl.AdminAuthRequired(), adminctl.SystemInfoHandler)
|
||||
|
||||
// 仪表盘统计数据API
|
||||
router.GET("/admin/api/dashboard/stats", adminctl.AdminAuthRequired(), adminctl.DashboardStatsHandler)
|
||||
|
||||
// 个人资料API
|
||||
userGroup := router.Group("/admin/api/user", adminctl.AdminAuthRequired())
|
||||
{
|
||||
userGroup.GET("/profile", adminctl.UserProfileQueryHandler)
|
||||
userGroup.POST("/profile/update", adminctl.UserProfileUpdateHandler)
|
||||
userGroup.POST("/password", adminctl.UserPasswordUpdateHandler)
|
||||
}
|
||||
|
||||
// 系统设置API
|
||||
settingsGroup := router.Group("/admin/api/settings", adminctl.AdminAuthRequired())
|
||||
{
|
||||
settingsGroup.GET("", adminctl.SettingsQueryHandler)
|
||||
settingsGroup.POST("/update", adminctl.SettingsUpdateHandler)
|
||||
}
|
||||
|
||||
// 应用管理API
|
||||
appsGroup := router.Group("/admin/api/apps", adminctl.AdminAuthRequired())
|
||||
{
|
||||
appsGroup.GET("/list", adminctl.AppsListHandler)
|
||||
appsGroup.GET("/simple", adminctl.AppsSimpleListHandler)
|
||||
appsGroup.POST("/create", adminctl.AppCreateHandler)
|
||||
appsGroup.POST("/update", adminctl.AppUpdateHandler)
|
||||
appsGroup.POST("/delete", adminctl.AppDeleteHandler)
|
||||
appsGroup.POST("/batch_delete", adminctl.AppsBatchDeleteHandler)
|
||||
appsGroup.POST("/batch_update_status", adminctl.AppsBatchUpdateStatusHandler)
|
||||
appsGroup.POST("/update_status", adminctl.AppUpdateStatusHandler)
|
||||
appsGroup.POST("/reset_secret", adminctl.AppResetSecretHandler)
|
||||
appsGroup.GET("/get_app_data", adminctl.AppGetAppDataHandler)
|
||||
appsGroup.POST("/update_app_data", adminctl.AppUpdateAppDataHandler)
|
||||
appsGroup.GET("/get_announcement", adminctl.AppGetAnnouncementHandler)
|
||||
appsGroup.POST("/update_announcement", adminctl.AppUpdateAnnouncementHandler)
|
||||
appsGroup.GET("/get_multi_config", adminctl.AppGetMultiConfigHandler)
|
||||
appsGroup.POST("/update_multi_config", adminctl.AppUpdateMultiConfigHandler)
|
||||
appsGroup.GET("/get_bind_config", adminctl.AppGetBindConfigHandler)
|
||||
appsGroup.POST("/update_bind_config", adminctl.AppUpdateBindConfigHandler)
|
||||
appsGroup.GET("/get_register_config", adminctl.AppGetRegisterConfigHandler)
|
||||
appsGroup.POST("/update_register_config", adminctl.AppUpdateRegisterConfigHandler)
|
||||
}
|
||||
|
||||
// API接口管理API
|
||||
apisGroup := router.Group("/admin/api/apis", adminctl.AdminAuthRequired())
|
||||
{
|
||||
apisGroup.GET("/list", adminctl.APIListHandler)
|
||||
apisGroup.POST("/update", adminctl.APIUpdateHandler)
|
||||
apisGroup.POST("/update_status", adminctl.APIUpdateStatusHandler)
|
||||
apisGroup.GET("/types", adminctl.APIGetTypesHandler)
|
||||
apisGroup.POST("/generate_keys", adminctl.APIGenerateKeysHandler)
|
||||
}
|
||||
|
||||
// 变量管理API
|
||||
variableGroup := router.Group("/admin/variable", adminctl.AdminAuthRequired())
|
||||
{
|
||||
variableGroup.GET("/list", adminctl.VariableListHandler)
|
||||
variableGroup.POST("/create", adminctl.VariableCreateHandler)
|
||||
variableGroup.POST("/update", adminctl.VariableUpdateHandler)
|
||||
variableGroup.POST("/delete", adminctl.VariableDeleteHandler)
|
||||
variableGroup.POST("/batch_delete", adminctl.VariablesBatchDeleteHandler)
|
||||
}
|
||||
|
||||
// 函数管理API
|
||||
functionGroup := router.Group("/admin/function", adminctl.AdminAuthRequired())
|
||||
{
|
||||
functionGroup.GET("/list", adminctl.FunctionListHandler)
|
||||
functionGroup.POST("/create", adminctl.FunctionCreateHandler)
|
||||
functionGroup.POST("/update", adminctl.FunctionUpdateHandler)
|
||||
functionGroup.POST("/delete", adminctl.FunctionDeleteHandler)
|
||||
functionGroup.POST("/batch_delete", adminctl.FunctionsBatchDeleteHandler)
|
||||
}
|
||||
|
||||
}
|
||||
package server
|
||||
|
||||
import (
|
||||
adminctl "networkDev/controllers/admin"
|
||||
"networkDev/utils"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// 路由注册函数
|
||||
// ============================================================================
|
||||
|
||||
// RegisterAdminRoutes 注册管理员后台相关路由
|
||||
// - /admin/login: 支持GET渲染登录页、POST提交登录
|
||||
// - /admin/logout: 管理员退出登录
|
||||
// - /admin/dashboard: 管理员仪表盘(示例)
|
||||
// - /admin/fragment/*: 布局内动态片段加载
|
||||
// - /admin/api/settings*: 设置接口(查询/更新)
|
||||
func RegisterAdminRoutes(router *gin.Engine) {
|
||||
// /admin 根与前缀统一入口:根据是否登录跳转
|
||||
router.GET("/admin", adminctl.AdminIndexHandler)
|
||||
router.GET("/admin/", adminctl.AdminIndexHandler)
|
||||
|
||||
// Admin 认证相关路由
|
||||
router.GET("/admin/login", adminctl.LoginPageHandler)
|
||||
router.POST("/admin/login", adminctl.LoginHandler) // CSRF验证在控制器内部处理
|
||||
|
||||
// 退出登录(无需拦截,幂等清理)
|
||||
router.POST("/admin/logout", adminctl.LogoutHandler)
|
||||
|
||||
// 验证码生成路由(无需认证)
|
||||
router.GET("/admin/captcha", adminctl.CaptchaHandler)
|
||||
|
||||
// CSRF令牌获取API(无需认证,但需要在登录页面等地方获取)
|
||||
router.GET("/admin/api/csrf-token", func(c *gin.Context) {
|
||||
// 生成新的CSRF令牌
|
||||
token, err := utils.GenerateCSRFToken()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"success": false, "message": "生成CSRF令牌失败"})
|
||||
return
|
||||
}
|
||||
|
||||
// 设置令牌到Cookie和响应头
|
||||
utils.SetCSRFToken(c, token)
|
||||
|
||||
// 返回令牌给前端
|
||||
c.JSON(200, gin.H{
|
||||
"success": true,
|
||||
"message": "CSRF令牌生成成功",
|
||||
"csrf_token": token,
|
||||
})
|
||||
})
|
||||
|
||||
// 后台布局页(需要管理员认证)
|
||||
router.GET("/admin/layout", adminctl.AdminAuthRequired(), adminctl.AdminLayoutHandler)
|
||||
|
||||
// 片段路由(需要管理员认证)
|
||||
router.GET("/admin/dashboard", adminctl.AdminAuthRequired(), adminctl.DashboardFragmentHandler)
|
||||
router.GET("/admin/user", adminctl.AdminAuthRequired(), adminctl.UserFragmentHandler)
|
||||
router.GET("/admin/settings", adminctl.AdminAuthRequired(), adminctl.SettingsFragmentHandler)
|
||||
router.GET("/admin/apps", adminctl.AdminAuthRequired(), adminctl.AppsFragmentHandler)
|
||||
router.GET("/admin/apis", adminctl.AdminAuthRequired(), adminctl.APIFragmentHandler)
|
||||
router.GET("/admin/variables", adminctl.AdminAuthRequired(), adminctl.VariableFragmentHandler)
|
||||
router.GET("/admin/functions", adminctl.AdminAuthRequired(), adminctl.FunctionFragmentHandler)
|
||||
|
||||
// 系统信息API(用于仪表盘定时刷新)
|
||||
router.GET("/admin/api/system/info", adminctl.AdminAuthRequired(), adminctl.SystemInfoHandler)
|
||||
|
||||
// 仪表盘统计数据API
|
||||
router.GET("/admin/api/dashboard/stats", adminctl.AdminAuthRequired(), adminctl.DashboardStatsHandler)
|
||||
|
||||
// 个人资料API
|
||||
userGroup := router.Group("/admin/api/user", adminctl.AdminAuthRequired())
|
||||
{
|
||||
userGroup.GET("/profile", adminctl.UserProfileQueryHandler)
|
||||
userGroup.POST("/profile/update", adminctl.UserProfileUpdateHandler)
|
||||
userGroup.POST("/password", adminctl.UserPasswordUpdateHandler)
|
||||
}
|
||||
|
||||
// 系统设置API
|
||||
settingsGroup := router.Group("/admin/api/settings", adminctl.AdminAuthRequired())
|
||||
{
|
||||
settingsGroup.GET("", adminctl.SettingsQueryHandler)
|
||||
settingsGroup.POST("/update", adminctl.SettingsUpdateHandler)
|
||||
}
|
||||
|
||||
// 应用管理API
|
||||
appsGroup := router.Group("/admin/api/apps", adminctl.AdminAuthRequired())
|
||||
{
|
||||
appsGroup.GET("/list", adminctl.AppsListHandler)
|
||||
appsGroup.GET("/simple", adminctl.AppsSimpleListHandler)
|
||||
appsGroup.POST("/create", adminctl.AppCreateHandler)
|
||||
appsGroup.POST("/update", adminctl.AppUpdateHandler)
|
||||
appsGroup.POST("/delete", adminctl.AppDeleteHandler)
|
||||
appsGroup.POST("/batch_delete", adminctl.AppsBatchDeleteHandler)
|
||||
appsGroup.POST("/batch_update_status", adminctl.AppsBatchUpdateStatusHandler)
|
||||
appsGroup.POST("/update_status", adminctl.AppUpdateStatusHandler)
|
||||
appsGroup.POST("/reset_secret", adminctl.AppResetSecretHandler)
|
||||
appsGroup.GET("/get_app_data", adminctl.AppGetAppDataHandler)
|
||||
appsGroup.POST("/update_app_data", adminctl.AppUpdateAppDataHandler)
|
||||
appsGroup.GET("/get_announcement", adminctl.AppGetAnnouncementHandler)
|
||||
appsGroup.POST("/update_announcement", adminctl.AppUpdateAnnouncementHandler)
|
||||
appsGroup.GET("/get_multi_config", adminctl.AppGetMultiConfigHandler)
|
||||
appsGroup.POST("/update_multi_config", adminctl.AppUpdateMultiConfigHandler)
|
||||
appsGroup.GET("/get_bind_config", adminctl.AppGetBindConfigHandler)
|
||||
appsGroup.POST("/update_bind_config", adminctl.AppUpdateBindConfigHandler)
|
||||
appsGroup.GET("/get_register_config", adminctl.AppGetRegisterConfigHandler)
|
||||
appsGroup.POST("/update_register_config", adminctl.AppUpdateRegisterConfigHandler)
|
||||
}
|
||||
|
||||
// API接口管理API
|
||||
apisGroup := router.Group("/admin/api/apis", adminctl.AdminAuthRequired())
|
||||
{
|
||||
apisGroup.GET("/list", adminctl.APIListHandler)
|
||||
apisGroup.POST("/update", adminctl.APIUpdateHandler)
|
||||
apisGroup.POST("/update_status", adminctl.APIUpdateStatusHandler)
|
||||
apisGroup.GET("/types", adminctl.APIGetTypesHandler)
|
||||
apisGroup.POST("/generate_keys", adminctl.APIGenerateKeysHandler)
|
||||
}
|
||||
|
||||
// 变量管理API
|
||||
variableGroup := router.Group("/admin/variable", adminctl.AdminAuthRequired())
|
||||
{
|
||||
variableGroup.GET("/list", adminctl.VariableListHandler)
|
||||
variableGroup.POST("/create", adminctl.VariableCreateHandler)
|
||||
variableGroup.POST("/update", adminctl.VariableUpdateHandler)
|
||||
variableGroup.POST("/delete", adminctl.VariableDeleteHandler)
|
||||
variableGroup.POST("/batch_delete", adminctl.VariablesBatchDeleteHandler)
|
||||
}
|
||||
|
||||
// 函数管理API
|
||||
functionGroup := router.Group("/admin/function", adminctl.AdminAuthRequired())
|
||||
{
|
||||
functionGroup.GET("/list", adminctl.FunctionListHandler)
|
||||
functionGroup.POST("/create", adminctl.FunctionCreateHandler)
|
||||
functionGroup.POST("/update", adminctl.FunctionUpdateHandler)
|
||||
functionGroup.POST("/delete", adminctl.FunctionDeleteHandler)
|
||||
functionGroup.POST("/batch_delete", adminctl.FunctionsBatchDeleteHandler)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"networkDev/controllers/home"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// RegisterHomeRoutes 注册主页路由
|
||||
// 只包含根路径,用于主页功能
|
||||
func RegisterHomeRoutes(router *gin.Engine) {
|
||||
// 根路径 - 主页
|
||||
router.GET("/", home.RootHandler)
|
||||
}
|
||||
package server
|
||||
|
||||
import (
|
||||
"networkDev/controllers/home"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// 路由注册函数
|
||||
// ============================================================================
|
||||
|
||||
// RegisterHomeRoutes 注册主页路由
|
||||
// 只包含根路径,用于主页功能
|
||||
func RegisterHomeRoutes(router *gin.Engine) {
|
||||
// 根路径 - 主页
|
||||
router.GET("/", home.RootHandler)
|
||||
}
|
||||
|
||||
104
server/routes.go
104
server/routes.go
@@ -1,48 +1,56 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"networkDev/web"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// RegisterRoutes 聚合注册所有路由
|
||||
func RegisterRoutes(router *gin.Engine) {
|
||||
registerStaticRoutes(router)
|
||||
registerFaviconRoute(router)
|
||||
RegisterHomeRoutes(router)
|
||||
RegisterAdminRoutes(router)
|
||||
|
||||
}
|
||||
|
||||
// registerStaticRoutes 注册静态资源路由
|
||||
// 静态资源服务,将 /static/ 和 /assets/ 映射到嵌入的文件系统
|
||||
func registerStaticRoutes(router *gin.Engine) {
|
||||
if fsys, err := web.GetStaticFS(); err == nil {
|
||||
// 为 /static/ 路径创建子文件系统
|
||||
if staticSubFS, staticErr := fs.Sub(fsys, "static"); staticErr == nil {
|
||||
router.StaticFS("/static", http.FS(staticSubFS))
|
||||
} else {
|
||||
log.Printf("创建静态资源子文件系统失败: %v", staticErr)
|
||||
}
|
||||
// 为 /assets/ 路径创建子文件系统
|
||||
if assetsSubFS, assetsErr := fs.Sub(fsys, "assets"); assetsErr == nil {
|
||||
router.StaticFS("/assets", http.FS(assetsSubFS))
|
||||
} else {
|
||||
log.Printf("创建资产资源子文件系统失败: %v", assetsErr)
|
||||
}
|
||||
} else {
|
||||
log.Printf("初始化静态资源文件系统失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// registerFaviconRoute 注册favicon路由
|
||||
func registerFaviconRoute(router *gin.Engine) {
|
||||
// 将 /favicon.ico 重定向到 /assets/favicon.svg
|
||||
router.GET("/favicon.ico", func(c *gin.Context) {
|
||||
c.Redirect(http.StatusMovedPermanently, "/assets/favicon.svg")
|
||||
})
|
||||
}
|
||||
package server
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"networkDev/web"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// 公共函数
|
||||
// ============================================================================
|
||||
|
||||
// RegisterRoutes 聚合注册所有路由
|
||||
func RegisterRoutes(router *gin.Engine) {
|
||||
registerStaticRoutes(router)
|
||||
registerFaviconRoute(router)
|
||||
RegisterHomeRoutes(router)
|
||||
RegisterAdminRoutes(router)
|
||||
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 私有函数
|
||||
// ============================================================================
|
||||
|
||||
// registerStaticRoutes 注册静态资源路由
|
||||
// 静态资源服务,将 /static/ 和 /assets/ 映射到嵌入的文件系统
|
||||
func registerStaticRoutes(router *gin.Engine) {
|
||||
if fsys, err := web.GetStaticFS(); err == nil {
|
||||
// 为 /static/ 路径创建子文件系统
|
||||
if staticSubFS, staticErr := fs.Sub(fsys, "static"); staticErr == nil {
|
||||
router.StaticFS("/static", http.FS(staticSubFS))
|
||||
} else {
|
||||
log.Printf("创建静态资源子文件系统失败: %v", staticErr)
|
||||
}
|
||||
// 为 /assets/ 路径创建子文件系统
|
||||
if assetsSubFS, assetsErr := fs.Sub(fsys, "assets"); assetsErr == nil {
|
||||
router.StaticFS("/assets", http.FS(assetsSubFS))
|
||||
} else {
|
||||
log.Printf("创建资产资源子文件系统失败: %v", assetsErr)
|
||||
}
|
||||
} else {
|
||||
log.Printf("初始化静态资源文件系统失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// registerFaviconRoute 注册favicon路由
|
||||
func registerFaviconRoute(router *gin.Engine) {
|
||||
// 将 /favicon.ico 重定向到 /assets/favicon.svg
|
||||
router.GET("/favicon.ico", func(c *gin.Context) {
|
||||
c.Redirect(http.StatusMovedPermanently, "/assets/favicon.svg")
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user