perm.api 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. syntax = "v1"
  2. info (
  3. title: "Permission System API"
  4. desc: "权限管理系统"
  5. version: "1.0"
  6. )
  7. // ==================== Common ====================
  8. type PageResp {
  9. Total int64 `json:"total"`
  10. List interface{} `json:"list"`
  11. }
  12. // ==================== Auth ====================
  13. type (
  14. CaptchaReq {
  15. Width int `json:"width,optional"`
  16. Height int `json:"height,optional"`
  17. }
  18. CaptchaInfo {
  19. Id string `json:"id"`
  20. Base64Image string `json:"base64image"`
  21. }
  22. CapEndpointResp {
  23. Code int `json:"code"`
  24. Msg string `json:"msg"`
  25. Data string `json:"data"`
  26. }
  27. LoginReq {
  28. Username string `json:"username"`
  29. Password string `json:"password"`
  30. ProductCode string `json:"productCode"`
  31. CaptchaId string `json:"captchaId,optional"`
  32. CaptchaCode string `json:"captchaCode,optional"`
  33. }
  34. LoginByCapReq {
  35. Username string `json:"username"`
  36. Password string `json:"password"`
  37. ProductCode string `json:"productCode"`
  38. CapToken string `json:"capToken"`
  39. }
  40. AdminLoginReq {
  41. Username string `json:"username"`
  42. Password string `json:"password"`
  43. ManagementKey string `json:"managementKey"`
  44. CaptchaId string `json:"captchaId,optional"`
  45. CaptchaCode string `json:"captchaCode,optional"`
  46. }
  47. AdminLoginByCapReq {
  48. Username string `json:"username"`
  49. Password string `json:"password"`
  50. ManagementKey string `json:"managementKey"`
  51. CapToken string `json:"capToken"`
  52. }
  53. LoginResp {
  54. AccessToken string `json:"accessToken"`
  55. RefreshToken string `json:"refreshToken"`
  56. Expires int64 `json:"expires"`
  57. UserInfo UserInfo `json:"userInfo"`
  58. }
  59. UserInfo {
  60. UserId int64 `json:"userId"`
  61. Username string `json:"username"`
  62. Nickname string `json:"nickname"`
  63. Avatar string `json:"avatar"`
  64. Email string `json:"email"`
  65. Phone string `json:"phone"`
  66. IsSuperAdmin int64 `json:"isSuperAdmin"`
  67. MustChangePassword int64 `json:"mustChangePassword"`
  68. MemberType string `json:"memberType"`
  69. Perms []string `json:"perms"`
  70. }
  71. RefreshTokenReq {
  72. Authorization string `header:"Authorization"`
  73. ProductCode string `json:"productCode,optional"`
  74. }
  75. ChangePasswordReq {
  76. OldPassword string `json:"oldPassword"`
  77. NewPassword string `json:"newPassword"`
  78. }
  79. )
  80. // ==================== Product ====================
  81. type (
  82. CreateProductReq {
  83. Code string `json:"code"`
  84. Name string `json:"name"`
  85. Remark string `json:"remark,optional"`
  86. // 审计 L-R10-1:新建 admin_<code> 用户时必须一并指定部门。若不带部门(DeptId=0),新账号
  87. // 在 CheckAddMemberAccess / CreateUser 的 DeptPath 前缀校验下彻底瘫痪,除了改密码外做不了任何管理动作。
  88. AdminDeptId int64 `json:"adminDeptId"`
  89. }
  90. CreateProductResp {
  91. Id int64 `json:"id"`
  92. Code string `json:"code"`
  93. AppKey string `json:"appKey"`
  94. AdminUser string `json:"adminUser"`
  95. // CredentialsTicket 一次性凭证票据。AppSecret 与初始 AdminPassword 不再随本响应明文返回,
  96. // 改为由调用方用该 ticket 调一次 /api/product/fetchInitialCredentials 领取(5 分钟内有效,
  97. // 一次性消费)。审计 M-4:避免密码/密钥经响应体落盘到上游日志/APM。
  98. CredentialsTicket string `json:"credentialsTicket"`
  99. CredentialsExpiresAt int64 `json:"credentialsExpiresAt"`
  100. }
  101. FetchInitialCredentialsReq {
  102. Ticket string `json:"ticket"`
  103. }
  104. FetchInitialCredentialsResp {
  105. AppKey string `json:"appKey"`
  106. AppSecret string `json:"appSecret"`
  107. AdminUser string `json:"adminUser"`
  108. AdminPassword string `json:"adminPassword"`
  109. }
  110. UpdateProductReq {
  111. Id int64 `json:"id"`
  112. Name string `json:"name"`
  113. Remark string `json:"remark,optional"`
  114. Status int64 `json:"status,optional"`
  115. }
  116. ProductListReq {
  117. Page int64 `json:"page,optional"`
  118. PageSize int64 `json:"pageSize,optional"`
  119. }
  120. ProductDetailReq {
  121. Id int64 `json:"id"`
  122. }
  123. ProductItem {
  124. Id int64 `json:"id"`
  125. Code string `json:"code"`
  126. Name string `json:"name"`
  127. AppKey string `json:"appKey"`
  128. Remark string `json:"remark"`
  129. Status int64 `json:"status"`
  130. CreateTime int64 `json:"createTime"`
  131. }
  132. )
  133. // ==================== Perm ====================
  134. type (
  135. PermListReq {
  136. ProductCode string `json:"productCode"`
  137. Page int64 `json:"page,optional"`
  138. PageSize int64 `json:"pageSize,optional"`
  139. }
  140. PermItem {
  141. Id int64 `json:"id"`
  142. ProductCode string `json:"productCode"`
  143. Name string `json:"name"`
  144. Code string `json:"code"`
  145. Remark string `json:"remark"`
  146. Status int64 `json:"status"`
  147. CreateTime int64 `json:"createTime"`
  148. }
  149. SyncPermItem {
  150. Code string `json:"code"`
  151. Name string `json:"name"`
  152. Remark string `json:"remark,optional"`
  153. }
  154. SyncPermsReq {
  155. AppKey string `json:"appKey"`
  156. AppSecret string `json:"appSecret"`
  157. Perms []SyncPermItem `json:"perms"`
  158. }
  159. SyncPermsResp {
  160. Added int64 `json:"added"`
  161. Updated int64 `json:"updated"`
  162. Disabled int64 `json:"disabled"`
  163. }
  164. )
  165. // ==================== Role ====================
  166. type (
  167. CreateRoleReq {
  168. ProductCode string `json:"productCode"`
  169. Name string `json:"name"`
  170. Remark string `json:"remark,optional"`
  171. PermsLevel int64 `json:"permsLevel"`
  172. }
  173. UpdateRoleReq {
  174. Id int64 `json:"id"`
  175. Name string `json:"name"`
  176. Remark string `json:"remark,optional"`
  177. PermsLevel int64 `json:"permsLevel"`
  178. Status int64 `json:"status,optional"`
  179. }
  180. DeleteRoleReq {
  181. Id int64 `json:"id"`
  182. }
  183. RoleListReq {
  184. ProductCode string `json:"productCode"`
  185. Page int64 `json:"page,optional"`
  186. PageSize int64 `json:"pageSize,optional"`
  187. }
  188. RoleDetailReq {
  189. Id int64 `json:"id"`
  190. }
  191. RoleItem {
  192. Id int64 `json:"id"`
  193. ProductCode string `json:"productCode"`
  194. Name string `json:"name"`
  195. Remark string `json:"remark"`
  196. Status int64 `json:"status"`
  197. PermsLevel int64 `json:"permsLevel"`
  198. PermIds []int64 `json:"permIds,omitempty"`
  199. CreateTime int64 `json:"createTime"`
  200. }
  201. BindPermsReq {
  202. RoleId int64 `json:"roleId"`
  203. PermIds []int64 `json:"permIds"`
  204. }
  205. )
  206. // ==================== Dept ====================
  207. type (
  208. CreateDeptReq {
  209. ParentId int64 `json:"parentId"`
  210. Name string `json:"name"`
  211. Sort int64 `json:"sort,optional"`
  212. DeptType string `json:"deptType,optional"`
  213. Remark string `json:"remark,optional"`
  214. }
  215. UpdateDeptReq {
  216. Id int64 `json:"id"`
  217. Name string `json:"name"`
  218. Sort int64 `json:"sort,optional"`
  219. DeptType string `json:"deptType,optional"`
  220. Remark string `json:"remark,optional"`
  221. Status int64 `json:"status,optional"`
  222. }
  223. DeleteDeptReq {
  224. Id int64 `json:"id"`
  225. }
  226. DeptItem {
  227. Id int64 `json:"id"`
  228. ParentId int64 `json:"parentId"`
  229. Name string `json:"name"`
  230. Path string `json:"path"`
  231. Sort int64 `json:"sort"`
  232. DeptType string `json:"deptType"`
  233. Remark string `json:"remark"`
  234. Status int64 `json:"status"`
  235. CreateTime int64 `json:"createTime"`
  236. Children []*DeptItem `json:"children"`
  237. }
  238. )
  239. // ==================== User ====================
  240. type (
  241. CreateUserReq {
  242. Username string `json:"username"`
  243. Password string `json:"password"`
  244. Nickname string `json:"nickname,optional"`
  245. Email string `json:"email,optional"`
  246. Phone string `json:"phone,optional"`
  247. Remark string `json:"remark,optional"`
  248. DeptId int64 `json:"deptId,optional"`
  249. }
  250. UpdateUserReq {
  251. Id int64 `json:"id"`
  252. Nickname *string `json:"nickname,optional"`
  253. Email *string `json:"email,optional"`
  254. Phone *string `json:"phone,optional"`
  255. Remark *string `json:"remark,optional"`
  256. DeptId *int64 `json:"deptId,optional"`
  257. Status int64 `json:"status,optional"`
  258. }
  259. UserListReq {
  260. ProductCode string `json:"productCode,optional"`
  261. Page int64 `json:"page,optional"`
  262. PageSize int64 `json:"pageSize,optional"`
  263. }
  264. UserDetailReq {
  265. Id int64 `json:"id"`
  266. }
  267. UserItem {
  268. Id int64 `json:"id"`
  269. Username string `json:"username"`
  270. Nickname string `json:"nickname"`
  271. Avatar string `json:"avatar"`
  272. Email string `json:"email"`
  273. Phone string `json:"phone"`
  274. Remark string `json:"remark"`
  275. DeptId int64 `json:"deptId"`
  276. Status int64 `json:"status"`
  277. MemberType string `json:"memberType,omitempty"`
  278. RoleIds []int64 `json:"roleIds,omitempty"`
  279. Perms []string `json:"perms,omitempty"`
  280. CreateTime int64 `json:"createTime"`
  281. }
  282. BindRolesReq {
  283. UserId int64 `json:"userId"`
  284. RoleIds []int64 `json:"roleIds"`
  285. }
  286. UserPermItem {
  287. PermId int64 `json:"permId"`
  288. Effect string `json:"effect"`
  289. }
  290. SetPermsReq {
  291. UserId int64 `json:"userId"`
  292. Perms []UserPermItem `json:"perms"`
  293. }
  294. UpdateUserStatusReq {
  295. Id int64 `json:"id"`
  296. Status int64 `json:"status"`
  297. }
  298. )
  299. // ==================== Product Member ====================
  300. type (
  301. AddMemberReq {
  302. ProductCode string `json:"productCode"`
  303. UserId int64 `json:"userId"`
  304. MemberType string `json:"memberType"`
  305. }
  306. // UpdateMemberReq 审计 L-R11-1:memberType / status 改为指针可选,支持"只改状态"或"只改
  307. // 成员类型"的部分更新,避免前端被迫先拉 member.detail 再构造完整字段。两字段都为 nil 时
  308. // logic 会立即 400 "没有可更新的字段"。
  309. UpdateMemberReq {
  310. Id int64 `json:"id"`
  311. MemberType *string `json:"memberType,optional"`
  312. Status *int64 `json:"status,optional"`
  313. }
  314. RemoveMemberReq {
  315. Id int64 `json:"id"`
  316. }
  317. MemberListReq {
  318. ProductCode string `json:"productCode"`
  319. Page int64 `json:"page,optional"`
  320. PageSize int64 `json:"pageSize,optional"`
  321. }
  322. MemberItem {
  323. Id int64 `json:"id"`
  324. ProductCode string `json:"productCode"`
  325. UserId int64 `json:"userId"`
  326. Username string `json:"username"`
  327. Nickname string `json:"nickname"`
  328. MemberType string `json:"memberType"`
  329. Status int64 `json:"status"`
  330. CreateTime int64 `json:"createTime"`
  331. }
  332. )
  333. // ==================== Common Response ====================
  334. type IdResp {
  335. Id int64 `json:"id"`
  336. }
  337. // ==================== Routes ====================
  338. // -------- 公开接口(无需 JWT 鉴权) --------
  339. // 图片验证码与 cap.js 端点,无限流(自带内存 ID 防重)
  340. @server (
  341. prefix: /api
  342. group: pub
  343. )
  344. service perm-api {
  345. // Captcha 获取图片验证码(base64 编码)
  346. @handler Captcha
  347. post /captcha/get (CaptchaReq) returns (CaptchaInfo)
  348. // CapEndpoint 返回 cap.js 服务端点 URL;未配置时返回空串,前端据此决定显示哪种验证方式
  349. @handler CapEndpoint
  350. post /capjs/endpoint returns (CapEndpointResp)
  351. }
  352. // 管理后台登录,需携带 managementKey 凭证,受 IP 维度限流保护
  353. @server (
  354. prefix: /api
  355. group: pub
  356. middleware: AdminLoginRateLimit
  357. )
  358. service perm-api {
  359. // AdminLogin 管理后台登录。仅限超级管理员通过 managementKey + 用户名密码登录管理后台,返回 JWT 令牌对
  360. @handler AdminLogin
  361. post /auth/adminLogin (AdminLoginReq) returns (LoginResp)
  362. // AdminLoginByCap 使用 cap.js 人机验证令牌登录管理后台,验证通过后执行与 AdminLogin 相同的业务逻辑
  363. @handler AdminLoginByCap
  364. post /auth/adminLogin/cap (AdminLoginByCapReq) returns (LoginResp)
  365. }
  366. // 产品端登录,受 IP 维度限流保护
  367. @server (
  368. prefix: /api
  369. group: pub
  370. middleware: ProductLoginRateLimit
  371. )
  372. service perm-api {
  373. // Login 产品端登录。产品成员通过用户名密码 + productCode 登录指定产品,返回 JWT 令牌对及用户权限信息
  374. @handler Login
  375. post /auth/login (LoginReq) returns (LoginResp)
  376. // LoginByCap 使用 cap.js 人机验证令牌登录,验证通过后执行与 Login 相同的业务逻辑
  377. @handler LoginByCap
  378. post /user/login/cap (LoginByCapReq) returns (LoginResp)
  379. }
  380. // 令牌刷新,不需要鉴权中间件,自行验证 refreshToken 有效性;受 IP 维度限流保护,防止签名爆破/CPU 放大 DoS
  381. @server (
  382. prefix: /api
  383. group: pub
  384. middleware: RefreshTokenRateLimit
  385. )
  386. service perm-api {
  387. // RefreshToken 刷新令牌。使用有效的 refreshToken 换取新的 accessToken/refreshToken 令牌对,旧令牌即时失效(单会话轮转)
  388. @handler RefreshToken
  389. post /auth/refreshToken (RefreshTokenReq) returns (LoginResp)
  390. }
  391. // 权限同步,产品服务端通过 appKey/appSecret 认证,受 IP 维度限流保护
  392. @server (
  393. prefix: /api
  394. group: pub
  395. middleware: SyncRateLimit
  396. )
  397. service perm-api {
  398. // SyncPerms 同步权限声明。产品服务端通过 appKey/appSecret 认证后,批量同步权限定义(新增/更新/禁用不在列表中的权限)
  399. @handler SyncPerms
  400. post /perm/sync (SyncPermsReq) returns (SyncPermsResp)
  401. }
  402. // -------- 需要 JWT 鉴权的接口 --------
  403. // 认证相关(修改密码、获取用户信息、注销)
  404. @server (
  405. prefix: /api
  406. group: auth
  407. middleware: JwtAuth
  408. )
  409. service perm-api {
  410. // UserInfo 获取当前登录用户信息。返回当前 JWT 令牌对应用户的个人信息、成员类型和权限列表,用于前端初始化用户状态
  411. @handler UserInfoHandler
  412. post /auth/userInfo returns (UserInfo)
  413. // ChangePassword 修改密码。已登录用户验证原密码后设置新密码,同时递增 tokenVersion 使所有已签发令牌失效
  414. @handler ChangePassword
  415. post /auth/changePassword (ChangePasswordReq)
  416. // Logout 用户注销。递增 tokenVersion 使所有已签发的 access/refresh 令牌立即失效,并清除用户缓存
  417. @handler Logout
  418. post /auth/logout
  419. }
  420. // 产品管理(仅超管可操作)
  421. @server (
  422. prefix: /api/product
  423. group: product
  424. middleware: JwtAuth
  425. )
  426. service perm-api {
  427. // CreateProduct 创建产品。自动生成 appKey/appSecret 和产品专属管理员账号,用于接入新的业务产品。
  428. // 响应不再明文回吐 appSecret / adminPassword,改用 credentialsTicket 一次性领取(审计 M-4)。
  429. @handler CreateProduct
  430. post /create (CreateProductReq) returns (CreateProductResp)
  431. // FetchInitialCredentials 凭 CreateProduct 响应中的 credentialsTicket 一次性领取 appSecret 与
  432. // 初始 adminPassword。Ticket 在 Redis 中短 TTL 保存,一次消费后立即删除;即使响应被日志捕获,
  433. // 落盘的也仅是短期有效且一次性消耗的哨兵 token,而非真正的长期凭证。
  434. @handler FetchInitialCredentials
  435. post /fetchInitialCredentials (FetchInitialCredentialsReq) returns (FetchInitialCredentialsResp)
  436. // UpdateProduct 更新产品信息。可修改名称、备注和启用/禁用状态,禁用后其成员将无法访问
  437. @handler UpdateProduct
  438. post /update (UpdateProductReq)
  439. // ProductList 产品列表。分页查询系统中所有产品的基本信息
  440. @handler ProductList
  441. post /list (ProductListReq) returns (PageResp)
  442. // ProductDetail 产品详情。根据产品 ID 查询完整信息
  443. @handler ProductDetail
  444. post /detail (ProductDetailReq) returns (ProductItem)
  445. }
  446. // 部门管理(仅超管可操作)
  447. @server (
  448. prefix: /api/dept
  449. group: dept
  450. middleware: JwtAuth
  451. )
  452. service perm-api {
  453. // CreateDept 创建部门。在指定父部门下新建子部门,自动继承路径层级
  454. @handler CreateDept
  455. post /create (CreateDeptReq) returns (IdResp)
  456. // UpdateDept 更新部门。修改名称、排序、类型、备注或启用/禁用状态,使用乐观锁防止并发冲突
  457. @handler UpdateDept
  458. post /update (UpdateDeptReq)
  459. // DeleteDept 删除部门。在事务内加行锁后检查是否存在子部门或关联用户,均无则删除
  460. @handler DeleteDept
  461. post /delete (DeleteDeptReq)
  462. // DeptTree 部门树。返回完整的组织架构树形结构,用于前端部门选择器和组织架构展示
  463. @handler DeptTree
  464. post /tree returns ([]*DeptItem)
  465. }
  466. // 权限查询
  467. @server (
  468. prefix: /api/perm
  469. group: perm
  470. middleware: JwtAuth
  471. )
  472. service perm-api {
  473. // PermList 权限列表。按产品分页查询已注册的权限定义,用于角色权限配置和用户权限分配的选择列表
  474. @handler PermList
  475. post /list (PermListReq) returns (PageResp)
  476. }
  477. // 角色管理(需产品 ADMIN 或超管权限)
  478. @server (
  479. prefix: /api/role
  480. group: role
  481. middleware: JwtAuth
  482. )
  483. service perm-api {
  484. // CreateRole 创建角色。在指定产品下新建角色并设置权限级别,产品必须存在且已启用
  485. @handler CreateRole
  486. post /create (CreateRoleReq) returns (IdResp)
  487. // UpdateRole 更新角色。修改名称、备注、权限级别和启用/禁用状态,非超管不能降低权限级别
  488. @handler UpdateRole
  489. post /update (UpdateRoleReq)
  490. // DeleteRole 删除角色。在事务内同时清理角色-权限和用户-角色绑定后删除,并批量清理受影响用户缓存
  491. @handler DeleteRole
  492. post /delete (DeleteRoleReq)
  493. // RoleList 角色列表。按产品分页查询角色信息
  494. @handler RoleList
  495. post /list (RoleListReq) returns (PageResp)
  496. // RoleDetail 角色详情。根据角色 ID 查询完整信息及已绑定的权限 ID 列表
  497. @handler RoleDetail
  498. post /detail (RoleDetailReq) returns (RoleItem)
  499. // BindRolePerms 绑定角色权限。对指定角色做权限全量覆盖(diff 后批量新增/删除)
  500. @handler BindRolePerms
  501. post /bindPerms (BindPermsReq)
  502. }
  503. // 用户管理
  504. @server (
  505. prefix: /api/user
  506. group: user
  507. middleware: JwtAuth
  508. )
  509. service perm-api {
  510. // CreateUser 创建用户。新建系统用户账号,可指定部门归属。仅超管可调用
  511. @handler CreateUser
  512. post /create (CreateUserReq) returns (IdResp)
  513. // UpdateUser 更新用户信息。修改昵称、邮箱、手机、备注、部门归属等
  514. @handler UpdateUser
  515. post /update (UpdateUserReq)
  516. // UserList 用户列表。超管查看全量,产品管理者查看当前产品下的成员列表
  517. @handler UserList
  518. post /list (UserListReq) returns (PageResp)
  519. // UserDetail 用户详情。查询指定用户基本信息和当前产品下的角色绑定
  520. @handler UserDetail
  521. post /detail (UserDetailReq) returns (UserItem)
  522. // BindRoles 绑定用户角色。对指定用户在当前产品下做角色全量覆盖,支持权限级别校验防止越权分配
  523. @handler BindRoles
  524. post /bindRoles (BindRolesReq)
  525. // SetUserPerms 设置用户个性化权限。支持 ALLOW(附加)和 DENY(拒绝)两种效果,用于角色权限之外的细粒度调整
  526. @handler SetUserPerms
  527. post /setPerms (SetPermsReq)
  528. // UpdateUserStatus 冻结/解冻用户。修改启用状态并递增 tokenVersion 使其令牌失效
  529. @handler UpdateUserStatus
  530. post /updateStatus (UpdateUserStatusReq)
  531. }
  532. // 产品成员管理(需产品 ADMIN 或超管权限)
  533. @server (
  534. prefix: /api/member
  535. group: member
  536. middleware: JwtAuth
  537. )
  538. service perm-api {
  539. // AddMember 添加产品成员。将已有用户加入指定产品并设置成员类型(ADMIN/DEVELOPER/MEMBER),产品必须已启用
  540. @handler AddMember
  541. post /add (AddMemberReq) returns (IdResp)
  542. // UpdateMember 更新产品成员。修改成员类型或启用/禁用状态,降级最后一个 ADMIN 时会被拒绝
  543. @handler UpdateMember
  544. post /update (UpdateMemberReq)
  545. // RemoveMember 移除产品成员。同时清理该用户在产品下的角色和个性化权限绑定,不能移除最后一个 ADMIN
  546. @handler RemoveMember
  547. post /remove (RemoveMemberReq)
  548. // MemberList 成员列表。按产品分页查询成员信息,用于产品成员管理页面
  549. @handler MemberList
  550. post /list (MemberListReq) returns (PageResp)
  551. }