feat: 恢复首页菜单接口权限过滤并补充国际出港/进港权限对照表

- 恢复 HomeFragment 左侧主菜单/右侧二级菜单的 auths 权限过滤,
  右侧改用集合精确匹配避免子串误判(AppIntExpAssemble 是
  AppIntExpAssembleAllocate 的子串),并对过滤后空列表做 first() 保护
- 关闭开发调试开关 DEV_AUTO_SELECT_MENU / DEV_AUTO_LOGIN
- 新增国际出港/进港二级入口与英文权限串对照表(交后端做角色绑定)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 12:01:13 +08:00
parent d937ecef77
commit 04425d719a
3 changed files with 23 additions and 18 deletions

View File

@@ -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<LeftMenu> {
var list = arrayListOf<LeftMenu>()
val list = arrayListOf<LeftMenu>()
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<LeftMenu>
// }
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<RightMenu>
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
}

View File

@@ -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(),

Binary file not shown.