224 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package system
 | |
| 
 | |
| import (
 | |
| 	"net/http"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	db "management/internal/db/sqlc"
 | |
| 	"management/internal/router/manage/util"
 | |
| 	systemservice "management/internal/service/system"
 | |
| 	"management/internal/tpl"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| )
 | |
| 
 | |
| type SysMenuHandler struct{}
 | |
| 
 | |
| func NewSysMenuHandler() *SysMenuHandler {
 | |
| 	return &SysMenuHandler{}
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) Tree(w http.ResponseWriter, r *http.Request) {
 | |
| 	ctx := r.Context()
 | |
| 	vars := r.URL.Query()
 | |
| 	id := util.DefaultInt(vars, "id", 0)
 | |
| 	res, err := systemservice.ToTreeMenu(ctx, id, true)
 | |
| 	if err != nil {
 | |
| 		http.Error(w, err.Error(), http.StatusInternalServerError)
 | |
| 		return
 | |
| 	}
 | |
| 	tpl.JSON(w, res)
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) List(w http.ResponseWriter, r *http.Request) {
 | |
| 	tpl.HTML(w, r, "menu/list.tmpl", nil)
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) PostList(w http.ResponseWriter, r *http.Request) {
 | |
| 	ctx := r.Context()
 | |
| 	res, err := systemservice.ListMenuTree(ctx)
 | |
| 	if err != nil {
 | |
| 		http.Error(w, err.Error(), http.StatusInternalServerError)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	data := tpl.ResponseList{
 | |
| 		Code:    0,
 | |
| 		Message: "ok",
 | |
| 		Count:   0,
 | |
| 		Data:    res,
 | |
| 	}
 | |
| 	tpl.JSON(w, data)
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) Add(w http.ResponseWriter, r *http.Request) {
 | |
| 	tpl.HTML(w, r, "menu/edit.tmpl", map[string]any{
 | |
| 		"Item": &db.SysMenu{Style: "pear-btn-primary pear-btn-sm", Visible: true, Sort: 6666},
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) AddChildren(w http.ResponseWriter, r *http.Request) {
 | |
| 	vars := r.URL.Query()
 | |
| 	parentID := util.DefaultInt(vars, "parentID", 0)
 | |
| 	vm := &db.SysMenu{ParentID: int32(parentID), Style: "pear-btn-primary pear-btn-sm", Visible: true, Sort: 6666}
 | |
| 	ctx := r.Context()
 | |
| 	parent, err := systemservice.GetSysMenu(ctx, int32(parentID))
 | |
| 	if err == nil {
 | |
| 		if parent.Type == "node" {
 | |
| 			vm.Type = "menu"
 | |
| 		} else if parent.Type == "menu" {
 | |
| 			vm.Type = "btn"
 | |
| 		}
 | |
| 	}
 | |
| 	tpl.HTML(w, r, "menu/edit.tmpl", map[string]any{
 | |
| 		"Item": vm,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) Edit(w http.ResponseWriter, r *http.Request) {
 | |
| 	vars := r.URL.Query()
 | |
| 	id := util.DefaultInt(vars, "id", 0)
 | |
| 	vm := &db.SysMenu{Style: "pear-btn-primary pear-btn-sm", Sort: 6666}
 | |
| 	if id > 0 {
 | |
| 		ctx := r.Context()
 | |
| 		vm, _ = systemservice.GetSysMenu(ctx, int32(id))
 | |
| 	}
 | |
| 	tpl.HTML(w, r, "menu/edit.tmpl", map[string]any{
 | |
| 		"Item": vm,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) Save(w http.ResponseWriter, r *http.Request) {
 | |
| 	id := util.ConvertInt(r.PostFormValue("ID"), 0)
 | |
| 	name := r.PostFormValue("Name")
 | |
| 	dispalyName := r.PostFormValue("DisplayName")
 | |
| 	t := r.PostFormValue("Type")
 | |
| 	url := r.PostFormValue("Url")
 | |
| 	if len(url) == 0 {
 | |
| 		url = uuid.Must(uuid.NewRandom()).String()
 | |
| 	}
 | |
| 	avatar := r.PostFormValue("Avatar")
 | |
| 	style := r.PostFormValue("Style")
 | |
| 	parentID := util.ConvertInt(r.PostFormValue("ParentID"), 0)
 | |
| 	visible := util.ConvertBool(r.PostFormValue("Visible"), false)
 | |
| 	isList := util.ConvertBool(r.PostFormValue("IsList"), false)
 | |
| 	sort := util.ConvertInt(r.PostFormValue("Sort"), 6666)
 | |
| 	status := util.ConvertInt(r.PostFormValue("Status"), 9999)
 | |
| 
 | |
| 	ctx := r.Context()
 | |
| 	if len(avatar) > 0 && !strings.Contains(avatar, "layui-icon ") {
 | |
| 		avatar = "layui-icon " + avatar
 | |
| 	}
 | |
| 
 | |
| 	parentPath := ""
 | |
| 	if parentID > 0 {
 | |
| 		parent, err := systemservice.GetSysMenu(ctx, int32(parentID))
 | |
| 		if err != nil {
 | |
| 			tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 			return
 | |
| 		}
 | |
| 		parentPath = parent.ParentPath + "," + strconv.Itoa(parentID) + ","
 | |
| 		parentPath = strings.ReplaceAll(parentPath, ",,", ",")
 | |
| 	}
 | |
| 
 | |
| 	if id == 0 {
 | |
| 		arg := &db.CreateSysMenuParams{
 | |
| 			Name:        name,
 | |
| 			DisplayName: dispalyName,
 | |
| 			Url:         url,
 | |
| 			Type:        t,
 | |
| 			ParentID:    int32(parentID),
 | |
| 			ParentPath:  parentPath,
 | |
| 			Avatar:      avatar,
 | |
| 			Style:       style,
 | |
| 			Visible:     visible,
 | |
| 			IsList:      isList,
 | |
| 			Status:      int32(status),
 | |
| 			Sort:        int32(sort),
 | |
| 			CreatedAt:   time.Now(),
 | |
| 			UpdatedAt:   time.Now(),
 | |
| 		}
 | |
| 		_, err := systemservice.CreateSysMenu(ctx, arg)
 | |
| 		if err != nil {
 | |
| 			if db.IsUniqueViolation(err) {
 | |
| 				tpl.JSON(w, tpl.Response{Success: false, Message: "菜单已存在"})
 | |
| 				return
 | |
| 			}
 | |
| 			tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		tpl.JSON(w, tpl.Response{Success: true, Message: "添加成功"})
 | |
| 	} else {
 | |
| 		res, err := systemservice.GetSysMenu(ctx, int32(id))
 | |
| 		if err != nil {
 | |
| 			tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		arg := &db.UpdateSysMenuParams{
 | |
| 			ID:          res.ID,
 | |
| 			Name:        name,
 | |
| 			DisplayName: dispalyName,
 | |
| 			Url:         url,
 | |
| 			Type:        t,
 | |
| 			ParentID:    int32(parentID),
 | |
| 			ParentPath:  parentPath,
 | |
| 			Avatar:      avatar,
 | |
| 			Style:       style,
 | |
| 			Visible:     visible,
 | |
| 			IsList:      isList,
 | |
| 			Status:      int32(status),
 | |
| 			Sort:        int32(sort),
 | |
| 			UpdatedAt:   time.Now(),
 | |
| 		}
 | |
| 		_, err = systemservice.UpdateSysMenu(ctx, arg)
 | |
| 		if err != nil {
 | |
| 			tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		tpl.JSON(w, tpl.Response{Success: true, Message: "更新成功"})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) UserMenus(w http.ResponseWriter, r *http.Request) {
 | |
| 	// ctx := r.Context()
 | |
| 	// b := session.GetBytes(ctx, auth.StoreName)
 | |
| 	// var u dto.AuthorizeUser
 | |
| 	// if err := json.Unmarshal(b, &u); err != nil {
 | |
| 	// 	http.Error(w, err.Error(), http.StatusInternalServerError)
 | |
| 	// 	return
 | |
| 	// }
 | |
| 	// menus, err := systemservice.RecursiveSysMenus(ctx, u.RoleID)
 | |
| 	// if err != nil {
 | |
| 	// 	tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 	// 	return
 | |
| 	// }
 | |
| 
 | |
| 	tpl.JSON(w, nil)
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) XmSelectTree(w http.ResponseWriter, r *http.Request) {
 | |
| 	ctx := r.Context()
 | |
| 	res, err := systemservice.ToTreeMenu(ctx, 0, false)
 | |
| 	if err != nil {
 | |
| 		http.Error(w, err.Error(), http.StatusInternalServerError)
 | |
| 		return
 | |
| 	}
 | |
| 	tpl.JSON(w, res)
 | |
| }
 | |
| 
 | |
| func (h *SysMenuHandler) Refresh(w http.ResponseWriter, r *http.Request) {
 | |
| 	ctx := r.Context()
 | |
| 	err := systemservice.RefreshMenus(ctx)
 | |
| 	if err != nil {
 | |
| 		tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	tpl.JSON(w, tpl.Response{Success: true, Message: "刷新成功"})
 | |
| }
 |