From 04425d719a40d384ded03f5a9ad9c4d6694f60d1 Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Mon, 22 Jun 2026 12:01:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=81=A2=E5=A4=8D=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=8E=A5=E5=8F=A3=E6=9D=83=E9=99=90=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=B9=B6=E8=A1=A5=E5=85=85=E5=9B=BD=E9=99=85=E5=87=BA?= =?UTF-8?q?=E6=B8=AF/=E8=BF=9B=E6=B8=AF=E6=9D=83=E9=99=90=E5=AF=B9?= =?UTF-8?q?=E7=85=A7=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 恢复 HomeFragment 左侧主菜单/右侧二级菜单的 auths 权限过滤, 右侧改用集合精确匹配避免子串误判(AppIntExpAssemble 是 AppIntExpAssembleAllocate 的子串),并对过滤后空列表做 first() 保护 - 关闭开发调试开关 DEV_AUTO_SELECT_MENU / DEV_AUTO_LOGIN - 新增国际出港/进港二级入口与英文权限串对照表(交后端做角色绑定) Co-Authored-By: Claude Opus 4.8 (1M context) --- .../aerologic/ui/fragment/HomeFragment.kt | 39 ++++++++++-------- .../lukouguoji/module_base/LoginActivity.kt | 2 +- 国际出港进港权限对照表.xlsx | Bin 0 -> 8654 bytes 3 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 国际出港进港权限对照表.xlsx diff --git a/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt index 92c5fc4..e4763d3 100644 --- a/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt @@ -54,7 +54,7 @@ class HomeFragment : Fragment() { * TODO: 正式发布前务必设置为 false */ companion object { - private const val DEV_AUTO_SELECT_MENU = true // 开发调试:自动选择菜单开关,正式发布前设为 false + private const val DEV_AUTO_SELECT_MENU = false // 开发调试:自动选择菜单开关,正式发布前设为 false private const val DEV_AUTO_SELECT_MENU_ID = Constant.AuthName.IntImp // 自动选择的目标菜单 } @@ -76,7 +76,11 @@ class HomeFragment : Fragment() { val leftMenuList = initLeftMenuData() rvLeft.adapter = HomeLeftAdapt(leftMenuList) - rvRight.adapter = HomeRightAdapt(getRightMenu4Id(leftMenuList.first().id)) + // 权限过滤后列表可能为空(账号无任何菜单权限),避免 first() 抛异常 + val firstMenuId = leftMenuList.firstOrNull()?.id + rvRight.adapter = HomeRightAdapt( + if (firstMenuId != null) getRightMenu4Id(firstMenuId) else emptyList() + ) // ========== 开发调试:自动选择指定菜单 ========== autoSelectMenuForDev() @@ -198,7 +202,7 @@ class HomeFragment : Fragment() { inner class LeftMenu(val id: String, val img: Int, val text: String) fun initLeftMenuData(): List { - var list = arrayListOf() + val list = arrayListOf() list.add(LeftMenu(Constant.AuthName.DomExp, R.mipmap.gncn_icon, "国内出港")) list.add(LeftMenu(Constant.AuthName.DomImp, R.mipmap.gnjg, "国内进港")) list.add(LeftMenu(Constant.AuthName.IntExp, R.mipmap.gjcn_icon, "国际出港")) @@ -210,15 +214,15 @@ class HomeFragment : Fragment() { list.add(LeftMenu(Constant.AuthName.Comprehensive, R.mipmap.zhgl_icon, "综合管理")) /** - * 左侧菜单 权限过滤 - * TODO: 暂时关闭权限筛选,方便开发调试 + * 左侧菜单 权限过滤:仅保留接口下发、且含有二级权限的主菜单 + * auths 结构:{ 主菜单ID: [二级权限串, ...], ... } */ -// getAuthsObj()?.let { -// val authsFilter = list.filter { m -> -// it.getJSONArray(m.id) != null && it.getJSONArray(m.id).size > 0 -// } -// list = authsFilter as ArrayList -// } + getAuthsObj()?.let { authsObj -> + return list.filter { m -> + val arr = authsObj.getJSONArray(m.id) + arr != null && arr.size > 0 + } + } return list } @@ -980,13 +984,14 @@ class HomeFragment : Fragment() { } /** - * 右侧菜单 权限过滤 + * 右侧菜单 权限过滤:仅保留当前主菜单下、接口下发的二级入口 + * 使用集合精确匹配,避免子串误判(如 AppIntExpAssemble 是 AppIntExpAssembleAllocate 的子串) */ - // TODO: 暂时关闭权限筛选 -// val authsFilter = list.filter { m -> -// SharedPreferenceUtil.getString(Constant.Share.authList).contains(m.id) -// } -// list = authsFilter as ArrayList + getAuthsObj()?.let { authsObj -> + val authArr = authsObj.getJSONArray(id) + val authSet = authArr?.map { it.toString() }?.toSet() ?: emptySet() + return list.filter { m -> authSet.contains(m.id) } + } return list } diff --git a/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt b/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt index 1d4de5d..4ce3927 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt @@ -39,7 +39,7 @@ import me.jessyan.autosize.internal.CustomAdapt * ========== 开发调试开关 ========== * TODO: 正式发布前务必设置为 false */ -private const val DEV_AUTO_LOGIN = true // 自动登录开关 +private const val DEV_AUTO_LOGIN = false // 自动登录开关 @Route(path = ARouterConstants.ACTIVITY_URL_LOGIN) class LoginActivity : BaseActivity(), diff --git a/国际出港进港权限对照表.xlsx b/国际出港进港权限对照表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e5d0c1ce194cbbf6d3ed4431ba3af23708ea774a GIT binary patch literal 8654 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 Nz{s