tree_util.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package utils
  2. import (
  3. "container/list"
  4. "fmt"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  6. "github.com/xormplus/xorm"
  7. )
  8. // 树形结构
  9. func TreeSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]*models.TreeNode, error) {
  10. stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname)
  11. result, err := engine.SqlTemplateClient(stplkey, &paramMap).Query().List()
  12. if err != nil {
  13. fmt.Println(err)
  14. return nil, err
  15. }
  16. return BuildTree("", result)
  17. }
  18. func BuildTree(root string, treeSrcs []map[string]interface{}) ([]*models.TreeNode, error) {
  19. rootArr := []*models.TreeNode{}
  20. paramsArr := treeSrcs
  21. valueFiled := "id"
  22. parentField := "parent"
  23. textFiled := "name"
  24. parentValue := root
  25. treeNodeList := list.New()
  26. originNodeList := list.New()
  27. // 区分root节点和子节点数组
  28. for _, params := range paramsArr {
  29. value := toString(params[valueFiled], "")
  30. parent := toString(params[parentField], "")
  31. text := toString(params[textFiled], "")
  32. //json,_ := xorm.JSONString(params, true)
  33. // 如果根节点root为空,则从parent为空中获取root节点数组
  34. // 如果root不为空,则获取id等于的节点为root节点数组
  35. if (parentValue == "" && parent == "") || value == parentValue {
  36. node := &models.TreeNode{
  37. Id: value,
  38. Text: text,
  39. Parent: parent,
  40. Tag: params,
  41. }
  42. treeNodeList.PushBack(node)
  43. rootArr = append(rootArr, node)
  44. } else {
  45. originNodeList.PushBack(&models.TreeNode{
  46. Id: value,
  47. Text: text,
  48. Parent: parent,
  49. Tag: params,
  50. })
  51. }
  52. }
  53. // 把子节点根据parent分配到对应的父节点上
  54. for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
  55. treeNode := ele.Value.(*models.TreeNode)
  56. originEle := originNodeList.Front()
  57. if originEle == nil {
  58. break
  59. }
  60. for originEle != nil {
  61. originNextEle := originEle.Next()
  62. originNode := originEle.Value.(*models.TreeNode)
  63. if originNode.Parent == treeNode.Id {
  64. treeNodeList.InsertAfter(originNode, ele)
  65. treeNode.Nodes = append(treeNode.Nodes, originNode)
  66. originNodeList.Remove(originEle)
  67. }
  68. originEle = originNextEle
  69. }
  70. }
  71. return rootArr, nil
  72. }
  73. func toString(v interface{}, defaultValue string) string {
  74. if v == nil {
  75. return defaultValue
  76. }
  77. strv, flag := v.(string)
  78. if !flag {
  79. return defaultValue
  80. } else {
  81. return strv
  82. }
  83. }