go: Recursion Algorithm
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:41 # User : geovindu # Product : GoLand # Project : goalgorithms # File : recursion.go */ package recursion import ( fmt sort ) // 1. 权限常量定义 var PERMISSION map[string]string{ // 门店基础 sale_view: 销售单据查看, sale_create: 开单销售, stock_view: 库存查询, stock_inout: 金饰玉石出入库, member_manage: 会员管理, // 国内分公司财务 finance_stat: 财务报表, cost_allocate: 区域成本分摊, gold_price_edit: 金价调整, // 海外专属权限 custom_declare: 海外报关, foreign_exchange: 外币对账, oversea_tax: 境外税务核算, // 集团顶层 org_mgr: 组织架构编辑, role_global: 全局角色配置, data_export_all: 全集团数据导出, } // 海外权限集合 var OVERSEA_PERM_SET map[string]bool{ custom_declare: true, foreign_exchange: true, oversea_tax: true, } // 2. 角色结构体 type Role struct { RoleID string RoleName string Perms map[string]bool } func NewRole(rid, rname string, perms []string) *Role { p : make(map[string]bool) for _, k : range perms { p[k] true } return Role{ RoleID: rid, RoleName: rname, Perms: p, } } // 3. 组织节点 OrgNode 树形结构 type OrgNode struct { OrgID string OrgName string OrgType string ParentID string IsJoin bool // 是否加盟门店隔离递归 Children []*OrgNode // 子组织 Perms map[string]bool // 本组织自有权限 BindRoles []*Role // 绑定角色 } func NewOrgNode(oid, oname, otype, pid string, isJoin bool) *OrgNode { return OrgNode{ OrgID: oid, OrgName: oname, OrgType: otype, ParentID: pid, IsJoin: isJoin, Perms: make(map[string]bool), } } // 添加子节点 func (o *OrgNode) AddChild(child *OrgNode) { o.Children append(o.Children, child) } // 添加自有权限 func (o *OrgNode) AddPerm(key string) { if _, ok : PERMISSION[key]; ok { o.Perms[key] true } } // 绑定角色 func (o *OrgNode) BindRole(r *Role) { o.BindRoles append(o.BindRoles, r) } // 4. 员工用户 type Staff struct { UID string Name string BindOrgID string RolePerms map[string]bool // 用户直接分配权限 } func NewStaff(uid, name, bindOid string) *Staff { return Staff{ UID: uid, Name: name, BindOrgID: bindOid, RolePerms: make(map[string]bool), } } func (s *Staff) AssignPerm(key string) { if _, ok : PERMISSION[key]; ok { s.RolePerms[key] true } } // 5. 销售订单行级过滤 type SaleOrder struct { OrderID string ShopOrgID string Amount float64 } // 6. 递归工具工具类 type OrgUtil struct{} // 6.1 递归查找节点 func (u *OrgUtil) FindNode(root *OrgNode, targetID string) *OrgNode { if root.OrgID targetID { return root } for _, child : range root.Children { res : u.FindNode(child, targetID) if res ! nil { return res } } return nil } // 6.2 向下递归获取所有下级加盟门店终止递归 func (u *OrgUtil) GetAllSubOrgs(root *OrgNode, targetID string) []*OrgNode { target : u.FindNode(root, targetID) if target nil { return nil } var list []*OrgNode var dfs func(node *OrgNode) dfs func(node *OrgNode) { list append(list, node) if node.IsJoin { return } for _, c : range node.Children { dfs(c) } } dfs(target) return list } // 6.3 向上递归获取整条父级链路 func (u *OrgUtil) GetParentChain(root *OrgNode, targetID string, nodeMap map[string]*OrgNode) []*OrgNode { target : u.FindNode(root, targetID) if target nil || target.ParentID { return nil } var parents []*OrgNode var upRecur func(n *OrgNode) upRecur func(n *OrgNode) { pid : n.ParentID if pid { return } pNode, ok : nodeMap[pid] if ok { parents append(parents, pNode) upRecur(pNode) } } upRecur(target) return parents } // 6.4 扩展1角色递归下发全集团 func (u *OrgUtil) RoleSyncRecursive(node *OrgNode, r *Role) { node.BindRole(r) for _, child : range node.Children { u.RoleSyncRecursive(child, r) } } // 6.5 扩展2销售订单行级递归过滤 func (u *OrgUtil) FilterSaleOrders(root *OrgNode, user *Staff, all []*SaleOrder) []*SaleOrder { subList : u.GetAllSubOrgs(root, user.BindOrgID) allowShop : make(map[string]bool) for _, o : range subList { allowShop[o.OrgID] true } var res []*SaleOrder for _, ord : range all { if allowShop[ord.ShopOrgID] { res append(res, ord) } } return res } // 6.6 核心汇总用户完整权限父级自身下级 海外权限隔离 func (u *OrgUtil) GetUserTotalPerms(root *OrgNode, user *Staff, nodeMap map[string]*OrgNode) map[string]bool { total : make(map[string]bool) // 1. 用户自身角色权限 for k : range user.RolePerms { total[k] true } targetNode : u.FindNode(root, user.BindOrgID) if targetNode nil { return total } // 2. 所有父组织 所有下级组织 parentList : u.GetParentChain(root, user.BindOrgID, nodeMap) subList : u.GetAllSubOrgs(root, user.BindOrgID) allOrgs : append(parentList, subList...) for _, org : range allOrgs { // 复制组织权限 tmpPerm : make(map[string]bool) for k : range org.Perms { tmpPerm[k] true } // 国内组织剔除海外权限 if org.OrgType ! 海外子公司 !containsOversea(org.OrgType) { for k : range OVERSEA_PERM_SET { delete(tmpPerm, k) } } // 合并到总权限 for k : range tmpPerm { total[k] true } } return total } func containsOversea(s string) bool { return len(s) 2 s[:2] 海外 } // 6.7 递归打印组织树 func (u *OrgUtil) PrintTree(node *OrgNode, level int) { indent : for i : 0; i level; i { indent } tag : if node.IsJoin { tag [加盟] } fmt.Printf(%s[%s]%s %s (ID:%s)\n, indent, node.OrgType, tag, node.OrgName, node.OrgID) for _, child : range node.Children { u.PrintTree(child, level1) } } // 6.8 递归回收权限 func (u *OrgUtil) RevokePermRecursive(node *OrgNode, permKey string) { delete(node.Perms, permKey) for _, child : range node.Children { u.RevokePermRecursive(child, permKey) } } // 6.9 扩展5递归导出审计报表 type AuditRow struct { Level int OrgID string OrgType string OrgName string IsJoin bool OwnPermNames []string RoleNames []string } func (u *OrgUtil) ExportReport(node *OrgNode, report *[]AuditRow, level int) { // 权限名称 var ownPerms []string for k : range node.Perms { ownPerms append(ownPerms, PERMISSION[k]) } sort.Strings(ownPerms) // 角色名称 var roles []string for _, r : range node.BindRoles { roles append(roles, r.RoleName) } row : AuditRow{ Level: level, OrgID: node.OrgID, OrgType: node.OrgType, OrgName: node.OrgName, IsJoin: node.IsJoin, OwnPermNames: ownPerms, RoleNames: roles, } *report append(*report, row) if node.IsJoin { return } for _, child : range node.Children { u.ExportReport(child, report, level1) } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:42 # User : geovindu # Product : GoLand # Project : goalgorithms # File : recursionbll.go */ package bll import ( fmt goalgorithms/recursion sort ) // 构建珠宝集团完整组织树 func buildGroup() (*recursion.OrgNode, map[string]*recursion.OrgNode) { root : recursion.NewOrgNode(G001, 璀璨珠宝集团总部, 集团总部, , false) root.AddPerm(org_mgr) root.AddPerm(role_global) root.AddPerm(data_export_all) root.AddPerm(gold_price_edit) // 国内事业部 domestic : recursion.NewOrgNode(D001, 国内运营事业部, 事业部, G001, false) domestic.AddPerm(finance_stat) domestic.AddPerm(cost_allocate) root.AddChild(domestic) // 华南分公司 huanan : recursion.NewOrgNode(D001-1, 华南分公司, 国内分公司, D001, false) huanan.AddPerm(stock_inout) domestic.AddChild(huanan) szShop : recursion.NewOrgNode(SH-SZ01, 深圳旗舰店, 线下门店, D001-1, false) szShop.AddPerm(sale_view) szShop.AddPerm(sale_create) huanan.AddChild(szShop) joinShop : recursion.NewOrgNode(SH-J001, 东莞加盟门店, 加盟门店, D001-1, true) joinShop.AddPerm(sale_view) huanan.AddChild(joinShop) // 华东分公司 huadong : recursion.NewOrgNode(D001-2, 华东分公司, 国内分公司, D001, false) shShop : recursion.NewOrgNode(SH-SH01, 上海总店, 线下门店, D001-2, false) shShop.AddPerm(sale_create) huadong.AddChild(shShop) domestic.AddChild(huadong) // 海外事业部 oversea : recursion.NewOrgNode(O001, 海外国际事业部, 事业部, G001, false) oversea.AddPerm(foreign_exchange) root.AddChild(oversea) sgCompany : recursion.NewOrgNode(O001-1, 新加坡子公司, 海外子公司, O001, false) sgCompany.AddPerm(custom_declare) sgShop : recursion.NewOrgNode(SH-SG01, 新加坡乌节路门店, 海外门店, O001-1, false) sgShop.AddPerm(sale_view) sgCompany.AddChild(sgShop) oversea.AddChild(sgCompany) usCompany : recursion.NewOrgNode(O001-2, 洛杉矶子公司, 海外子公司, O001, false) usCompany.AddPerm(oversea_tax) usShop : recursion.NewOrgNode(SH-US01, 洛杉矶门店, 海外门店, O001-2, false) usShop.AddPerm(sale_view) usCompany.AddChild(usShop) oversea.AddChild(usCompany) // 构建ID映射表 nodeMap : make(map[string]*recursion.OrgNode) var collect func(n *recursion.OrgNode) collect func(n *recursion.OrgNode) { nodeMap[n.OrgID] n for _, c : range n.Children { collect(c) } } collect(root) return root, nodeMap } func RecursionMain() { root, nodeMap : buildGroup() util : recursion.OrgUtil{} fmt.Println( 1. 完整组织树含加盟门店标记 ) util.PrintTree(root, 0) // 扩展1角色递归下发全集团 globalSaleRole : recursion.NewRole(R001, 集团通用销售角色, []string{sale_view, stock_view}) util.RoleSyncRecursive(root, globalSaleRole) fmt.Println(\n 【扩展1】角色递归下发完成全集团绑定销售角色 ) // 模拟订单 allOrders : []*recursion.SaleOrder{ {OD001, SH-SZ01, 12800}, {OD002, SH-J001, 6500}, {OD003, SH-SH01, 23000}, {OD004, SH-SG01, 9600}, } // 华南管理员 southAdmin : recursion.NewStaff(U2001, 华南运营总监, D001-1) // 扩展2行级过滤订单 fmt.Println(\n 【扩展2】华南管理员行级过滤后的销售订单 ) filterOrd : util.FilterSaleOrders(root, southAdmin, allOrders) for _, o : range filterOrd { fmt.Printf(订单%s 门店ID:%s 金额:%.0f\n, o.OrderID, o.ShopOrgID, o.Amount) } // 扩展3/4权限汇总国内屏蔽海外权限 fmt.Println(\n 【扩展3/4】华南管理员权限无海外报关/外币权限 ) southPerm : util.GetUserTotalPerms(root, southAdmin, nodeMap) var southList []string for k : range southPerm { southList append(southList, recursion.PERMISSION[k]) } sort.Strings(southList) for _, name : range southList { fmt.Printf(- %s\n, name) } // 新加坡海外管理员 sgAdmin : recursion.NewStaff(U3001, 新加坡负责人, O001-1) fmt.Println(\n 海外子公司管理员权限包含海外专属权限 ) sgPerm : util.GetUserTotalPerms(root, sgAdmin, nodeMap) var sgList []string for k : range sgPerm { sgList append(sgList, recursion.PERMISSION[k]) } sort.Strings(sgList) for _, name : range sgList { fmt.Printf(- %s\n, name) } // 扩展5递归导出审计报表 fmt.Println(\n 【扩展5】递归导出集团审计权限报表 ) var report []recursion.AuditRow util.ExportReport(root, report, 0) for _, row : range report { indent : for i : 0; i row.Level; i { indent } joinTag : if row.IsJoin { joinTag 【加盟】 } fmt.Printf(%s%s%s | 自有权限:%v | 绑定角色:%v\n, indent, joinTag, row.OrgName, row.OwnPermNames, row.RoleNames) } }输出

相关新闻

系统规划与管理师-服务运营提升核心知识点与应试指南

系统规划与管理师-服务运营提升核心知识点与应试指南

一、引言服务运营提升是软考高级系统规划与管理师考试中信息系统服务管理模块的核心内容,对应考试大纲第 12 章第三部分,历年分值占比 8-10 分,考核形式包含客观选择题和主观案例分析题,是考生需重点掌握的核心考点。 从管理理论发…

2026/7/17 0:50:30 阅读更多 →
Claude批量预处理全链路优化:JSON Schema校验+异步队列+结果归一化(含GitHub开源模板)

Claude批量预处理全链路优化:JSON Schema校验+异步队列+结果归一化(含GitHub开源模板)

更多请点击: https://intelliparadigm.com 第一章:Claude批量预处理全链路优化概述 在大规模文本生成与分析场景中,Claude模型的批量预处理环节常成为性能瓶颈。本章聚焦于从原始数据接入、格式标准化、上下文分片、提示工程注入到批量化推…

2026/7/17 0:50:30 阅读更多 →
前端工程师转AI Agent开发工程师:收藏这份完整学习路线,小白也能快速入门!

前端工程师转AI Agent开发工程师:收藏这份完整学习路线,小白也能快速入门!

本文为前端工程师提供了从入门到精通AI Agent开发的完整学习路线。核心内容包括理解LLM、RAG、Agent等核心概念,掌握Python及后端开发能力,学习AI工程化的关键技能如Prompt Engineering、Tool Calling、Memory等,并利用LangChain、LangGraph等…

2026/7/17 0:44:26 阅读更多 →

最新新闻

Python滑雪闯关游戏源码包:含图片音效字体资源,键盘控制,一键运行

Python滑雪闯关游戏源码包:含图片音效字体资源,键盘控制,一键运行

本文还有配套的精品资源,点击获取 简介:直接运行Game4.py就能玩的滑雪闯关小游戏,用左右方向键控制角色在雪道上滑行,避开石头、树木等障碍物。项目自带全部资源:images文件夹里有角色、障碍物、背景等PNG图片&…

2026/7/17 1:44:50 阅读更多 →
WSL 2高效开发环境搭建与性能优化指南

WSL 2高效开发环境搭建与性能优化指南

1. WSL核心价值与适用场景解析Windows Subsystem for Linux(WSL)彻底改变了Windows与Linux的交互方式。作为在Windows 10/11上原生运行Linux二进制可执行文件的兼容层,它既不是虚拟机也不是模拟器,而是通过系统调用转换技术实现的…

2026/7/17 1:42:50 阅读更多 →
Wireshark网络抓包实战:从核心原理到故障排查的完整指南

Wireshark网络抓包实战:从核心原理到故障排查的完整指南

1. 项目概述:从“看热闹”到“看门道”的网络诊断利器如果你在IT运维、网络安全或者软件开发领域摸爬滚打过,那你一定绕不开一个名字:Wireshark。它不像那些需要复杂配置的企业级监控平台,更像是一把瑞士军刀,直接、锋…

2026/7/17 1:40:46 阅读更多 →
TIMER中断模式实现高精度秒定时技术详解

TIMER中断模式实现高精度秒定时技术详解

1. TIMER中断模式秒中断定时的核心价值在嵌入式系统开发中,精确的定时控制是基础且关键的需求。TIMER模块的中断模式能够实现高精度的周期性事件触发,特别适合需要严格时间基准的应用场景。比如工业控制中的传感器采样、消费电子中的按键消抖、通信协议中…

2026/7/17 1:40:46 阅读更多 →
智能车牌识别系统技术解析与执法应用

智能车牌识别系统技术解析与执法应用

1. 项目背景:智能车牌识别技术的执法革新最近在多个城市的交通执法现场,一种被称为"扫牌"的智能识别设备引发广泛关注。这套系统能在3秒内完成车牌识别、车辆信息核验和违章行为判定,将传统人工查车效率提升近百倍。作为参与过多个…

2026/7/17 1:38:46 阅读更多 →
用友U8+数据库连接失败排查与解决方案

用友U8+数据库连接失败排查与解决方案

1. 问题现象与初步诊断当用友U8客户端出现"连接数据库服务器失败及不知道这样的主机"错误时,通常表现为以下几种具体形态:客户端登录时弹出错误对话框,显示完整错误信息系统日志中记录连接超时或主机不可达事件应用服务器监控显示数…

2026/7/17 1:36:45 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻