Bläddra i källkod

代码中存在的问题;后端兑换码、优惠券、登录、退款权限

zoujiajian 9 timmar sedan
förälder
incheckning
5f64ab3680
63 ändrade filer med 9012 tillägg och 106 borttagningar
  1. 17 0
      docs/admin-login-protection.md
  2. 35 0
      docs/admin-review-progress.md
  3. 7562 0
      docs/admin-route-inventory.json
  4. 24 0
      docs/balance-refund-reliability.md
  5. 43 0
      docs/exchange-code-security.md
  6. 10 0
      docs/fastjson-upgrade.md
  7. 174 0
      docs/frontend-security-integration.md
  8. 50 0
      docs/login-audit.md
  9. 20 0
      docs/refund-permissions.md
  10. 23 0
      docs/security-priority-review.md
  11. 19 0
      docs/sql/20261021-admin-login-guard.sql
  12. 10 0
      docs/sql/20261021-balance-idempotency.sql
  13. 77 0
      docs/sql/20261021-coupon-exchange-permissions.sql
  14. 32 0
      docs/sql/20261021-login-audit.sql
  15. 15 0
      docs/sql/20261021-merchant-permissions.sql
  16. 8 0
      docs/sql/20261021-refund-intent.sql
  17. 15 0
      docs/sql/20261021-refund-permissions.sql
  18. 2 0
      netflix-common/src/main/resources/fastjson.properties
  19. 9 0
      netflix-dao/src/main/java/com/cyksj/mapper/LoginAuditMapper.java
  20. 25 0
      netflix-dao/src/main/java/com/cyksj/model/entity/LoginAudit.java
  21. 1 1
      netflix-dao/src/main/java/com/cyksj/model/excel/ExcelExchangeCodeData.java
  22. 9 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserBalanceReq.java
  23. 14 0
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  24. 11 3
      netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java
  25. 2 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  26. 22 0
      netflix-service/src/main/java/com/cyksj/service/order/RefundIntentService.java
  27. 21 0
      netflix-service/src/main/java/com/cyksj/service/order/RefundRequestNumber.java
  28. 9 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java
  29. 19 0
      netflix-service/src/main/java/com/cyksj/service/user/LoginAuditWriter.java
  30. 15 0
      netflix-web/pom.xml
  31. 3 1
      netflix-web/src/main/java/com/cyksj/Application.java
  32. 67 0
      netflix-web/src/main/java/com/cyksj/aspect/LoginAttemptAspect.java
  33. 24 0
      netflix-web/src/main/java/com/cyksj/aspect/LoginAuditListener.java
  34. 95 0
      netflix-web/src/main/java/com/cyksj/aspect/LoginAuditRecorder.java
  35. 32 0
      netflix-web/src/main/java/com/cyksj/aspect/RefundAuthorizationAspect.java
  36. 0 9
      netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java
  37. 53 0
      netflix-web/src/main/java/com/cyksj/security/AdminLoginGuard.java
  38. 14 0
      netflix-web/src/main/java/com/cyksj/security/AdminRedirectPolicy.java
  39. 27 0
      netflix-web/src/main/java/com/cyksj/security/BalanceIdempotency.java
  40. 22 1
      netflix-web/src/main/java/com/cyksj/web/controller/external/ExternalController.java
  41. 19 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java
  42. 16 6
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  43. 16 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  44. 46 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/LoginAuditController.java
  45. 4 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/SpecialPayManageController.java
  46. 5 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/AccountTempController.java
  47. 51 25
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java
  48. 7 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java
  49. 7 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsRoleController.java
  50. 12 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/interceptor/StpInterfaceImpl.java
  51. 9 16
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java
  52. 40 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java
  53. 41 16
      netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java
  54. 8 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonWholeSaleController.java
  55. 9 4
      netflix-web/src/main/java/com/cyksj/web/controller/manage/invoice/UserInvoiceController.java
  56. 5 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopController.java
  57. 9 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java
  58. 41 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java
  59. 5 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/spotify/SpotifyUpgradeController.java
  60. 5 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/vip/CmsVipController.java
  61. 16 1
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java
  62. 4 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java
  63. 7 0
      pom.xml

+ 17 - 0
docs/admin-login-protection.md

@@ -0,0 +1,17 @@
+# 后台登录防爆破
+
+- 现有后台账户密码或短信验证码验证累计失败 5 次,持久锁定,并将账户 status 置为 0;没有自动解锁时间。
+- /manage/user/login、/manage/admin/login 和两者的 /get/loginInfo 共用对应账户计数;换 IP、重启服务不清除。
+- 正确密码预检查不清零;通过完整短信验证或微信认证才清零。短信未获取、缺失、过期及不匹配均计失败。
+- 微信登录也检查锁定状态;普通后台启用账号、重置密码不能绕过独立锁表。
+- 触发锁定后注销当前后台登录域同 ID 会话。旧 admin 与 cms_user 复用该域是现有设计,同 ID 会话可能同时被注销。
+- 不存在的账号没有计数记录。本补丁是账户维度防护,不能替代网关 IP/速率限制;恶意者知道手机号时可以故意触发锁定,需要人工恢复。
+
+## 上线
+先执行 docs/sql/20261021-admin-login-guard.sql,再发布后端。缺表时登录拒绝,不降级放行。
+开发核实身份及失败日志后,在数据库事务内同时清除该账号锁表记录的锁定标志/计数,以及恢复账户 status。示例 SQL 在脚本末尾(默认注释),无 HTTP 解锁接口。
+
+## 验收
+使用专用测试账号:错误密码4次仍未锁,第5次锁定;正确密码/短信/微信不能再登录;重启与换IP不解锁;界面启用和改密码不解除独立锁;开发 SQL 解锁后正常登录。并发失败应累计无丢失。
+新增 AdminLoginGuardTest 验证锁定提交不回滚、锁定后正确凭据不能解锁、密码预检查不清零。
+本地编译尝试仍遇到腾讯云依赖未缓存,尚未完成编译和自动测试,不代表测试通过;未部署或执行数据库脚本。

+ 35 - 0
docs/admin-review-progress.md

@@ -0,0 +1,35 @@
+# 管理后台 review 进度(2026-10-21)
+
+## 范围与证据
+后台候选HTTP方法清单:docs/admin-route-inventory.json,共945项。脚本工具仅基于源文件/注解邻域识别,包含需人工确认项;UNREVIEWED不等于有漏洞,注解存在也不等于已审计。
+重跑:`python tools/admin-review/inventory.py`。
+
+## 本轮明确修复
+- 先前补丁两处 CmsUserMapper 包路径写错,修正为 com.cyksj.mapper.manage.cms.CmsUserMapper。此前未编译通过,不能声称原补丁可直接发布。
+- 后台微信回调不再接受任意Base64 state;改为随机UUID、Redis服务端保存跳转地址、5分钟有效、setNx一次性消费保护。
+- 回调地址必须HTTPS且精确匹配配置中的origin;拒绝用户信息、fragment、伪后缀域名及非允许端口。
+- 微信openId为空直接拒绝;unionId为空不再查询空值账户,防止错误匹配管理员。
+- 后台权限提供器限定login域,实时核对账户启用状态,空角色/权限列表返回空而非异常。
+- 移除解除限制接口、邮件通知接口、订单完成接口的匿名白名单;前两者只限root,订单完成要求order:edit。
+- 修正订单完成的错误提示(原来把已支付状态描述成未支付)。
+
+## 必须配置/兼容变化
+`security.admin-login.allowed-redirect-origins`:填真实管理后台origin,英文逗号分隔;例 https://admin.example.com。为空时后台微信登录拒绝,短信登录不受此项影响。不要填写前台公共域名或允许任意子域。回调state格式变化,发布后已有扫码授权需重新发起。
+邮件通知/解除限制旧自动化客户端需迁移为可信后台认证,不再匿名调用;order:edit须在真实权限表确认并授权,不能凭角色名自动放行。
+微信token仍沿用现有前端协议放在跳转查询参数里,彻底移除URL token需要前端和后端一同迁移;本轮仅限制其目的地和state来源。OAuth绑定浏览器会话、防登录CSRF仍需进一步验证。
+
+## 验证结果
+独立编译并运行 AdminRedirectPolicy + RedirectPolicyCheck,10个允许/拒绝用例通过。
+`git diff --check`通过。完整Maven编译、登录集成和退款/加余额测试尚未完成;未操作生产数据库或执行真实资金请求。
+
+## 尚未完成,按优先级继续
+1. 加余额持久幂等键、事务内流水一致性、超时重试验证。
+2. 退款支付渠道幂等、锁超时并发、回调真实性及重放防护。
+3. 兑换码/优惠券领取消费并发、越权与历史数据迁移。
+4. 其余匿名白名单、企微员工Cookie身份、通用系统配置读取及修改范围。
+5. 全部后台接口的数据范围/字段白名单/SQL拼接审计。
+6. 前端全站v-html、文件上传下载、导出错误处理、金额精度、分页和表单状态;已存在的上传组件测试失败。
+清单不是完成证明,不把所有945条标为已通过。
+
+## 后续进展
+已对齐IDEA Maven设置,依赖阻塞解除;Fastjson 1.2.84 + SafeMode已验证,全模块编译通过。余额幂等和标准退款稳定编号/金额冻结已补代码;最新专项回归19项Java测试、10项前端测试通过。详细范围及上线新增SQL见 balance-refund-reliability.md;上文未完成事项不因本轮测试全部自动关闭。

+ 7562 - 0
docs/admin-route-inventory.json

@@ -0,0 +1,7562 @@
+[
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 54,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 64,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 77,
+    "verb": "Get",
+    "mapping": "\"/get/sub/applyMoney/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 91,
+    "verb": "Get",
+    "mapping": "\"/get/sub\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 106,
+    "verb": "Post",
+    "mapping": "\"/sub\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsApplyMoneyController.java",
+    "line": 116,
+    "verb": "Get",
+    "mapping": "\"/applyMoney/threshold\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 99,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 216,
+    "verb": "Get",
+    "mapping": "\"/get/default\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 242,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 254,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 266,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 277,
+    "verb": "Get",
+    "mapping": "\"/get/all/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 317,
+    "verb": "Get",
+    "mapping": "\"/get/service/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 327,
+    "verb": "Get",
+    "mapping": "\"/get/ds/poster/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 458,
+    "verb": "Post",
+    "mapping": "\"/poster/record/{posterId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 482,
+    "verb": "Put",
+    "mapping": "\"/update/recommend/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\cps\\CpsPopularizeController.java",
+    "line": 502,
+    "verb": "Get",
+    "mapping": "\"/get/available/coupon\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\gpt\\ChatGptController.java",
+    "line": 31,
+    "verb": "Get",
+    "mapping": "\"/getAccessToken\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\gpt\\ChatGptController.java",
+    "line": 41,
+    "verb": "Get",
+    "mapping": "\"/init\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 73,
+    "verb": "Post",
+    "mapping": "value = \"/login\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 97,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 134,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 155,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 198,
+    "verb": "Get",
+    "mapping": "\"/get/loginInfo\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 243,
+    "verb": "Get",
+    "mapping": "\"/get/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 250,
+    "verb": "Get",
+    "mapping": "\"/send/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\AdminController.java",
+    "line": 317,
+    "verb": "Get",
+    "mapping": "\"/get/yh/user/token\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 164,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 423,
+    "verb": "Post",
+    "mapping": "\"/multi-quantity/redeliver/{orderId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 435,
+    "verb": "Get",
+    "mapping": "\"/get/refund/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 449,
+    "verb": "Get",
+    "mapping": "\"/get/order/mj/mirror/detail/{orderId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 474,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 582,
+    "verb": "Get",
+    "mapping": "\"/export/realGoods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 618,
+    "verb": "Put",
+    "mapping": "\"/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 627,
+    "verb": "Put",
+    "mapping": "\"/update/subNode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 638,
+    "verb": "Get",
+    "mapping": "\"/get/transport/{orderId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 645,
+    "verb": "Post",
+    "mapping": "\"/post/setWaybill\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 654,
+    "verb": "Get",
+    "mapping": "\"/get/realGooods/interest/users\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 689,
+    "verb": "Put",
+    "mapping": "\"/put/status/{orderId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 763,
+    "verb": "Put",
+    "mapping": "\"/put/interest\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 781,
+    "verb": "Get",
+    "mapping": "\"/export/interest\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 809,
+    "verb": "Post",
+    "mapping": "\"/put/realGoods/service\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 853,
+    "verb": "Post",
+    "mapping": "\"/post/orderComment\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 869,
+    "verb": "Put",
+    "mapping": "\"/put/orderComment\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 884,
+    "verb": "Delete",
+    "mapping": "\"/delete/orderComment/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 893,
+    "verb": "Get",
+    "mapping": "\"/get/orderComment\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 902,
+    "verb": "Put",
+    "mapping": "\"/put/orderComment/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 912,
+    "verb": "Post",
+    "mapping": "\"/post/orderComment/reward/config\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 921,
+    "verb": "Get",
+    "mapping": "\"/get/orderComment/reward/config\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 932,
+    "verb": "Put",
+    "mapping": "\"/kickOut\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 943,
+    "verb": "Get",
+    "mapping": "\"/get/kickOut/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 952,
+    "verb": "Put",
+    "mapping": "\"/update/order/source\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 969,
+    "verb": "Put",
+    "mapping": "\"/update/order/tvType\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 984,
+    "verb": "Post",
+    "mapping": "\"/unified/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1000,
+    "verb": "Post",
+    "mapping": "\"/wx/refund/notify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1031,
+    "verb": "Put",
+    "mapping": "\"/put/sameSpec/empty/relation\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1042,
+    "verb": "Get",
+    "mapping": "\"/get/sameSpec/empty/relation\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1095,
+    "verb": "Put",
+    "mapping": "\"/refund/price/differ\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1113,
+    "verb": "Put",
+    "mapping": "\"/clear/balance/refundMoney\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1124,
+    "verb": "Get",
+    "mapping": "\"/get/refundOrder/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1155,
+    "verb": "Put",
+    "mapping": "\"/set/service\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1180,
+    "verb": "Get",
+    "mapping": "\"/upgrade/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1242,
+    "verb": "Get",
+    "mapping": "\"/get/upgrade/refund/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1267,
+    "verb": "Get",
+    "mapping": "\"/upgrade/export\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1287,
+    "verb": "Post",
+    "mapping": "\"/unified/upgrade/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1303,
+    "verb": "Get",
+    "mapping": "\"/get/midjourney/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1343,
+    "verb": "Get",
+    "mapping": "\"/get/user/refund/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1385,
+    "verb": "Get",
+    "mapping": "\"/get/user/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1408,
+    "verb": "Get",
+    "mapping": "\"/renew/orders/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1495,
+    "verb": "Get",
+    "mapping": "\"/get/diff/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1504,
+    "verb": "Post",
+    "mapping": "\"/post/diff/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1516,
+    "verb": "Put",
+    "mapping": "\"/update/diff/info\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1531,
+    "verb": "Get",
+    "mapping": "\"/get/dp/relations\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1549,
+    "verb": "Get",
+    "mapping": "\"/get/pwd/view/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1564,
+    "verb": "Post",
+    "mapping": "\"/afterSales/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsOrderController.java",
+    "line": 1576,
+    "verb": "Get",
+    "mapping": "\"/get/afterSales/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserComplaintController.java",
+    "line": 36,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserComplaintController.java",
+    "line": 45,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 101,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 184,
+    "verb": "Get",
+    "mapping": "\"/get/userNum\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 198,
+    "verb": "Put",
+    "mapping": "\"/put/black/status/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 253,
+    "verb": "Put",
+    "mapping": "\"/put/verifyCheck/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 291,
+    "verb": "Get",
+    "mapping": "\"/get/verifyCheck/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 305,
+    "verb": "Get",
+    "mapping": "\"/get/verifyCode/change/list/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 318,
+    "verb": "Get",
+    "mapping": "\"/get/corpFollow/detail/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 332,
+    "verb": "Get",
+    "mapping": "\"/get/corpFollow\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 343,
+    "verb": "Get",
+    "mapping": "\"/get/order/title\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 400,
+    "verb": "Get",
+    "mapping": "\"/get/order/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 411,
+    "verb": "Get",
+    "mapping": "\"/get/question/response/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 432,
+    "verb": "Put",
+    "mapping": "\"/sub/balance\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 466,
+    "verb": "Put",
+    "mapping": "\"/add/balance\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 497,
+    "verb": "Post",
+    "mapping": "\"/userOrder/block\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 508,
+    "verb": "Delete",
+    "mapping": "\"/userOrder/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 517,
+    "verb": "Get",
+    "mapping": "\"/userOrder\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 526,
+    "verb": "Get",
+    "mapping": "\"/get/user/login/record/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 537,
+    "verb": "Get",
+    "mapping": "\"/get/consume/large/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 553,
+    "verb": "Get",
+    "mapping": "\"/get/consume/large/newUser\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 565,
+    "verb": "Get",
+    "mapping": "\"/get/malice/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 577,
+    "verb": "Get",
+    "mapping": "\"get/malice/user/newUser\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 587,
+    "verb": "Get",
+    "mapping": "\"/get/ip/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 600,
+    "verb": "Get",
+    "mapping": "\"/get/zfb/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 613,
+    "verb": "Get",
+    "mapping": "\"/get/more/netflix/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 631,
+    "verb": "Get",
+    "mapping": "\"/get/user/balance/sys/operate/record\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 643,
+    "verb": "Post",
+    "mapping": "\"/open/vip\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\CmsUserController.java",
+    "line": 654,
+    "verb": "Put",
+    "mapping": "\"/update/vip/days\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\LoginAuditController.java",
+    "line": 25,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\SpecialPayManageController.java",
+    "line": 20,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\SpecialPayManageController.java",
+    "line": 31,
+    "verb": "Post",
+    "mapping": "\"/{orderNo}/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 39,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 51,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 72,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 86,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 100,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\DynamicListController.java",
+    "line": 113,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\FrontProblemCollectRecordController.java",
+    "line": 37,
+    "verb": "Post",
+    "mapping": "\"/save\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\FrontProblemCollectRecordController.java",
+    "line": 74,
+    "verb": "Get",
+    "mapping": "\"/get/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\FrontProblemCollectRecordController.java",
+    "line": 83,
+    "verb": "Delete",
+    "mapping": "\"/empty\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 77,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 115,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 125,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 173,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 193,
+    "verb": "Get",
+    "mapping": "\"/help/question/classification/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 209,
+    "verb": "Get",
+    "mapping": "\"/get/question/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 221,
+    "verb": "Get",
+    "mapping": "\"/check/goods/question/classification\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 237,
+    "verb": "Get",
+    "mapping": "\"/duty/operate/log\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 250,
+    "verb": "Get",
+    "mapping": "\"/get/service/indx\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 261,
+    "verb": "Post",
+    "mapping": "\"/service/record/{indx}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 272,
+    "verb": "Delete",
+    "mapping": "\"/delete/cps/ad\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysConfigController.java",
+    "line": 281,
+    "verb": "Get",
+    "mapping": "\"/get/service/index\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 75,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 84,
+    "verb": "Delete",
+    "mapping": "\"/del/{sid}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 93,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 102,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 128,
+    "verb": "Get",
+    "mapping": "\"/get/master\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 137,
+    "verb": "Get",
+    "mapping": "\"/dataInit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 146,
+    "verb": "Put",
+    "mapping": "\"/bind/loginAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 155,
+    "verb": "Post",
+    "mapping": "\"/tans/customer\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 166,
+    "verb": "Get",
+    "mapping": "\"/get/trans/users\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysCorpFollowController.java",
+    "line": 175,
+    "verb": "Get",
+    "mapping": "\"/get/corp/kf/account/users\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysGptMirrorDayGiveawayController.java",
+    "line": 30,
+    "verb": "Put",
+    "mapping": "\"/set/gpt/giveaway/buy/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\SysGptMirrorDayGiveawayController.java",
+    "line": 45,
+    "verb": "Get",
+    "mapping": "\"/get/gpt/giveaway/buy/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\UserSysMsgController.java",
+    "line": 44,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\UserSysMsgController.java",
+    "line": 55,
+    "verb": "Get",
+    "mapping": "\"/view/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\sys\\UserSysMsgController.java",
+    "line": 71,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 86,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 96,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 105,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 119,
+    "verb": "Get",
+    "mapping": "\"/export/temp/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 127,
+    "verb": "Post",
+    "mapping": "\"/import\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 177,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\AccountTempController.java",
+    "line": 188,
+    "verb": "Put",
+    "mapping": "\"/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 137,
+    "verb": "Get",
+    "mapping": "\"/netflix/credential\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 190,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 318,
+    "verb": "Get",
+    "mapping": "\"/export/account\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 391,
+    "verb": "Get",
+    "mapping": "\"/get/account/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 399,
+    "verb": "Post",
+    "mapping": "\"/import/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 484,
+    "verb": "Post",
+    "mapping": "\"/analysis/chatGPT/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 494,
+    "verb": "Post",
+    "mapping": "\"/import/special/goods/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 504,
+    "verb": "Get",
+    "mapping": "\"/test\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 542,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 584,
+    "verb": "Get",
+    "mapping": "\"/get/account/import/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 592,
+    "verb": "Post",
+    "mapping": "\"/import/account/issuance\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 679,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 769,
+    "verb": "Put",
+    "mapping": "\"/update/pwd\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 811,
+    "verb": "Get",
+    "mapping": "\"/get/expired/ticket\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 822,
+    "verb": "Delete",
+    "mapping": "\"/clear/expired/ticket/{recordId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 834,
+    "verb": "Get",
+    "mapping": "\"/get/valid/ticket\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 842,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 873,
+    "verb": "Delete",
+    "mapping": "\"/bathc/delete/accountTrips\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 883,
+    "verb": "Delete",
+    "mapping": "\"/batch/delete/goods/accountTrips\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 890,
+    "verb": "Put",
+    "mapping": "\"/update/expiryTime\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 904,
+    "verb": "Get",
+    "mapping": "\"/get/expired/platform\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 915,
+    "verb": "Get",
+    "mapping": "\"/get/updatePwd/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 924,
+    "verb": "Get",
+    "mapping": "\"/get/latest/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 944,
+    "verb": "Get",
+    "mapping": "\"/get/expired/accounts\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 960,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1007,
+    "verb": "Get",
+    "mapping": "\"/get/updatePwd/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1034,
+    "verb": "Post",
+    "mapping": "\"/import/america/appid\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1044,
+    "verb": "Get",
+    "mapping": "\"/get/doubleVerifyAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1053,
+    "verb": "Put",
+    "mapping": "\"/put/doubleVerifyAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1088,
+    "verb": "Get",
+    "mapping": "\"/doubleVerify/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1098,
+    "verb": "Post",
+    "mapping": "\"/doubleVerify/import\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1135,
+    "verb": "Get",
+    "mapping": "\"/export/doubleVerify/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1143,
+    "verb": "Get",
+    "mapping": "\"/get/doubleVerify/viewList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1152,
+    "verb": "Get",
+    "mapping": "\"/get/doubleVerify/clickRefresh/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1161,
+    "verb": "Get",
+    "mapping": "\"/get/ticket/pwd/view\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1172,
+    "verb": "Get",
+    "mapping": "\"/get/specific/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1194,
+    "verb": "Put",
+    "mapping": "\"/update/renew/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1212,
+    "verb": "Get",
+    "mapping": "\"/get/replace/banned/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1220,
+    "verb": "Post",
+    "mapping": "\"/replace/banned\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1303,
+    "verb": "Get",
+    "mapping": "\"/export/prepare/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1311,
+    "verb": "Post",
+    "mapping": "\"/batch/import/prepare\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1381,
+    "verb": "Post",
+    "mapping": "\"/post/prepare\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1408,
+    "verb": "Post",
+    "mapping": "\"/batch/import/email\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1417,
+    "verb": "Get",
+    "mapping": "\"/get/email\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1428,
+    "verb": "Post",
+    "mapping": "\"/post/email\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1440,
+    "verb": "Put",
+    "mapping": "\"/update/email\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1449,
+    "verb": "Delete",
+    "mapping": "\"/delete/email/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1458,
+    "verb": "Post",
+    "mapping": "\"/batch/import/blocked\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1469,
+    "verb": "Delete",
+    "mapping": "\"/delete/blocked/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1478,
+    "verb": "Get",
+    "mapping": "\"/get/blocked\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1489,
+    "verb": "Put",
+    "mapping": "\"/update/disable/{accountId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1503,
+    "verb": "Get",
+    "mapping": "\"/get/disable/acount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1514,
+    "verb": "Post",
+    "mapping": "\"/nf/upgrade/device/{accountId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1523,
+    "verb": "Get",
+    "mapping": "\"/get/account/email/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1532,
+    "verb": "Get",
+    "mapping": "\"/get/export/email/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1540,
+    "verb": "Post",
+    "mapping": "\"/export/email\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1574,
+    "verb": "Get",
+    "mapping": "\"/export/banned/nf/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1583,
+    "verb": "Get",
+    "mapping": "\"/get/cuiQiu/email/msg\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1604,
+    "verb": "Get",
+    "mapping": "\"/get/cuiQiu/email/last\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1613,
+    "verb": "Get",
+    "mapping": "\"/export/cuiQiu/email/msg\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsAccountController.java",
+    "line": 1634,
+    "verb": "Post",
+    "mapping": "\"/sync/cuiQiu/nf/last\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 82,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 93,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 118,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 141,
+    "verb": "Post",
+    "mapping": "\"/post/mirror/car/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 190,
+    "verb": "Post",
+    "mapping": "\"/post/mirror/changePassword\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 225,
+    "verb": "Put",
+    "mapping": "\"/flush/officialSession/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 240,
+    "verb": "Get",
+    "mapping": "\"/export/mirror/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 261,
+    "verb": "Get",
+    "mapping": "\"/get/account/verifyCode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 277,
+    "verb": "Get",
+    "mapping": "\"/read/resetPassword/link\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 305,
+    "verb": "Post",
+    "mapping": "\"/changeNodes\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 327,
+    "verb": "Get",
+    "mapping": "\"/getGptAccountInfo\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 379,
+    "verb": "Get",
+    "mapping": "\"/export/gpt/session/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 387,
+    "verb": "Post",
+    "mapping": "\"/import/gpt/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\CmsGptCarController.java",
+    "line": 416,
+    "verb": "Get",
+    "mapping": "\"/get/change/pwd/link\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\NetflixErrorRecoverController.java",
+    "line": 46,
+    "verb": "Get",
+    "mapping": "\"/get/recover/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\NetflixErrorRecoverController.java",
+    "line": 58,
+    "verb": "Post",
+    "mapping": "\"/recover/available/parking/space\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\account\\NetflixErrorRecoverController.java",
+    "line": 67,
+    "verb": "Post",
+    "mapping": "\"/recover/standby\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\active\\UserActivityController.java",
+    "line": 56,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\active\\UserActivityController.java",
+    "line": 65,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\active\\UserActivityController.java",
+    "line": 74,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\active\\UserActivityController.java",
+    "line": 87,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\active\\UserActivityController.java",
+    "line": 133,
+    "verb": "Get",
+    "mapping": "\"/get/rank/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\aimodel\\CmsAiModelController.java",
+    "line": 32,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\aimodel\\CmsAiModelController.java",
+    "line": 42,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\aimodel\\CmsAiModelController.java",
+    "line": 50,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\aimodel\\CmsAiModelController.java",
+    "line": 61,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\aimodel\\CmsAiModelController.java",
+    "line": 68,
+    "verb": "Put",
+    "mapping": "\"/status/{id}/{status}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 42,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 55,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 64,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 73,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 83,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\article\\ArticleController.java",
+    "line": 94,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 40,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 59,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 69,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 79,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 89,
+    "verb": "Put",
+    "mapping": "\"/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\benefits\\UserBenefitsController.java",
+    "line": 102,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelController.java",
+    "line": 48,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelController.java",
+    "line": 78,
+    "verb": "Get",
+    "mapping": "\"/get/channelList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelController.java",
+    "line": 92,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelController.java",
+    "line": 100,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelController.java",
+    "line": 106,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 65,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 135,
+    "verb": "Get",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 158,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 164,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 170,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\channel\\CmsChannelPopularizeController.java",
+    "line": 176,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 104,
+    "verb": "Post",
+    "mapping": "value = \"/login\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 128,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 168,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 207,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 261,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 281,
+    "verb": "Put",
+    "mapping": "\"/put/reset/pwd/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 293,
+    "verb": "Get",
+    "mapping": "\"/get/loginInfo\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 347,
+    "verb": "Get",
+    "mapping": "\"/get/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 365,
+    "verb": "Get",
+    "mapping": "\"/wx/authLogin\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 385,
+    "verb": "Get",
+    "mapping": "\"/wx/authLogin/baseRedirect\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 427,
+    "verb": "Post",
+    "mapping": "\"/bind/wx\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsAdminUserController.java",
+    "line": 451,
+    "verb": "Get",
+    "mapping": "\"/whoami\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 44,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 51,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 70,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 87,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 97,
+    "verb": "Get",
+    "mapping": "\"/get/noPerms\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsMenuController.java",
+    "line": 107,
+    "verb": "Get",
+    "mapping": "\"/get/self/menu\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 52,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 69,
+    "verb": "Post",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 106,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 121,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 126,
+    "verb": "Get",
+    "mapping": "\"/get/menu\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsRoleController.java",
+    "line": 136,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{roleId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\cms\\CmsSysController.java",
+    "line": 30,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\codex\\CmsCodexChannelController.java",
+    "line": 30,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\codex\\CmsCodexChannelController.java",
+    "line": 37,
+    "verb": "Put",
+    "mapping": "\"/{id}/enabled\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 74,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 85,
+    "verb": "Put",
+    "mapping": "\"/update/follow\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 95,
+    "verb": "Post",
+    "mapping": "\"/post/config\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 104,
+    "verb": "Get",
+    "mapping": "\"/get/available/follow\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 113,
+    "verb": "Post",
+    "mapping": "\"/post/active/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 123,
+    "verb": "Put",
+    "mapping": "\"/update/active/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 132,
+    "verb": "Delete",
+    "mapping": "\"/del/active/code/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 143,
+    "verb": "Get",
+    "mapping": "\"/get/active/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 170,
+    "verb": "Get",
+    "mapping": "\"/get/active/code/userList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 180,
+    "verb": "Get",
+    "mapping": "\"/get/active/code/orderDetail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 193,
+    "verb": "Get",
+    "mapping": "\"/get/active/code/goods/order\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 216,
+    "verb": "Get",
+    "mapping": "\"/get/active/code/order/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CmsCorpFollowActiveCodeController.java",
+    "line": 243,
+    "verb": "Get",
+    "mapping": "\"/get/statistics/user/data/{acId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpChatController.java",
+    "line": 37,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpChatController.java",
+    "line": 46,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 62,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 71,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 81,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 90,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 136,
+    "verb": "Post",
+    "mapping": "\"/add/extra/service\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 149,
+    "verb": "Put",
+    "mapping": "\"/update/extra/service\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 162,
+    "verb": "Delete",
+    "mapping": "\"/del/extra/service/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpCustomerAcquistionLinkController.java",
+    "line": 181,
+    "verb": "Get",
+    "mapping": "\"/get/extra/service\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 47,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 56,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 68,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 77,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 107,
+    "verb": "Get",
+    "mapping": "\"/get/payNum/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpInteractiveRadarController.java",
+    "line": 117,
+    "verb": "Get",
+    "mapping": "\"/get/data/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgAuditController.java",
+    "line": 60,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgAuditController.java",
+    "line": 106,
+    "verb": "Get",
+    "mapping": "\"/msgList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgAuditController.java",
+    "line": 120,
+    "verb": "Get",
+    "mapping": "\"/getMsgByFollowIdAndUserId\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 73,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 83,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 92,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 148,
+    "verb": "Get",
+    "mapping": "\"/get/tag/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 157,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 175,
+    "verb": "Get",
+    "mapping": "\"/get/sendRecord/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 202,
+    "verb": "Get",
+    "mapping": "\"/export/sendRecord/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 230,
+    "verb": "Get",
+    "mapping": "\"/get/corpFollow/sendRecord/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 243,
+    "verb": "Put",
+    "mapping": "\"/remind/{msgid}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 252,
+    "verb": "Post",
+    "mapping": "\"/execute/dynamicRuleTag/{tagId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 261,
+    "verb": "Post",
+    "mapping": "\"/send/active/corpBulkMsg\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 271,
+    "verb": "Post",
+    "mapping": "\"/category/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 283,
+    "verb": "Put",
+    "mapping": "\"/category/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 295,
+    "verb": "Delete",
+    "mapping": "\"/category/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgBulkTaskController.java",
+    "line": 308,
+    "verb": "Get",
+    "mapping": "\"/category/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgFollowController.java",
+    "line": 49,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgFollowController.java",
+    "line": 70,
+    "verb": "Get",
+    "mapping": "\"/all\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgFollowController.java",
+    "line": 83,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpMsgFollowController.java",
+    "line": 94,
+    "verb": "Delete",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 47,
+    "verb": "Post",
+    "mapping": "\"/addGroup\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 56,
+    "verb": "Post",
+    "mapping": "\"/addCorpTagGroup\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 65,
+    "verb": "Put",
+    "mapping": "\"/editCorpTag\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 75,
+    "verb": "Put",
+    "mapping": "\"/del\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 96,
+    "verb": "Get",
+    "mapping": "\"/get/ruleList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 105,
+    "verb": "Post",
+    "mapping": "\"/post/rule\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 114,
+    "verb": "Put",
+    "mapping": "\"/put/rule\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 123,
+    "verb": "Get",
+    "mapping": "\"/get/corpTag\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 138,
+    "verb": "Get",
+    "mapping": "\"/get/corpTag/rule/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 146,
+    "verb": "Get",
+    "mapping": "\"/get/corpUser/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 155,
+    "verb": "Get",
+    "mapping": "\"/get/groupTag/detail/{groupId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 164,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 173,
+    "verb": "Get",
+    "mapping": "\"/get/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 182,
+    "verb": "Get",
+    "mapping": "\"/get/tagUser/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 191,
+    "verb": "Get",
+    "mapping": "\"/get/tagUser/fansData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 201,
+    "verb": "Get",
+    "mapping": "\"/get/tagUser/pastData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 211,
+    "verb": "Get",
+    "mapping": "\"/get/tagUser/time/orderData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpTagController.java",
+    "line": 220,
+    "verb": "Get",
+    "mapping": "\"/get/fans/toMonth/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpUserController.java",
+    "line": 35,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpWelcomeTemplateController.java",
+    "line": 54,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpWelcomeTemplateController.java",
+    "line": 63,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpWelcomeTemplateController.java",
+    "line": 94,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpWelcomeTemplateController.java",
+    "line": 103,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\CorpWelcomeTemplateController.java",
+    "line": 130,
+    "verb": "Get",
+    "mapping": "\"/get/all\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 136,
+    "verb": "Get",
+    "mapping": "value = \"/auth\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 158,
+    "verb": "Get",
+    "mapping": "value = \"/redirect\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 189,
+    "verb": "Get",
+    "mapping": "\"/get/jsTicket\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 221,
+    "verb": "Get",
+    "mapping": "\"/get/agentJsTicket\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 267,
+    "verb": "Get",
+    "mapping": "\"/dataInit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 276,
+    "verb": "Get",
+    "mapping": "\"/user/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 285,
+    "verb": "Get",
+    "mapping": "\"/get/corpRenewFollow/head/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 301,
+    "verb": "Post",
+    "mapping": "\"/bind/others/users\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 310,
+    "verb": "Post",
+    "mapping": "\"/mark/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 322,
+    "verb": "Get",
+    "mapping": "\"/getMsgAuditChat\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 343,
+    "verb": "Get",
+    "mapping": "\"/getMsgByFollowIdAndUserId\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 359,
+    "verb": "Get",
+    "mapping": "\"/acquistionLinkCallback\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 376,
+    "verb": "Get",
+    "mapping": "\"/get/user/intention\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 399,
+    "verb": "Put",
+    "mapping": "\"/update/user/intention\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 415,
+    "verb": "Get",
+    "mapping": "\"/acquistionLinkCallback/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 424,
+    "verb": "Put",
+    "mapping": "\"/upCallbackIntention\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 438,
+    "verb": "Get",
+    "mapping": "\"/get/user/intention/pie\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 447,
+    "verb": "Get",
+    "mapping": "\"/get/tag/user/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 456,
+    "verb": "Get",
+    "mapping": "\"/get/ticket\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 502,
+    "verb": "Get",
+    "mapping": "\"/get/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 527,
+    "verb": "Post",
+    "mapping": "\"/unified/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 538,
+    "verb": "Post",
+    "mapping": "\"/spotify/self/service/{orderId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 547,
+    "verb": "Put",
+    "mapping": "\"/clear/gpt/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 556,
+    "verb": "Put",
+    "mapping": "\"/clear/claude/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\WxCorpController.java",
+    "line": 565,
+    "verb": "Get",
+    "mapping": "\"/get/tmp/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 100,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 111,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 127,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 138,
+    "verb": "Post",
+    "mapping": "\"/send\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 149,
+    "verb": "Put",
+    "mapping": "\"/set/hot/{couponId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 161,
+    "verb": "Post",
+    "mapping": "\"/set/relation\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 171,
+    "verb": "Put",
+    "mapping": "\"/set/relation/exCode\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 181,
+    "verb": "Get",
+    "mapping": "\"/get/relation/list\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 195,
+    "verb": "Delete",
+    "mapping": "\"/relation/del/{relationId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 205,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 227,
+    "verb": "Get",
+    "mapping": "\"/get/couponList\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 240,
+    "verb": "Get",
+    "mapping": "\"/active/list\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 261,
+    "verb": "Put",
+    "mapping": "\"/active/putStatus/{couponActiveId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 279,
+    "verb": "Put",
+    "mapping": "\"/active/putExpiryStatus/{couponActiveId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 299,
+    "verb": "Get",
+    "mapping": "\"/recommend/list\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 328,
+    "verb": "Put",
+    "mapping": "\"/recommend/putStatus/{recommendId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 351,
+    "verb": "Delete",
+    "mapping": "\"/recommend/del/{recommendId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 373,
+    "verb": "Post",
+    "mapping": "\"/corp/send\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 390,
+    "verb": "Post",
+    "mapping": "\"/post/classification\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 404,
+    "verb": "Delete",
+    "mapping": "\"/delete/classification/{classificationId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 420,
+    "verb": "Put",
+    "mapping": "\"/update/coupon/classification\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 445,
+    "verb": "Put",
+    "mapping": "\"/update/classification\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 461,
+    "verb": "Get",
+    "mapping": "\"/get/classification\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 471,
+    "verb": "Get",
+    "mapping": "\"/get/classificationList\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 509,
+    "verb": "Post",
+    "mapping": "\"/set/equipment/activity/reduce\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 519,
+    "verb": "Put",
+    "mapping": "\"/put/equipment/activity/reduce\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 532,
+    "verb": "Get",
+    "mapping": "\"/get/equipment/activity/reduce\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 546,
+    "verb": "Delete",
+    "mapping": "\"/del/equipment/activity/reduce/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 559,
+    "verb": "Get",
+    "mapping": "\"/get/receipt/detail/{couponId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 571,
+    "verb": "Get",
+    "mapping": "\"/get/used/detail/{couponId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 583,
+    "verb": "Get",
+    "mapping": "\"/get/used/money/{couponId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 593,
+    "verb": "Get",
+    "mapping": "\"/get/cascade\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 635,
+    "verb": "Post",
+    "mapping": "\"/post/popups\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 645,
+    "verb": "Put",
+    "mapping": "\"/update/popups\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 655,
+    "verb": "Delete",
+    "mapping": "\"/delete/popups/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 665,
+    "verb": "Put",
+    "mapping": "\"/update/popups/status/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\coupon\\CouponController.java",
+    "line": 678,
+    "verb": "Get",
+    "mapping": "\"/get/popups\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 138,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 165,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 186,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 197,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 231,
+    "verb": "Get",
+    "mapping": "\"/get/sub/{distributeId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 243,
+    "verb": "Delete",
+    "mapping": "\"/delete/sub/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 254,
+    "verb": "Get",
+    "mapping": "\"/get/distribute/plat/brokenLine/{sharedId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 301,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 391,
+    "verb": "Get",
+    "mapping": "\"/search\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 400,
+    "verb": "Get",
+    "mapping": "\"/get/all\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 410,
+    "verb": "Get",
+    "mapping": "\"/get/plat\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 422,
+    "verb": "Get",
+    "mapping": "\"/get/sku/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 433,
+    "verb": "Put",
+    "mapping": "\"/set/common/sku/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 442,
+    "verb": "Get",
+    "mapping": "\"/get/distribute/order/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 451,
+    "verb": "Get",
+    "mapping": "\"/get/register/distribute/user\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 471,
+    "verb": "Get",
+    "mapping": "\"/get/register/distribute/user/order/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 488,
+    "verb": "Put",
+    "mapping": "\"/put/goods/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 515,
+    "verb": "Get",
+    "mapping": "\"/get/applyMoney/title\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 528,
+    "verb": "Get",
+    "mapping": "\"/get/applyMoney/list\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 538,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 581,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney/img\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 600,
+    "verb": "Get",
+    "mapping": "\"/get/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 619,
+    "verb": "Get",
+    "mapping": "\"/get/equipment/distribute/newUser\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 630,
+    "verb": "Get",
+    "mapping": "\"/get/business/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 652,
+    "verb": "Get",
+    "mapping": "\"/get/businessList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 667,
+    "verb": "Get",
+    "mapping": "\"/get/takeMoney/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 701,
+    "verb": "Get",
+    "mapping": "\"/get/business/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 726,
+    "verb": "Get",
+    "mapping": "\"/get/business/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 744,
+    "verb": "Put",
+    "mapping": "\"/put/business/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 787,
+    "verb": "Get",
+    "mapping": "\"/get/defaultRateConfig\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 796,
+    "verb": "Put",
+    "mapping": "\"/update/business/defaultRate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 827,
+    "verb": "Get",
+    "mapping": "\"/get/business/distribute/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 844,
+    "verb": "Put",
+    "mapping": "\"/put/business/distribute/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 933,
+    "verb": "Get",
+    "mapping": "\"/get/business/data\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 985,
+    "verb": "Get",
+    "mapping": "\"/get/apply/detail/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 994,
+    "verb": "Get",
+    "mapping": "\"/get/rule/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1018,
+    "verb": "Put",
+    "mapping": "\"/update/status/rule\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1071,
+    "verb": "Get",
+    "mapping": "\"/get/rule/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1102,
+    "verb": "Get",
+    "mapping": "\"/get/business/distribute/monthlyData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1207,
+    "verb": "Get",
+    "mapping": "\"/get/business/general/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1218,
+    "verb": "Put",
+    "mapping": "\"/put/business/general/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1285,
+    "verb": "Get",
+    "mapping": "\"/get/goodsSku/alert\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1294,
+    "verb": "Get",
+    "mapping": "\"/get/target/alert/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1311,
+    "verb": "Put",
+    "mapping": "\"/update/target/alert/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1324,
+    "verb": "Post",
+    "mapping": "\"/import/unbind/distribute/shared\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1337,
+    "verb": "Get",
+    "mapping": "\"/get/unbind/orderMoney/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1357,
+    "verb": "Post",
+    "mapping": "\"/post/white\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1376,
+    "verb": "Delete",
+    "mapping": "\"/del/white/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1386,
+    "verb": "Get",
+    "mapping": "\"/get/white\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributeController.java",
+    "line": 1395,
+    "verb": "Get",
+    "mapping": "\"/get/common/distribute\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 46,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 55,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 64,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 73,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 93,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\DistributePosterController.java",
+    "line": 106,
+    "verb": "Get",
+    "mapping": "\"/get/relate/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\EquipmentController.java",
+    "line": 58,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\EquipmentController.java",
+    "line": 72,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{shareId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\distribute\\EquipmentController.java",
+    "line": 96,
+    "verb": "Put",
+    "mapping": "\"/verify/reward/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\enterprise\\CmsEnterprisePurchaseLeadController.java",
+    "line": 22,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\enterprise\\CmsEnterprisePurchaseLeadController.java",
+    "line": 30,
+    "verb": "Get",
+    "mapping": "\"/pending/exists\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\enterprise\\CmsEnterprisePurchaseLeadController.java",
+    "line": 35,
+    "verb": "Get",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\enterprise\\CmsEnterprisePurchaseLeadController.java",
+    "line": 40,
+    "verb": "Put",
+    "mapping": "\"/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\enterprise\\CmsEnterprisePurchaseLeadController.java",
+    "line": 46,
+    "verb": "Put",
+    "mapping": "\"/remark\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\exchange\\ExchangeCodeController.java",
+    "line": 68,
+    "verb": "Get",
+    "mapping": "\"/createAndExport\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\exchange\\ExchangeCodeController.java",
+    "line": 87,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\exchange\\ExchangeCodeController.java",
+    "line": 118,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 48,
+    "verb": "Get",
+    "mapping": "\"/feedback/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 57,
+    "verb": "Put",
+    "mapping": "\"/feedback/mark/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 69,
+    "verb": "Get",
+    "mapping": "\"/feedback/progress/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 79,
+    "verb": "Post",
+    "mapping": "\"/feedback/reply\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 99,
+    "verb": "Get",
+    "mapping": "\"/recommend/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\feedback\\UserFeedbackController.java",
+    "line": 109,
+    "verb": "Get",
+    "mapping": "\"/recommend/user/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 70,
+    "verb": "Post",
+    "mapping": "\"/template/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 79,
+    "verb": "Put",
+    "mapping": "\"/template/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 88,
+    "verb": "Post",
+    "mapping": "\"/template/fields/value\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 97,
+    "verb": "Put",
+    "mapping": "\"/template/fields/value\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 106,
+    "verb": "Put",
+    "mapping": "\"/template/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 121,
+    "verb": "Get",
+    "mapping": "\"/template/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 132,
+    "verb": "Get",
+    "mapping": "\"/template/fields/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 143,
+    "verb": "Get",
+    "mapping": "\"/get/question/resp/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 183,
+    "verb": "Get",
+    "mapping": "\"/get/question/resp/data/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\FormController.java",
+    "line": 286,
+    "verb": "Get",
+    "mapping": "\"/export/question/resp/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 34,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 40,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 46,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 55,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 65,
+    "verb": "Get",
+    "mapping": "\"/template/get/detail/{promotionId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\form\\QuestionnairePromotionController.java",
+    "line": 81,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 63,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 72,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 88,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 101,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 116,
+    "verb": "Put",
+    "mapping": "\"/sort\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 132,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 154,
+    "verb": "Get",
+    "mapping": "\"/get/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 175,
+    "verb": "Put",
+    "mapping": "\"/sort/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 200,
+    "verb": "Delete",
+    "mapping": "\"/delete/{relateId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 209,
+    "verb": "Get",
+    "mapping": "\"/get/all\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonCategoryController.java",
+    "line": 218,
+    "verb": "Get",
+    "mapping": "\"/get/goods/tree\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 73,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 85,
+    "verb": "Get",
+    "mapping": "\"/get/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 103,
+    "verb": "Get",
+    "mapping": "\"/get/sku/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 118,
+    "verb": "Post",
+    "mapping": "value = \"/post\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 155,
+    "verb": "Put",
+    "mapping": "value = \"/update\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 217,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 231,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 248,
+    "verb": "Get",
+    "mapping": "\"/get/all\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 270,
+    "verb": "Get",
+    "mapping": "\"/get/giftCard\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 283,
+    "verb": "Get",
+    "mapping": "\"/get/all/goods/sku\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonController.java",
+    "line": 321,
+    "verb": "Get",
+    "mapping": "\"/get/category/goods/cascade\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 76,
+    "verb": "Post",
+    "mapping": "value = \"/post/spec-sku\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 87,
+    "verb": "Put",
+    "mapping": "\"/update/spec\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 98,
+    "verb": "Post",
+    "mapping": "value = \"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 117,
+    "verb": "Put",
+    "mapping": "value = \"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 222,
+    "verb": "Delete",
+    "mapping": "\"/delete/{skuId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 237,
+    "verb": "Post",
+    "mapping": "\"/post/combination/{goodsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 247,
+    "verb": "Get",
+    "mapping": "\"/get/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 290,
+    "verb": "Put",
+    "mapping": "\"/batch/update/status/{goodsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSkuController.java",
+    "line": 312,
+    "verb": "Put",
+    "mapping": "\"/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSpecController.java",
+    "line": 45,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonSpecController.java",
+    "line": 91,
+    "verb": "Delete",
+    "mapping": "value = \"/delete\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 73,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 83,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 93,
+    "verb": "Put",
+    "mapping": "\"/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 109,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 123,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 138,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 152,
+    "verb": "Get",
+    "mapping": "\"/get/user/requirement/info\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 186,
+    "verb": "Get",
+    "mapping": "\"/get/deposit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 203,
+    "verb": "Post",
+    "mapping": "\"/deposit/refund/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 214,
+    "verb": "Post",
+    "mapping": "\"/deposit/refund/notify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 246,
+    "verb": "Get",
+    "mapping": "\"/get/order/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 259,
+    "verb": "Post",
+    "mapping": "\"/refund/order\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 271,
+    "verb": "Get",
+    "mapping": "\"/upload/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 281,
+    "verb": "Get",
+    "mapping": "\"/get/order/account/{orderId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 292,
+    "verb": "Post",
+    "mapping": "\"/post/order/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\CmsGoodsDonWholeSaleController.java",
+    "line": 301,
+    "verb": "Put",
+    "mapping": "\"/update/order/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 41,
+    "verb": "Post",
+    "mapping": "\"/set\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 50,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 62,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 71,
+    "verb": "Get",
+    "mapping": "\"/get/pay\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 82,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GiftCardController.java",
+    "line": 108,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 50,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 61,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 79,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 90,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 104,
+    "verb": "Put",
+    "mapping": "\"/update/status/batch\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 119,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 128,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 137,
+    "verb": "Put",
+    "mapping": "\"/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 154,
+    "verb": "Get",
+    "mapping": "\"/get/consultation/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonQuestionController.java",
+    "line": 166,
+    "verb": "Get",
+    "mapping": "\"/get/consultation/statistics/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonSkuSubsidyController.java",
+    "line": 41,
+    "verb": "Post",
+    "mapping": "\"/insert\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonSkuSubsidyController.java",
+    "line": 51,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonSkuSubsidyController.java",
+    "line": 61,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonSkuSubsidyController.java",
+    "line": 75,
+    "verb": "Put",
+    "mapping": "\"/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\GoodsDonSkuSubsidyController.java",
+    "line": 89,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\RegisterGoodsDonController.java",
+    "line": 39,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\RegisterGoodsDonController.java",
+    "line": 50,
+    "verb": "Post",
+    "mapping": "value = \"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\RegisterGoodsDonController.java",
+    "line": 62,
+    "verb": "Put",
+    "mapping": "value = \"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\RegisterGoodsDonController.java",
+    "line": 71,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\RegisterGoodsDonController.java",
+    "line": 84,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 99,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 146,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 174,
+    "verb": "Get",
+    "mapping": "\"/get/plat/waiting\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 179,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 190,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 197,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 208,
+    "verb": "Put",
+    "mapping": "\"/update/set/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 223,
+    "verb": "Post",
+    "mapping": "\"/post/account/bind\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 268,
+    "verb": "Put",
+    "mapping": "\"/account/replace\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 279,
+    "verb": "Get",
+    "mapping": "\"/get/account/replace/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 288,
+    "verb": "Get",
+    "mapping": "\"/get/down/trips\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 300,
+    "verb": "Put",
+    "mapping": "\"/up/trips/{groupsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 313,
+    "verb": "Put",
+    "mapping": "\"/down/trips/{groupsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 324,
+    "verb": "Put",
+    "mapping": "\"/put/trips/status/{groupsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 356,
+    "verb": "Put",
+    "mapping": "\"/batch/update/account/trips/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 405,
+    "verb": "Put",
+    "mapping": "\"/down/account/{accountId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 418,
+    "verb": "Get",
+    "mapping": "\"/get/verifyCode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 454,
+    "verb": "Get",
+    "mapping": "\"/get/available/relation\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 463,
+    "verb": "Put",
+    "mapping": "\"/set/relation/alert\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupController.java",
+    "line": 495,
+    "verb": "Get",
+    "mapping": "\"/get/relation/alert\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 150,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 162,
+    "verb": "Put",
+    "mapping": "\"/disable/{groupsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 172,
+    "verb": "Get",
+    "mapping": "\"/get/recharge\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 291,
+    "verb": "Get",
+    "mapping": "\"/export/recharge\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 328,
+    "verb": "Post",
+    "mapping": "\"/set/recharge\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 443,
+    "verb": "Get",
+    "mapping": "\"/get/recharge/waiting\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 458,
+    "verb": "Put",
+    "mapping": "\"/recharge/update/remain/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 489,
+    "verb": "Post",
+    "mapping": "\"/batch/recharge/update/remain/num\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 499,
+    "verb": "Post",
+    "mapping": "\"/recharge/set/remainNumBf\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 526,
+    "verb": "Put",
+    "mapping": "\"/update/recharge/operator\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 554,
+    "verb": "Get",
+    "mapping": "\"/get/recharge/operate/statistics/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 577,
+    "verb": "Get",
+    "mapping": "\"/export/recharge/operate/statistics/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 604,
+    "verb": "Put",
+    "mapping": "\"/set/recharge/remark\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 614,
+    "verb": "Get",
+    "mapping": "\"/get/gpt/cardKey\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 623,
+    "verb": "Get",
+    "mapping": "\"/export/gpt/cardKey\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 634,
+    "verb": "Put",
+    "mapping": "\"/update/gpt/cardKey\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 648,
+    "verb": "Get",
+    "mapping": "\"/get/gpt/cardKey/channel\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 658,
+    "verb": "Post",
+    "mapping": "\"/save/gpt/cardKey/channel\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 689,
+    "verb": "Delete",
+    "mapping": "\"/del/gpt/cardKey/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 705,
+    "verb": "Delete",
+    "mapping": "\"/batch/del/gpt/cardKey\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 725,
+    "verb": "Post",
+    "mapping": "\"/post/gpt/cardKey\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 747,
+    "verb": "Get",
+    "mapping": "\"/get/recharge/operate/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 768,
+    "verb": "Post",
+    "mapping": "\"/parse-token\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 777,
+    "verb": "Post",
+    "mapping": "\"/confirm\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 788,
+    "verb": "Get",
+    "mapping": "\"/task-status/{taskId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 796,
+    "verb": "Get",
+    "mapping": "\"/get/order/relation\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 805,
+    "verb": "Post",
+    "mapping": "\"/gpt/independent/export/recharge\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 818,
+    "verb": "Get",
+    "mapping": "\"/get/chatGPT/independent/renew\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 838,
+    "verb": "Put",
+    "mapping": "\"/update/independent/renew/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 872,
+    "verb": "Get",
+    "mapping": "\"/get/independent/renew/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 889,
+    "verb": "Delete",
+    "mapping": "\"/clear/ticket/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 903,
+    "verb": "Get",
+    "mapping": "\"/get/disable/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupRelationController.java",
+    "line": 914,
+    "verb": "Put",
+    "mapping": "\"/unfreeze/ticket/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupsRelationExpiryController.java",
+    "line": 59,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupsRelationExpiryController.java",
+    "line": 104,
+    "verb": "Get",
+    "mapping": "\"/get/reBuy/record/{trackId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupsRelationExpiryController.java",
+    "line": 116,
+    "verb": "Post",
+    "mapping": "\"/reBuy\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsGroupsRelationExpiryController.java",
+    "line": 139,
+    "verb": "Get",
+    "mapping": "\"/get/renewFollow/statistics\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsHomeGroupController.java",
+    "line": 45,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsHomeGroupController.java",
+    "line": 51,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsHomeGroupController.java",
+    "line": 59,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsHomeGroupController.java",
+    "line": 79,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\group\\CmsHomeGroupController.java",
+    "line": 87,
+    "verb": "Get",
+    "mapping": "\"/get/user/unInvited\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\gzh\\GzhController.java",
+    "line": 74,
+    "verb": "Get",
+    "mapping": "\"/get/notExpired/popularizeCode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 54,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 63,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 79,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 95,
+    "verb": "Put",
+    "mapping": "\"/batch/update/status/{status}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 112,
+    "verb": "Put",
+    "mapping": "\"/batch/update/category/status/{status}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 124,
+    "verb": "Put",
+    "mapping": "\"/sort\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 139,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 152,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 174,
+    "verb": "Get",
+    "mapping": "\"/get/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 188,
+    "verb": "Put",
+    "mapping": "\"/timing/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\home\\HomeManageConfigController.java",
+    "line": 197,
+    "verb": "Put",
+    "mapping": "\"/timing/cancel/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 57,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 68,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 83,
+    "verb": "Put",
+    "mapping": "\"/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 105,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 135,
+    "verb": "Put",
+    "mapping": "\"/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 149,
+    "verb": "Delete",
+    "mapping": "\"/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 166,
+    "verb": "Post",
+    "mapping": "\"/post/category\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 176,
+    "verb": "Put",
+    "mapping": "\"/put/category\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 185,
+    "verb": "Get",
+    "mapping": "\"/get/category\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\information\\CmsInformationController.java",
+    "line": 193,
+    "verb": "Delete",
+    "mapping": "\"/del/category/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 47,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 56,
+    "verb": "Put",
+    "mapping": "\"/set/invoiceImg\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 74,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 86,
+    "verb": "Get",
+    "mapping": "\"/get/company/taxRate\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 96,
+    "verb": "Post",
+    "mapping": "\"/post/company/taxRate\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 106,
+    "verb": "Put",
+    "mapping": "\"/update/company/taxRate\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\invoice\\UserInvoiceController.java",
+    "line": 116,
+    "verb": "Delete",
+    "mapping": "\"/delete/company/taxRate/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 53,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 62,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 71,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 80,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 94,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\LuckyDrawController.java",
+    "line": 116,
+    "verb": "Get",
+    "mapping": "\"/get/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\SignController.java",
+    "line": 24,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\SignController.java",
+    "line": 32,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 56,
+    "verb": "Get",
+    "mapping": "\"/get/type\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 64,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 73,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 87,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 99,
+    "verb": "Put",
+    "mapping": "\"/put/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 113,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 144,
+    "verb": "Get",
+    "mapping": "\"/get/follow/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\market\\TaskController.java",
+    "line": 153,
+    "verb": "Put",
+    "mapping": "\"/batch/verify/follow\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 48,
+    "verb": "Get",
+    "mapping": "\"/get/config\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 58,
+    "verb": "Post",
+    "mapping": "\"/save\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 67,
+    "verb": "Post",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 76,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 85,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 97,
+    "verb": "Put",
+    "mapping": "\"/batch/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 112,
+    "verb": "Post",
+    "mapping": "\"/category/save\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 125,
+    "verb": "Put",
+    "mapping": "\"/category/save\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 134,
+    "verb": "Delete",
+    "mapping": "\"/del/category/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 147,
+    "verb": "Put",
+    "mapping": "\"/category/sorted\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mini\\MiniPopularizeController.java",
+    "line": 156,
+    "verb": "Get",
+    "mapping": "\"/category/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsClaudeController.java",
+    "line": 44,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsClaudeController.java",
+    "line": 55,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsClaudeController.java",
+    "line": 84,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsClaudeController.java",
+    "line": 101,
+    "verb": "Post",
+    "mapping": "\"/post/mirror/car/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsMirrorController.java",
+    "line": 52,
+    "verb": "Get",
+    "mapping": "\"/generateAndExport/gpt/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirror\\CmsMirrorController.java",
+    "line": 90,
+    "verb": "Get",
+    "mapping": "\"/get/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 69,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 101,
+    "verb": "Put",
+    "mapping": "\"/update/shop/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 113,
+    "verb": "Get",
+    "mapping": "\"/get/user/apply/detail/record/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 124,
+    "verb": "Get",
+    "mapping": "\"/get/apply/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 133,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 143,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney/img\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 155,
+    "verb": "Get",
+    "mapping": "\"/get/fee/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 166,
+    "verb": "Put",
+    "mapping": "\"/fee/refund/{orderId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 175,
+    "verb": "Get",
+    "mapping": "\"/get/apply/info/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 185,
+    "verb": "Put",
+    "mapping": "\"/verify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 194,
+    "verb": "Put",
+    "mapping": "\"/batch/verify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 210,
+    "verb": "Get",
+    "mapping": "\"/get/head/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\UserMirrorShopController.java",
+    "line": 229,
+    "verb": "Get",
+    "mapping": "\"/get/applyMoney/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 57,
+    "verb": "Post",
+    "mapping": "\"/addAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 67,
+    "verb": "Delete",
+    "mapping": "\"/removeAccount/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 77,
+    "verb": "Put",
+    "mapping": "\"/updateAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 87,
+    "verb": "Put",
+    "mapping": "\"/updateStatus/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 97,
+    "verb": "Put",
+    "mapping": "\"/syncAccount/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 108,
+    "verb": "Get",
+    "mapping": "\"/getAccount\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 125,
+    "verb": "Get",
+    "mapping": "\"/get/midjourneyCar\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 136,
+    "verb": "Put",
+    "mapping": "\"/update/midjourneyCar\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 152,
+    "verb": "Delete",
+    "mapping": "\"/delete/midjourneyCar/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidJourneyController.java",
+    "line": 170,
+    "verb": "Post",
+    "mapping": "\"/post/midjourney/car/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 40,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 49,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 63,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 72,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 83,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mj\\MidjourneyPaintingController.java",
+    "line": 96,
+    "verb": "Put",
+    "mapping": "\"/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\qy\\QyServicesIntentionController.java",
+    "line": 35,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 68,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 89,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 98,
+    "verb": "Get",
+    "mapping": "\"/get/appleId/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 106,
+    "verb": "Post",
+    "mapping": "\"/export/appleId/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 115,
+    "verb": "Get",
+    "mapping": "\"/get/appleId/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 123,
+    "verb": "Get",
+    "mapping": "\"/get/appleId/head\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 143,
+    "verb": "Post",
+    "mapping": "\"/wx/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 154,
+    "verb": "Post",
+    "mapping": "\"/wx/refund/notify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 187,
+    "verb": "Post",
+    "mapping": "\"/unified/refund\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 197,
+    "verb": "Get",
+    "mapping": "\"/unLimit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\register\\CmsRegisterController.java",
+    "line": 208,
+    "verb": "Put",
+    "mapping": "\"/unLimit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 49,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 61,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 73,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 90,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 107,
+    "verb": "Get",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\renew\\RenewUpgradePackageController.java",
+    "line": 117,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 51,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 74,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 86,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 102,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 111,
+    "verb": "Put",
+    "mapping": "\"/update/channel/pay\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 129,
+    "verb": "Get",
+    "mapping": "\"/get/zfb/limit\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 139,
+    "verb": "Put",
+    "mapping": "\"/update/zfb/limit\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 149,
+    "verb": "Post",
+    "mapping": "\"/save/zfb/limit\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\shop\\ShopConfigController.java",
+    "line": 163,
+    "verb": "Delete",
+    "mapping": "\"/delete/zfb/limit/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 54,
+    "verb": "Post",
+    "mapping": "\"/add\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 63,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 72,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 81,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 90,
+    "verb": "Get",
+    "mapping": "\"/import/template\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sora\\SoraCodeController.java",
+    "line": 98,
+    "verb": "Post",
+    "mapping": "\"/batch-import\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\spotify\\SpotifyUpgradeController.java",
+    "line": 52,
+    "verb": "Get",
+    "mapping": "\"/get/account/submit\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\spotify\\SpotifyUpgradeController.java",
+    "line": 61,
+    "verb": "Put",
+    "mapping": "\"/set/account/submit/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\spotify\\SpotifyUpgradeController.java",
+    "line": 91,
+    "verb": "Get",
+    "mapping": "\"/get/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\spotify\\SpotifyUpgradeController.java",
+    "line": 102,
+    "verb": "Post",
+    "mapping": "\"/refund/{orderId}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 118,
+    "verb": "Get",
+    "mapping": "\"/get/header\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 127,
+    "verb": "Get",
+    "mapping": "\"/get/goods\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 136,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 150,
+    "verb": "Get",
+    "mapping": "\"/export/monthly/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 164,
+    "verb": "Get",
+    "mapping": "\"/get/groupsData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 173,
+    "verb": "Get",
+    "mapping": "\"/expired/account\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 182,
+    "verb": "Get",
+    "mapping": "\"/export/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 191,
+    "verb": "Put",
+    "mapping": "\"/put/renewStatus/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 202,
+    "verb": "Put",
+    "mapping": "\"/put/handleStatus/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 214,
+    "verb": "Put",
+    "mapping": "\"/renewTime/up\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 237,
+    "verb": "Put",
+    "mapping": "\"/ticket/compensation/days\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 333,
+    "verb": "Get",
+    "mapping": "\"/get/realtion/time/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 342,
+    "verb": "Get",
+    "mapping": "\"/get/operation/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 350,
+    "verb": "Get",
+    "mapping": "\"/get/user/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 389,
+    "verb": "Get",
+    "mapping": "\"/get/customer/service/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 418,
+    "verb": "Get",
+    "mapping": "\"/get/service/orders/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 457,
+    "verb": "Get",
+    "mapping": "\"/export/service/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 479,
+    "verb": "Get",
+    "mapping": "\"/get/stock\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 515,
+    "verb": "Get",
+    "mapping": "\"/export/stock\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 554,
+    "verb": "Post",
+    "mapping": "\"/batch/service\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 577,
+    "verb": "Get",
+    "mapping": "\"/get/sign\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 586,
+    "verb": "Get",
+    "mapping": "\"/get/title/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 596,
+    "verb": "Get",
+    "mapping": "\"/get/plat/brokenLine\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 632,
+    "verb": "Get",
+    "mapping": "\"/get/channelStatistics/brokenLine\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 671,
+    "verb": "Get",
+    "mapping": "\"/get/newUserStatistics/brokenLine\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 710,
+    "verb": "Put",
+    "mapping": "\"/update/redBookUsers\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 740,
+    "verb": "Get",
+    "mapping": "\"/get/order/service/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 752,
+    "verb": "Get",
+    "mapping": "\"/get/distributeOrder/brokenLine\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\statistics\\StatisticsDataController.java",
+    "line": 761,
+    "verb": "Get",
+    "mapping": "\"/get/aiUsageData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 49,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 62,
+    "verb": "Post",
+    "mapping": "\"/incr\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 81,
+    "verb": "Post",
+    "mapping": "\"/sub\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 91,
+    "verb": "Put",
+    "mapping": "\"/undo/change/{recordId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 101,
+    "verb": "Put",
+    "mapping": "\"/put/unavailable\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 114,
+    "verb": "Put",
+    "mapping": "\"/put/upgrade\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 124,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 139,
+    "verb": "Put",
+    "mapping": "\"/update/bindGoods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 163,
+    "verb": "Get",
+    "mapping": "\"/get/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 175,
+    "verb": "Put",
+    "mapping": "\"/put/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\stock\\StockController.java",
+    "line": 184,
+    "verb": "Delete",
+    "mapping": "\"/del/{stockId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\CmsMirrorNoticeController.java",
+    "line": 40,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\CmsMirrorNoticeController.java",
+    "line": 49,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\CmsMirrorNoticeController.java",
+    "line": 58,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\CmsMirrorNoticeController.java",
+    "line": 75,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 37,
+    "verb": "Post",
+    "mapping": "\"/question/classification\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 46,
+    "verb": "Delete",
+    "mapping": "\"/question/classification/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 59,
+    "verb": "Put",
+    "mapping": "\"/question/classification\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 68,
+    "verb": "Get",
+    "mapping": "\"/question/classification\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 79,
+    "verb": "Put",
+    "mapping": "\"/question/classification/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 93,
+    "verb": "Post",
+    "mapping": "\"/question\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 102,
+    "verb": "Delete",
+    "mapping": "\"/question/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 116,
+    "verb": "Put",
+    "mapping": "\"/question\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 125,
+    "verb": "Get",
+    "mapping": "\"/question\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 145,
+    "verb": "Get",
+    "mapping": "\"/get/question/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\HelpController.java",
+    "line": 157,
+    "verb": "Put",
+    "mapping": "\"/question/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\TicketAdvertiseConfigController.java",
+    "line": 37,
+    "verb": "Post",
+    "mapping": "\"/advertise\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\TicketAdvertiseConfigController.java",
+    "line": 47,
+    "verb": "Put",
+    "mapping": "\"/advertise/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\TicketAdvertiseConfigController.java",
+    "line": 56,
+    "verb": "Delete",
+    "mapping": "\"/advertise/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\TicketAdvertiseConfigController.java",
+    "line": 67,
+    "verb": "Get",
+    "mapping": "\"/advertise/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\TicketAdvertiseConfigController.java",
+    "line": 79,
+    "verb": "Put",
+    "mapping": "\"/advertise/updateStatus/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\WorkOrderController.java",
+    "line": 63,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\WorkOrderController.java",
+    "line": 99,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\WorkOrderController.java",
+    "line": 125,
+    "verb": "Get",
+    "mapping": "\"/get/chat/history\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\WorkOrderController.java",
+    "line": 139,
+    "verb": "Post",
+    "mapping": "\"/customer/reply\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\sys\\WorkOrderController.java",
+    "line": 182,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 49,
+    "verb": "Post",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 61,
+    "verb": "Put",
+    "mapping": "",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 73,
+    "verb": "Delete",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 90,
+    "verb": "Put",
+    "mapping": "\"/put/status/{id}\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 107,
+    "verb": "Get",
+    "mapping": "\"/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\upgrade\\UpgradePackageController.java",
+    "line": 117,
+    "verb": "Get",
+    "mapping": "",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\vip\\CmsVipController.java",
+    "line": 60,
+    "verb": "Get",
+    "mapping": "\"/get/orders\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\vip\\CmsVipController.java",
+    "line": 84,
+    "verb": "Post",
+    "mapping": "\"/refund/order\"",
+    "nearbyPermissionAnnotation": true,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\vip\\CmsVipController.java",
+    "line": 98,
+    "verb": "Get",
+    "mapping": "\"/get/skus\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\vip\\CmsVipController.java",
+    "line": 107,
+    "verb": "Post",
+    "mapping": "\"/post/skus\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\vip\\CmsVipController.java",
+    "line": 116,
+    "verb": "Get",
+    "mapping": "\"/export\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\wholesale\\WholesaleCodeController.java",
+    "line": 38,
+    "verb": "Get",
+    "mapping": "\"/get/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\wholesale\\WholesaleCodeController.java",
+    "line": 49,
+    "verb": "Get",
+    "mapping": "\"/get/order\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\wholesale\\WholesaleController.java",
+    "line": 30,
+    "verb": "Get",
+    "mapping": "\"/list/webInfo\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\wholesale\\WholesaleController.java",
+    "line": 41,
+    "verb": "Put",
+    "mapping": "\"/updStatus/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 64,
+    "verb": "Get",
+    "mapping": "\"/get/pay/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 73,
+    "verb": "Get",
+    "mapping": "\"/get/nf/household/device\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 82,
+    "verb": "Post",
+    "mapping": "\"/get/verifyCode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 90,
+    "verb": "Put",
+    "mapping": "\"/set/pin/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 99,
+    "verb": "Get",
+    "mapping": "\"/get/pin/status/{taskId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 107,
+    "verb": "Post",
+    "mapping": "\"/kickOut/nf/{relationId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 116,
+    "verb": "Post",
+    "mapping": "\"/click/nf/household/device\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 124,
+    "verb": "Get",
+    "mapping": "\"/get/doubleVerify/codeList\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 139,
+    "verb": "Get",
+    "mapping": "\"/get/authCode\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\relation\\CorpRelationController.java",
+    "line": 206,
+    "verb": "Get",
+    "mapping": "\"/refresh/code\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 71,
+    "verb": "Post",
+    "mapping": "\"/account/add\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 80,
+    "verb": "Delete",
+    "mapping": "\"/account/del/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 89,
+    "verb": "Put",
+    "mapping": "\"/account/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 98,
+    "verb": "Get",
+    "mapping": "\"/account/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 107,
+    "verb": "Get",
+    "mapping": "\"/get/url\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 118,
+    "verb": "Post",
+    "mapping": "\"/set/rule\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 127,
+    "verb": "Get",
+    "mapping": "\"/get/rule\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 136,
+    "verb": "Post",
+    "mapping": "\"/set/auto/reply\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 145,
+    "verb": "Get",
+    "mapping": "\"/get/auto/reply\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 158,
+    "verb": "Post",
+    "mapping": "\"/set/duty\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 169,
+    "verb": "Get",
+    "mapping": "\"/get/follow/change/logs\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 178,
+    "verb": "Get",
+    "mapping": "\"/get/servicer/status/change/record\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 187,
+    "verb": "Get",
+    "mapping": "\"/get/duty\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 196,
+    "verb": "Get",
+    "mapping": "\"/get/servicer/state\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 207,
+    "verb": "Get",
+    "mapping": "\"/get/statistics\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 249,
+    "verb": "Get",
+    "mapping": "\"/get/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 267,
+    "verb": "Get",
+    "mapping": "\"/get/session/chat\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 277,
+    "verb": "Put",
+    "mapping": "\"/servicer/commute\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 288,
+    "verb": "Get",
+    "mapping": "\"/get/duty/{openKfId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 298,
+    "verb": "Get",
+    "mapping": "\"/get/duty/accounts\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 308,
+    "verb": "Post",
+    "mapping": "\"/change/account/record/{openKfId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfController.java",
+    "line": 331,
+    "verb": "Get",
+    "mapping": "\"/get/change/account\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfMsgController.java",
+    "line": 38,
+    "verb": "Post",
+    "mapping": "\"/send/satisfaction/msg\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfMsgController.java",
+    "line": 52,
+    "verb": "Get",
+    "mapping": "\"/get/user/info\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfMsgController.java",
+    "line": 77,
+    "verb": "Get",
+    "mapping": "\"/get/user/session\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfUserController.java",
+    "line": 50,
+    "verb": "Get",
+    "mapping": "\"/get/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfUserController.java",
+    "line": 59,
+    "verb": "Post",
+    "mapping": "\"/set/remark\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfUserController.java",
+    "line": 70,
+    "verb": "Post",
+    "mapping": "\"/mark/device\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\corp\\wxkf\\CorpKfUserController.java",
+    "line": 88,
+    "verb": "Get",
+    "mapping": "\"/get/consultation/questions\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 90,
+    "verb": "Get",
+    "mapping": "\"/get/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 100,
+    "verb": "Put",
+    "mapping": "\"/put/goods/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 134,
+    "verb": "Put",
+    "mapping": "\"/oneKey/set/goods/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 163,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 212,
+    "verb": "Put",
+    "mapping": "\"/update/status\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 227,
+    "verb": "Put",
+    "mapping": "\"/set/business\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 236,
+    "verb": "Get",
+    "mapping": "\"/get/apply/detail/{shopUserId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 245,
+    "verb": "Put",
+    "mapping": "\"/set/rate\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 264,
+    "verb": "Get",
+    "mapping": "\"/get/detail/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 275,
+    "verb": "Get",
+    "mapping": "\"/get/register/detail/{shopUserId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 300,
+    "verb": "Get",
+    "mapping": "\"/get/register/order/detail/{shopUserId}/{userId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 322,
+    "verb": "Get",
+    "mapping": "\"/get/order/detail/{shopUserId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 333,
+    "verb": "Get",
+    "mapping": "\"/get/business/list\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 355,
+    "verb": "Get",
+    "mapping": "\"/get/takeMoney/detail\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 389,
+    "verb": "Get",
+    "mapping": "\"/get/business/headData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 414,
+    "verb": "Get",
+    "mapping": "\"/get/business/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 456,
+    "verb": "Get",
+    "mapping": "\"/get/applyMoney\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 465,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 475,
+    "verb": "Put",
+    "mapping": "\"/verify/applyMoney/img\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 485,
+    "verb": "Get",
+    "mapping": "\"/get/apply\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 495,
+    "verb": "Put",
+    "mapping": "\"/batch/verify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 512,
+    "verb": "Put",
+    "mapping": "\"/verify\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\CmsYhShopGoodsController.java",
+    "line": 521,
+    "verb": "Get",
+    "mapping": "\"/get/head/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 54,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 64,
+    "verb": "Put",
+    "mapping": "\"/put\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 85,
+    "verb": "Put",
+    "mapping": "\"/put/goodsStatus/{goodsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 107,
+    "verb": "Put",
+    "mapping": "\"/del/{goodsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 120,
+    "verb": "Get",
+    "mapping": "\"/get/available/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 133,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 143,
+    "verb": "Get",
+    "mapping": "\"/get/goods/detail/{goodsId}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 155,
+    "verb": "Get",
+    "mapping": "\"/get/sku/down/info\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\goods\\shop\\YhShopGoodsController.java",
+    "line": 165,
+    "verb": "Delete",
+    "mapping": "\"/delete/sku/down/info\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 55,
+    "verb": "Get",
+    "mapping": "\"/get\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 72,
+    "verb": "Post",
+    "mapping": "\"/post\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 84,
+    "verb": "Put",
+    "mapping": "\"/update\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 100,
+    "verb": "Put",
+    "mapping": "\"/update/status/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 115,
+    "verb": "Delete",
+    "mapping": "\"/delete/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 128,
+    "verb": "Post",
+    "mapping": "\"/mark/{id}\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorNoticeController.java",
+    "line": 151,
+    "verb": "Post",
+    "mapping": "\"/sync/background/notice\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 59,
+    "verb": "Get",
+    "mapping": "\"/get/distribute/detail/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 86,
+    "verb": "Get",
+    "mapping": "\"/get/wMoney/statisticsData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 106,
+    "verb": "Get",
+    "mapping": "\"/get/data/brokenLine\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 148,
+    "verb": "Get",
+    "mapping": "\"/get/distribute/orders/statisticsData\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 176,
+    "verb": "Get",
+    "mapping": "\"/get/distribute/orders/detail/data\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 210,
+    "verb": "Get",
+    "mapping": "\"/get/orders/goods\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  },
+  {
+    "file": "netflix-web\\src\\main\\java\\com\\cyksj\\web\\controller\\manage\\mirrorshop\\manage\\CmsUserMirrorShopDataController.java",
+    "line": 225,
+    "verb": "Get",
+    "mapping": "\"/get/apply/money\"",
+    "nearbyPermissionAnnotation": false,
+    "reviewStatus": "UNREVIEWED"
+  }
+]

+ 24 - 0
docs/balance-refund-reliability.md

@@ -0,0 +1,24 @@
+# 余额与退款可靠性修复
+
+## 余额
+- 加余额和扣余额请求必须携带 Idempotency-Key(16–64位字母数字或短横线)。
+- 表 admin_balance_request 与余额、流水使用同一数据库事务;成功重放直接返回成功,不再次修改余额;相同key换用户/金额/备注拒绝。
+- 前端在sessionStorage保留未确认操作key,按后台用户ID、接口、目标用户、金额和备注区分。只有收到业务成功才删除;刷新重试保留。不要关闭标签或清除缓存后盲目重试。
+- 不同key仍代表不同操作;不阻止有权限人员主动创建多笔加款,跨设备/关闭标签需先核账。
+- 上线先执行 docs/sql/20261021-balance-idempotency.sql,更新前后端。旧客户端无key会被拒绝。不能清理已完成key后重放旧请求。
+
+## 退款
+- 标准订单centerRefund的微信/支付宝/Stripe调用,未显式指定请求号时,使用订单ID和数据库已记录现金退款累计额派生稳定请求号,替代按当前时间生成新号。
+- 数据库还没确认结果时重试维持同一请求号;确认退款累计额增加后才生成下一笔请求号。显式批量退款编号不改。
+- 同一未确认退款位置变更金额,不应通过换请求号再次出款,应核查渠道结果;渠道对幂等号的返回和参数冲突仍需沙箱验证。
+- PayPal、套餐/会员/押金等其他独立链路不在本次稳定编号覆盖范围。历史按时间编号发出的未确认退款,上线前必须对账,不能自动换新号重试。
+- 补齐普通订单/套餐订单不存在时的业务错误,避免空指针。
+
+## 验证范围
+余额mock测试、H2 MySQL模式事务重放/回滚测试、退款编号纯函数测试与权限测试均提供源代码;真实MySQL并发、渠道沙箱、生产支付均未执行。H2不是MySQL最终验收替代。
+
+## 退款意图持久化
+标准退款自动生成稳定请求号时,调用渠道前用独立事务将订单ID、金额写入 payment_refund_intent。相同退款号变更金额拒绝,不依赖渠道是否检测参数冲突。先执行 docs/sql/20261021-refund-intent.sql 再部署;首次请求金额填写错误但尚未出款,也不能自行删除记录换金额,开发需先核对渠道状态。
+
+## 实际回归结果(2026-10-21)
+使用IDEA同一Maven/settings/本地仓库:全模块构建成功;指定安全回归service 8项、web 11项全部通过(含2项H2事务测试)。前端10项安全/请求标识测试通过,前端构建通过。不是全量测试,也不包含真实MySQL并发或真实渠道退款。

+ 43 - 0
docs/exchange-code-security.md

@@ -0,0 +1,43 @@
+# 兑换码入口防护
+
+## 本次变更
+
+- 后台 `/manage/exchange/code/**` 增加类级后台登录校验;保留各接口权限。
+- 为兼容当前前端,保留 GET `/createAndExport` 路径,但必须同时具有
+  `exchangeCode:add` 和 `exchangeCode:export`。后续前端联动再迁移为 POST。
+- 生成入口在服务层限制为每次 1–500 个码、1–100 个规格,并检查类型枚举。
+- 后台查询/导出只接收 `goodsId`、`skuId`、`code`、`userId`、`useStatus`、
+  `codeType`、`start`、`limit`;不再接收客户端 condition、操作符、逻辑分组及动态排序。
+  `code` 改为精确匹配。分页大小最多 100;导出最多 10000 条,且只导出平台类型码。
+- root 判定改为精确角色匹配;非 root 仍按历史 operator 昵称限定范围,
+  空昵称或重名则拒绝查询。历史表没有管理员 ID 归属,本次不猜测或回填归属;
+  昵称变更后仍需管理员核实历史归属,后续应迁移到 operator_id。
+- `/external/app/get/mirror` 和 `/external/app/refund/{id}` 仅允许后台 root,
+  分别要求 `exchangeCode:view`、`exchangeCode:refund`。禁止匿名第三方调用;
+  暂不支持第三方独立凭证或租户范围,接入方需迁移,不能恢复匿名访问。
+- 外部查询不再透传请求参数;退款增加审计,并记录重发码操作者。
+- 前台按兑换码查看详情只接受非空完整码,忽略客户端查询操作符。
+- 未删除、修改任何生产兑换码;未改 GPT token 接口。
+
+## 发布
+
+运行 `docs/sql/20261021-coupon-exchange-permissions.sql` 补齐 9 个权限码,
+包含新增的 `exchangeCode:refund`。只自动授予 root,其他角色显式授权。
+后台重新保存角色权限刷新缓存,重新登录验证。代码必须构建、发布才会生效。
+
+## 验收(尚未在线执行)
+
+1. 匿名/仅前台 token 调用后台和 external 接口:拒绝,数据无变化。
+2. 后台无相应权限:拒绝;只有 add 没有 export 不能调用 createAndExport。
+3. external:普通后台角色即使有 view/refund 仍被拒绝,root 且有权限才允许。
+4. 查询携带 condition、code-op、operator-op 等额外参数:不得改变结果范围。
+5. 非 root 看不到其他唯一昵称创建者的码;重名/空昵称拒绝查询。
+6. 数量 0、负数、501、空规格、未知类型均拒绝;合法请求可正常生成。
+7. 分页超过 100 拒绝;导出超过 10000 条拒绝。
+8. 前台详情缺少 code 或只有查询操作符不能返回兑换码。
+
+回归测试命令(先修复现有腾讯云依赖缺失):
+
+```powershell
+& 'D:\IntelliJ IDEA 2025.2.3\plugins\maven\lib\maven3\bin\mvn.cmd' -pl netflix-web -am test '-Dtest=ExchangeCodeSecurityTest,CouponWriteSecurityTest' '-Dsurefire.failIfNoSpecifiedTests=false'
+```

+ 10 - 0
docs/fastjson-upgrade.md

@@ -0,0 +1,10 @@
+# Fastjson 1.2.84 升级
+
+- 根 pom.xml 的 dependencyManagement 统一指定 com.alibaba:fastjson:1.2.84。
+- 升级前依赖树实际为 1.2.83_noneautotype;升级后四个子模块依赖树均解析为 1.2.84。
+- netflix-common/src/main/resources/fastjson.properties 默认启用 SafeMode、禁用 autoTypeSupport;Application 启动前再设置同名 JVM 属性。
+- 独立测试覆盖实际JAR Maven元数据版本、全局及新建ParserConfig安全模式、普通JSON解析、拒绝不受信任AutoType。测试通过。
+- 官方1.2.84 JAR的 JSON.VERSION 常量仍为1.2.83,不能仅凭该常量判断升级失败。已核对JAR内pom.properties为1.2.84,本地JAR SHA1与Maven Central相符:05773609a8ce27cc9cbfbec0009e02b1a7b83dde。
+- 官方发布说明:https://github.com/alibaba/fastjson/releases/tag/1.2.84
+
+重新打包并部署后才影响生产进程,需检查产物BOOT-INF/lib中fastjson仅为1.2.84;不将本地依赖树验证等同于线上已更新。

+ 174 - 0
docs/frontend-security-integration.md

@@ -0,0 +1,174 @@
+# 前端对接:兑换码/优惠券权限与登录日志
+
+日期:2026-10-21。本文对应当前本地后端改动,尚未完成编译、发布及在线联调。
+接口均为应用路径,不含网关 `/api` 等前缀,沿用现有 baseURL 和后台鉴权请求配置。
+
+## 1. 发布前准备
+
+后端/运维执行:
+
+- `docs/sql/20261021-coupon-exchange-permissions.sql`:补齐 9 个权限,默认仅授权 root。
+  父菜单无法自动识别时按脚本填写父菜单 id。已有权限不重复添加。
+- `docs/sql/20261021-login-audit.sql`:创建登录日志表。
+- 在角色管理中显式授权所需权限,重新保存角色刷新权限缓存,再重新登录。
+
+前端不直接操作权限表。后台登录返回的 AdminInfo 已有 `permissions` 和 `roles`,
+可沿用现有登录流程:`/manage/admin/get/loginInfo` 或 `/manage/user/get/loginInfo`。
+`/manage/menu/get/self/menu` 只返回非 button 菜单,不能从这里推断完整按钮权限。
+
+## 2. 兑换码页面(优先接入)
+
+| 入口 | 显示/请求条件 | 后端接口 |
+| --- | --- | --- |
+| 兑换码页、查询按钮、首次列表加载、翻页 | exchangeCode:view | GET /manage/exchange/code/get |
+| 生成兑换码按钮及提交 | 同时有 exchangeCode:add 和 exchangeCode:export | GET /manage/exchange/code/createAndExport |
+| 导出按钮及提交 | exchangeCode:export | GET /manage/exchange/code/export |
+
+没有 view 时不请求列表、不渲染码明文及复制按钮,展示无权限提示。
+权限异步加载完成后才决定是否首次请求;退出登录/切换账号清空列表、表单和已缓存码。
+路由守卫、按钮和点击处理函数都检查权限,不能只隐藏按钮。后端仍为最终授权边界。
+不要仅凭 root 字样在前端忽略权限码;应使用项目现有、与后端一致的权限匹配逻辑。
+
+```js
+// 概念示例,接到项目现有权限工具,不另造登录或 token 存储。
+const canView = hasPermission('exchangeCode:view');
+const canGenerate = hasPermission('exchangeCode:add') && hasPermission('exchangeCode:export');
+const canExport = hasPermission('exchangeCode:export');
+```
+
+### 2.1 查询/导出参数白名单
+
+| 参数 | 类型/规则 |
+| --- | --- |
+| goodsId | 商品 Long,可选 |
+| skuId | 规格 Long,可选 |
+| code | 完整兑换码,精确匹配,不再模糊查询 |
+| userId | 用户 Long,可选 |
+| useStatus | true/false 或 1/0;全部时省略,未使用必须显式传 false |
+| codeType | 1 兑换码、2 兑换链接;全部时省略 |
+| start | 从 1 开始的页码,默认 1 |
+| limit | 1–100,默认 10 |
+
+只发送上述字段。不要传 condition、operator、字段 `-op`、逻辑分组或动态排序。
+不再支持透传其他历史 BeanSearcher 参数;若现有页面依赖,请列清单再联调,不恢复通用参数透传。
+兑换链接筛选先解析 URL 的 code 查询参数,再传完整码本身;不要把整个 URL 直接作为 code。
+查询列表返回 `Result<SearchResult<ExchangeCodeView>>`,沿用现有 BeanSearcher 列表解析。
+导出为 xlsx,最多 10000 条,不按分页截断;超限提示缩小筛选范围。
+非 root 只能查当前创建人范围;历史创建人昵称为空或重名时后端会拒绝,前端显示后端提示。
+
+### 2.2 生成参数
+
+沿用 GET 查询参数(兼容现有页面,后续联合迁移 POST,不要预加载或自动重试该请求):
+
+```text
+skuIds=[823]
+number=10
+type=0
+codeType=1
+```
+
+- skuIds 是 JSON 数组字符串,包含 1–100 个有效规格 ID,不传 goodsIds/operator。
+- number:1–500 的整数;提交期间禁用按钮,超时后先查询核实,避免重复生成。
+- type:0 平台(默认)、1 抽奖;codeType:1 兑换码(默认)、2 链接。
+- 当前后端 number > 1 才返回 Excel;number = 1 生成后无文件响应,应刷新列表确认,
+  不能把“无下载文件”当成失败并重试。
+- 外层请求检查权限失败、参数异常时仍可能返回 JSON,不能全部保存成 Excel 文件。
+
+### 2.3 文件与错误处理
+
+查询沿用 `Result`:`code`、`msg`、`flag`、`data`,成功以现有统一拦截器判断。
+不要只依据 HTTP 200 判定业务成功。二进制下载先区分 Content-Type 是否为 JSON,
+JSON 错误解析后展示 msg,不生成错误 Excel。鉴权失效走现有重新登录流程;
+无权限展示提示,不自动重试,不降级到 external 接口。
+
+## 3. 优惠券页面
+
+| 行为 | 权限 |
+| --- | --- |
+| 查询券、分类、发放记录及统计 | coupon:view |
+| POST /manage/coupon 新增券 | coupon:add |
+| PUT /manage/coupon 及推荐、推广码、分类、活动等配置 | coupon:edit |
+| 删除券、分类、推荐、活动等记录 | coupon:delete |
+| POST /manage/coupon/send 或 /corp/send | coupon:send |
+
+其他新增配置 POST(例如分类、弹窗)目前归 coupon:edit,不是 coupon:add。
+所有 `/manage/coupon` 接口都要求后台身份,不能用前台用户 token。
+普通用户领券继续使用 `/applet/coupon/**`,不要改调后台接口。
+新增券请求剔除 id;编辑使用 PUT 且带 id。折扣 `0 < discount <= 1`,立减金额 > 0,
+金额沿用后端原有“分”单位,表单显示“元”时做好转换。
+
+## 4. 登录日志页面(新增)
+
+只允许 `roles` 精确包含 root 的后台账号访问;不包含则隐藏入口且禁止发请求。
+当前后端使用 root 角色限制,不需要新增 loginAudit:view 权限码。
+
+```text
+GET /manage/login/audit/get?start=1&limit=20
+GET /manage/login/audit/get?loginType=user&loginId=1533797&start=1&limit=20
+```
+
+筛选:loginType、loginId、account、result、loginMethod、ip、from、to;空值省略。
+start 从 1 开始,limit 1–100(默认 20);from/to 为 URL 编码后的 `yyyy-MM-dd HH:mm:ss`。
+时间沿用应用环境时区,不擅自转换两次。
+
+**注意:登录日志分页不是 BeanSearcher。** 返回 `Result<Page<LoginAudit>>`,
+列表读 `data.records`,总数读 `data.total`,当前页 `data.current`,页大小 `data.size`。
+
+建议列表列:时间、身份类型、用户 ID、账号、登录方式、结果、连接 IP、浏览器、系统、耗时。
+详情抽屉:remoteIp、forwardedFor、realIp、userAgent、device、requestPath、httpMethod、reason。
+
+| 字段 | 展示说明 |
+| --- | --- |
+| loginType | user 普通用户;login 默认后台;其他值原样显示 |
+| loginMethod | sms_code 短信、email_code 邮箱、google、wechat、mini_program 小程序 |
+| 其他方式 | password_check 后台密码预检查、admin_impersonation 管理员代登录、account_switch 切换账号、phone_or_email_code 未细分、other/unknown |
+| result | SUCCESS 会话创建成功;FAILURE 处理异常;CHECK_SUCCESS 凭据预检查通过,不能标成已登录 |
+| account/loginId | 可以为空,空值展示 —,不能据此断言异常或伪造身份 |
+| remoteIp | socket 对端,经过代理时可能是网关地址 |
+| forwardedFor/realIp | 未验证代理头,可能被伪造,界面明确标“代理头(未验证)” |
+| durationMs | 到登录事件发生时耗时,毫秒,不是完整 HTTP 请求耗时 |
+
+ip 筛选目前只精确匹配 remoteIp 或 realIp,不查询 forwardedFor 链。
+日志从部署后开始记录,不能回溯历史;未抛异常的业务失败不保证计入 FAILURE。
+不提供删除、编辑或导出日志接口。敏感字段仅按文本渲染,不使用 v-html/innerHTML。
+
+## 5. 外部接口兼容变化
+
+- GET `/external/app/get/mirror`:后台 root + exchangeCode:view。
+- PUT `/external/app/refund/{id}`:后台 root + exchangeCode:refund。
+- 普通后台角色即使有上述权限也不能调用;无第三方签名方案前不恢复匿名访问。
+- 这些不是前台列表/退款的替代接口,前端不得用它们绕过管理接口权限。
+- 不把后台 root token 嵌入公开页面或第三方客户端;需要服务间调用请另行对接专用鉴权。
+
+## 6. 联调验收清单
+
+1. 无 view:进页面、翻页、搜索均不请求;已加载列表清空,码与复制控件不可见。
+2. 只有 view:能看列表,生成/导出不可用;手动请求写接口仍被后端拒绝。
+3. 只有 add 无 export:不能生成兼导出;有 add + export 时正常提交。
+4. false 筛选未使用正常生效,全部时无 useStatus 字段;分页最多 100。
+5. 超过 500 个生成/超过 10000 条导出有明确错误提示;不误下载 JSON。
+6. root 登录日志列表可筛选、翻页、查看详情;其他角色/前台身份拒绝。
+7. 退出/切换账号不残留明文兑换码;所有 UA/账号等字段以文本展示。
+8. 新增优惠券不传 id;密码预检查通过与实际登录成功在日志界面清晰区分。
+
+上述为待执行验收项,不表示线上已经通过;后端当前编译被既有腾讯云 SDK 依赖缺失阻断。
+
+
+## 用户余额与权限管理补充
+
+- `PUT /manage/user/add/balance`:`userBalance:add`。
+- `PUT /manage/user/sub/balance`:`userBalance:deduct`。
+- `GET /manage/user/get/user/balance/sys/operate/record`:`userBalance:view`。
+- 增减请求保持 `userId`、`deductBalance`、`remark`;用户 ID 必须为正数,金额单位仍为分,必须为正整数且最多 10 位;备注必填且最多 255 字符。禁止连点提交,超时后先查账,不要自动重试增加余额。
+- SQL 脚本的 `@balance_parent_override` 必须设置为真实用户管理菜单 ID,执行后检查 12 个权限全部为 OK;未配置不会默认开放。
+- 角色、菜单和后台账号新增/修改/删除,以及后台账号停启用、重置密码,只允许精确 `root` 角色。普通角色隐藏对应写按钮;只读列表仍沿用原入口。登录入口不受 root 限制。
+- 优惠券编辑忽略客户端创建时间和删除状态,保留数据库原值;优惠券及规格关联在事务内更新。
+- 现有余额流水与操作日志继续保留。当前增额接口没有业务幂等键;拥有权限的操作员多次提交仍可能重复加款,前端禁连点不能替代后端幂等。
+
+### 上线验收(在测试库进行)
+1. 匿名、前台用户 token、无对应权限后台账号均不能增减余额、生成/查看/导出兑换码、创建/修改优惠券;核对数据库无变化。
+2. 已授权后台账号可以执行对应动作;停用账号不得增减余额。
+3. 无 root 角色不能修改角色权限、菜单权限、后台账号或重置管理员密码。
+4. 余额金额为 0、负数、小数、超过 10 位或备注为空时拒绝;合法请求金额和流水一致,余额竞争更新失败时不产生流水。
+5. 修改优惠券同时提交伪造 createdTime,确认原创建时间不变。
+6. 执行 SQL、部署后重新登录刷新权限;历史异常优惠券/兑换码不会因部署自动作废,需要单独核查处理。

+ 50 - 0
docs/login-audit.md

@@ -0,0 +1,50 @@
+# 登录审计
+
+## 发布顺序
+
+1. 在应用数据库执行 `docs/sql/20261021-login-audit.sql`。
+2. 构建、部署应用。不能回溯部署前的登录,旧事件仍需查网关日志。
+3. 使用后台 root 凭证访问 `GET /manage/login/audit/get?start=1&limit=20`。
+   当前交付查询接口和表,不包含单独前端页面,前端项目不在此仓库。
+
+## 查询
+
+支持 `loginType`、`loginId`、`account`、`result`、`loginMethod`、`ip`、`from`、`to`。
+时间格式 `yyyy-MM-dd HH:mm:ss`,URL 编码空格;沿用应用/数据库时间设置。
+每页最多 100 条,按 id 倒序;只有后台精确角色 root 可以读取。
+
+```text
+/manage/login/audit/get?loginType=user&loginId=1533797&start=1&limit=20
+/manage/login/audit/get?result=FAILURE&start=1&limit=20
+```
+
+## 字段与语义
+
+- `loginType`:Sa-Token 身份域(普通用户 user,默认后台 login,其他身份域保留原值)。
+- `loginId`:实际创建会话的身份 ID;失败时不猜测目标 ID。
+- `account`:当前请求白名单 phone/email/login 字段;微信等没有提交账号的请求可为空。
+- `loginMethod`:短信、邮箱、Google、微信、小程序、后台凭据检查、管理员代登录、切换账号等;
+  未识别入口标记 other,不猜测。方式来自已执行接口和安全字段,UA 仅辅助证据。
+- `SUCCESS/session_created`:全局 Sa-Token doLogin 事件,覆盖应用创建的各类登录会话。
+- `CHECK_SUCCESS/password_check_passed`:后台密码预检查通过,不等于已签发登录会话。
+- `FAILURE`:登录处理入口抛出异常,原因记录异常类型,不保存可能含凭据的异常原文。
+  微信发起授权/轮询未完成不计成功;仅返回业务失败而未抛异常的第三方入口需另行适配。
+- `remoteIp`:真实 socket 对端地址。`forwardedFor`、`realIp` 原样限长留存,
+  是未验证代理头,可能伪造,不当作已确认客户端 IP。ip 筛选匹配 remoteIp 或 realIp。
+- `userAgent`、`browser`、`os`、`device`:浏览器原始 UA、粗粒度解析、Sa-Token 设备。
+- `requestPath`、`httpMethod`:不含查询字符串;不记录请求体、Cookie、Authorization、密码、验证码、token。
+- `createdTime`、`durationMs`:事件时间和到事件发生时的耗时(不是整个 HTTP 请求耗时)。
+
+审计单独事务写入,不跟随登录业务事务回滚;失败不阻断登录,会输出
+`LOGIN_AUDIT_WRITE_FAILED` 和白名单字段的 `LOGIN_AUDIT_FALLBACK`,需采集应用日志并告警。
+数据库/文件故障或进程中断仍可能丢日志;生产应配合独立日志采集与备份。
+
+## 待执行验收
+
+- 短信/邮箱/微信/Google/后台实际登录各生成 SUCCESS,凭据预检查单独标记 CHECK_SUCCESS。
+- 密码错误、验证码错误抛异常时生成 FAILURE,账号、连接 IP 和 UA 可查询。
+- 普通用户及非 root 后台请求查询接口被拒绝。
+- 检查数据库和兜底日志不含密码、验证码、完整 token。
+- 故意中断测试库审计表写入,确认业务不受影响且出现兜底日志。
+
+尚未完成在线验收;本地 Maven 当前受现有腾讯云 SDK 依赖缺失阻断。

+ 20 - 0
docs/refund-permissions.md

@@ -0,0 +1,20 @@
+# 后台退款权限
+
+本次覆盖14个后台人工退款写入口:普通/套餐/差价/余额转退、企微、注册商品、临时账号、批发/押金、镜像店费用、Spotify升级、会员及特殊支付订单。
+
+- 普通人工退款统一要求 `order:refund`;它覆盖上述多种业务,请只授权实际退款人员。
+- 余额扣回并转原渠道退款独立要求 `order:refundTransfer`。
+- 注册商品微信退款保留原 `sign:refund`,与 `order:refund` 同时满足。
+- 所有入口明确校验后台登录,退款切面再校验权限与后台账户启用状态。
+- `/external/app/refund/{id}` 沿用之前的 root + exchangeCode:refund,不改为普通退款权限。
+- 支付回调保持原路径和处理,不附加后台权限。本次未验证回调签名安全或退款金额/幂等的全部业务逻辑。
+
+## 企业微信兼容变化
+`/manage/corp/unified/refund` 原来从 Cookie 直接读取员工标识,不再据此允许退款。现在必须提供后台登录态及 order:refund,操作人来自服务端后台登录ID。只有企微Cookie的旧客户端会被拒绝,需登录后台办理或另建服务端可验证的企微身份集成,不能恢复信任裸Cookie。
+
+## 上线
+先在 docs/sql/20261021-refund-permissions.sql 设置真实订单菜单父ID,再执行脚本,两个权限输出均为OK。默认仅root授权,其他角色显式授权并重新登录。原有12权限之外新增2项,总共14项(登录日志仍按root控制)。
+前端统一请求层已拦截人工退款,主订单/套餐退款按钮、余额转退按钮同步控制;其他复用按钮可能仍显示,但未授权不能通过请求层和后端执行。
+
+## 验证
+新增 RefundPermissionTest 覆盖14入口注解与回调排除;前端新增退款策略测试。Java测试尚未执行通过(当前本地Maven依赖未解决)。发布前在测试环境验证匿名/前台/无权限/停用后台均无法退款,有对应权限后台成功;只伪造企微Cookie应拒绝。未执行任何真实退款。

+ 23 - 0
docs/security-priority-review.md

@@ -0,0 +1,23 @@
+# 重点安全复查 2026-10-21
+
+## 本轮修复:支付商户管理
+1. /manage/shop CRUD 原无细分权限,现在分别 merchant:view/add/edit/delete;限单配置、税率配置及渠道商户切换受对应权限保护。
+2. 商户列表原直接序列化实体,包含 appPrivateKey、secret。现在响应移除两字段;仅保留类型及分页白名单,避免利用通用查询参数筛选秘密字段。
+3. 编辑密钥不回显旧值,留空保留原值;前端编辑不强制填写新密钥。商户类型和appId不允许原地修改,避免错配已有支付路由;更换时新增商户并明确迁移。
+4. sys_default_shop_key 经通用 /sys/get/post/update/delete 操作时,服务端根据真实配置key校验商户权限,不能通过配置ID绕过。
+5. 新增商户拒绝传入ID,系统时间由服务端控制。
+
+## 上线
+执行 docs/sql/20261021-merchant-permissions.sql,填写商户菜单父ID,确认五行OK。其他角色显式授权,商户下拉选项的合法使用者也需要merchant:view。默认只有root获得新增权限。
+原12权限 + 退款2 + 商户5 = 19个权限项(merchant:updateChannelShop可能已存在,不重复插入)。尚未执行生产SQL或部署。
+编辑密钥不会清空旧值,无“删除密钥”接口;创建商户必须填写对应密钥。商户删除仍需人工核查订单/渠道关联,本轮没有重构商户生命周期。
+
+## 仍需继续处理,不能宣称全修完
+- 加余额目前只有并发余额条件更新和前端防连点,没有持久业务幂等键,超时重试/多端重复提交可能重复加款。
+- 部分退款使用短时Redis锁,不等同于支付渠道/数据库完整幂等;需要专门在测试库验证超时、并发和回调重放。
+- 历史已泄漏券码、私钥及异常优惠券不会随部署自动失效,需核查访问日志、异常数据并视情况轮换商户密钥。
+- 优惠券领取并发、兑换码消费原子性及其他后台旁路接口仍需完整动态验收,前端构建和权限注解检查不能证明这些安全。
+- 本轮不评估其他前台商品商店 /manage/shop/get/goods 等业务;它们与支付商户共用路径前缀,未盲目添加错误权限。
+
+## 验收
+测试库验证匿名/普通后台/仅查询/编辑/停用账号;检查商户列表响应不含密钥明文、空密钥编辑保留原值、通用配置ID不可绕过权限。无生产写入、无真实退款。

+ 19 - 0
docs/sql/20261021-admin-login-guard.sql

@@ -0,0 +1,19 @@
+-- Deploy before the application. No automatic expiry or browser unlock.
+CREATE TABLE IF NOT EXISTS admin_login_guard (
+ account_type VARCHAR(16) NOT NULL,
+ account_id BIGINT NOT NULL,
+ failed_count INT NOT NULL DEFAULT 0,
+ locked TINYINT(1) NOT NULL DEFAULT 0,
+ last_failure_time DATETIME NULL,
+ locked_time DATETIME NULL,
+ PRIMARY KEY(account_type, account_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- Developer-only manual recovery example. Verify identity and investigate first.
+-- Replace 123 with the verified account ID; use admin instead of cms_user for legacy admins.
+-- START TRANSACTION;
+-- UPDATE admin_login_guard SET failed_count=0, locked=0, locked_time=NULL
+-- WHERE account_type='cms_user' AND account_id=123;
+-- UPDATE cms_user SET status=1 WHERE id=123;
+-- COMMIT;
+-- Resetting a password or toggling status in the UI DOES NOT clear the guard lock.

+ 10 - 0
docs/sql/20261021-balance-idempotency.sql

@@ -0,0 +1,10 @@
+CREATE TABLE IF NOT EXISTS admin_balance_request (
+ admin_id BIGINT NOT NULL,
+ operation VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
+ request_id VARCHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
+ payload TEXT NOT NULL,
+ completed TINYINT(1) NOT NULL DEFAULT 0,
+ created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY(admin_id,operation,request_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+-- Keep records: deleting a completed key allows that request to be executed again.

+ 77 - 0
docs/sql/20261021-coupon-exchange-permissions.sql

@@ -0,0 +1,77 @@
+-- 优惠券 + 商品兑换码权限。请在应用数据库执行;重复串行执行不会重复插入。
+-- 如自动识别失败/存在同名菜单,请将下面两个 NULL 改成实际父菜单 id。
+-- 不创建前端路由,不改已有权限,不给普通角色扩权。
+SET @coupon_parent_override = NULL;
+SET @exchange_parent_override = NULL;
+-- Set this to the actual user-management menu ID before running balance grants.
+SET @balance_parent_override = NULL;
+
+SET @coupon_parent = COALESCE(@coupon_parent_override, (
+    SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
+    FROM cms_menu WHERE type <> 'button' AND (title = '优惠券' OR menu_name = '优惠券')
+));
+SET @exchange_parent = COALESCE(@exchange_parent_override, (
+    SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
+    FROM cms_menu WHERE type <> 'button' AND (title = '兑换码' OR menu_name = '兑换码')
+));
+
+DROP TEMPORARY TABLE IF EXISTS tmp_coupon_exchange_permissions;
+CREATE TEMPORARY TABLE tmp_coupon_exchange_permissions (
+    title VARCHAR(64) NOT NULL,
+    perms VARCHAR(64) NOT NULL PRIMARY KEY,
+    parent_id BIGINT NULL,
+    sort_num INT NOT NULL
+);
+INSERT INTO tmp_coupon_exchange_permissions VALUES
+('优惠券查询', 'coupon:view', @coupon_parent, 1),
+('优惠券新增', 'coupon:add', @coupon_parent, 2),
+('优惠券编辑及配置', 'coupon:edit', @coupon_parent, 3),
+('优惠券删除', 'coupon:delete', @coupon_parent, 4),
+('优惠券发放', 'coupon:send', @coupon_parent, 5),
+('兑换码查询', 'exchangeCode:view', @exchange_parent, 1),
+('兑换码生成', 'exchangeCode:add', @exchange_parent, 2),
+('兑换码导出', 'exchangeCode:export', @exchange_parent, 3),
+('兑换码退款重发', 'exchangeCode:refund', @exchange_parent, 4),
+('增加用户余额', 'userBalance:add', @balance_parent_override, 1),
+('扣除用户余额', 'userBalance:deduct', @balance_parent_override, 2),
+('余额操作记录', 'userBalance:view', @balance_parent_override, 3);
+
+START TRANSACTION;
+INSERT INTO cms_menu
+    (title, menu_name, perms, type, path, order_by, parent_id, created_time, update_time)
+SELECT p.title, p.perms, p.perms, 'button', '', p.sort_num, p.parent_id, NOW(), NOW()
+FROM tmp_coupon_exchange_permissions p
+INNER JOIN cms_menu parent ON parent.id = p.parent_id AND parent.type <> 'button'
+WHERE NOT EXISTS (SELECT 1 FROM cms_menu existing WHERE existing.perms = p.perms);
+
+-- 只授权名称精确为 root 的角色;其他角色在后台角色管理中显式授权。
+INSERT INTO cms_role_menu (role_id, menu_id, created_time, update_time)
+SELECT r.id, m.id, NOW(), NOW()
+FROM cms_role r
+INNER JOIN cms_menu m ON 1 = 1
+INNER JOIN tmp_coupon_exchange_permissions p ON p.perms = m.perms
+WHERE r.role_name = 'root'
+  AND NOT EXISTS (
+      SELECT 1 FROM cms_role_menu existing
+      WHERE existing.role_id = r.id AND existing.menu_id = m.id
+  );
+COMMIT;
+
+-- 检查结果:12 个权限均应有 menu_id;缺失时指定上面的父菜单 id 再执行。
+SELECT p.perms, m.id AS menu_id, m.parent_id,
+       CASE WHEN m.id IS NULL THEN 'MISSING: set parent override and rerun' ELSE 'OK' END AS result
+FROM tmp_coupon_exchange_permissions p
+LEFT JOIN cms_menu m ON m.perms = p.perms
+ORDER BY p.perms;
+
+SELECT r.id AS role_id, r.role_name, m.perms
+FROM cms_role_menu rm
+INNER JOIN cms_role r ON r.id = rm.role_id
+INNER JOIN cms_menu m ON m.id = rm.menu_id
+INNER JOIN tmp_coupon_exchange_permissions p ON p.perms = m.perms
+WHERE r.role_name = 'root'
+ORDER BY m.perms;
+
+DROP TEMPORARY TABLE tmp_coupon_exchange_permissions;
+-- 执行后通过后台重新保存受影响角色权限以触发缓存刷新,再重新登录验证。
+-- 本文件不自动连接生产库,也不删除异常优惠券或历史数据。

+ 32 - 0
docs/sql/20261021-login-audit.sql

@@ -0,0 +1,32 @@
+-- 在应用数据库执行;不会自动执行或修改历史登录数据。
+CREATE TABLE IF NOT EXISTS login_audit (
+    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+    login_type VARCHAR(32) NULL,
+    login_id VARCHAR(64) NULL,
+    account VARCHAR(256) NULL,
+    login_method VARCHAR(64) NOT NULL,
+    result VARCHAR(32) NOT NULL,
+    reason VARCHAR(128) NULL,
+    remote_ip VARCHAR(64) NULL,
+    forwarded_for VARCHAR(1024) NULL,
+    real_ip VARCHAR(64) NULL,
+    user_agent VARCHAR(1024) NULL,
+    browser VARCHAR(64) NULL,
+    os VARCHAR(64) NULL,
+    device VARCHAR(128) NULL,
+    request_path VARCHAR(512) NULL,
+    http_method VARCHAR(16) NULL,
+    duration_ms BIGINT NULL,
+    created_time DATETIME NOT NULL,
+    update_time DATETIME NOT NULL,
+    KEY idx_login_identity (login_type, login_id, created_time),
+    KEY idx_login_account (account(100), created_time),
+    KEY idx_login_remote (remote_ip, created_time),
+    KEY idx_login_time (created_time),
+    KEY idx_login_result (result, created_time)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- 先核实后台日志父菜单 id,再在现有菜单管理添加页面。
+-- 查询接口仅 root 可访问,不接受普通用户 token。
+-- 示例只读核查:
+-- SELECT * FROM login_audit ORDER BY id DESC LIMIT 100;

+ 15 - 0
docs/sql/20261021-merchant-permissions.sql

@@ -0,0 +1,15 @@
+-- Set the existing merchant-management parent menu ID before running.
+SET @merchant_parent = NULL;
+START TRANSACTION;
+INSERT INTO cms_menu (title,menu_name,perms,type,path,order_by,parent_id,created_time,update_time)
+SELECT p.title,p.perms,p.perms,'button','',p.sort_num,m.id,NOW(),NOW()
+FROM (SELECT '商户查询' title,'merchant:view' perms,1 sort_num UNION ALL SELECT '新增商户','merchant:add',2 UNION ALL SELECT '编辑商户和收款配置','merchant:edit',3 UNION ALL SELECT '删除商户配置','merchant:delete',4 UNION ALL SELECT '渠道商户切换','merchant:updateChannelShop',5) p
+JOIN cms_menu m ON m.id=@merchant_parent AND m.type<>'button'
+WHERE NOT EXISTS (SELECT 1 FROM cms_menu e WHERE e.perms=p.perms);
+INSERT INTO cms_role_menu (role_id,menu_id,created_time,update_time)
+SELECT r.id,m.id,NOW(),NOW() FROM cms_role r JOIN cms_menu m ON m.perms IN ('merchant:view','merchant:add','merchant:edit','merchant:delete','merchant:updateChannelShop')
+WHERE r.role_name='root' AND NOT EXISTS (SELECT 1 FROM cms_role_menu e WHERE e.role_id=r.id AND e.menu_id=m.id);
+COMMIT;
+SELECT p.perms,m.id,IF(m.id IS NULL,'MISSING','OK') result
+FROM (SELECT 'merchant:view' perms UNION ALL SELECT 'merchant:add' UNION ALL SELECT 'merchant:edit' UNION ALL SELECT 'merchant:delete' UNION ALL SELECT 'merchant:updateChannelShop') p LEFT JOIN cms_menu m ON m.perms=p.perms;
+-- All five rows must be OK. Assign other roles explicitly, refresh permissions and re-login.

+ 8 - 0
docs/sql/20261021-refund-intent.sql

@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS payment_refund_intent (
+ refund_no VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL PRIMARY KEY,
+ order_id BIGINT NOT NULL,
+ amount DECIMAL(20,0) NOT NULL,
+ created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_refund_intent_order(order_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+-- Never delete an uncertain intent merely to retry with a different amount.

+ 15 - 0
docs/sql/20261021-refund-permissions.sql

@@ -0,0 +1,15 @@
+-- Set the existing order-management parent menu ID before running.
+SET @refund_parent = NULL;
+START TRANSACTION;
+INSERT INTO cms_menu (title,menu_name,perms,type,path,order_by,parent_id,created_time,update_time)
+SELECT p.title,p.perms,p.perms,'button','',p.sort_num,m.id,NOW(),NOW()
+FROM (SELECT '人工退款' title,'order:refund' perms,1 sort_num UNION ALL SELECT '余额转原渠道退款','order:refundTransfer',2) p
+JOIN cms_menu m ON m.id=@refund_parent AND m.type<>'button'
+WHERE NOT EXISTS (SELECT 1 FROM cms_menu e WHERE e.perms=p.perms);
+INSERT INTO cms_role_menu (role_id,menu_id,created_time,update_time)
+SELECT r.id,m.id,NOW(),NOW() FROM cms_role r JOIN cms_menu m ON m.perms IN ('order:refund','order:refundTransfer')
+WHERE r.role_name='root' AND NOT EXISTS (SELECT 1 FROM cms_role_menu e WHERE e.role_id=r.id AND e.menu_id=m.id);
+COMMIT;
+SELECT p.perms,m.id,IF(m.id IS NULL,'MISSING','OK') result
+FROM (SELECT 'order:refund' perms UNION ALL SELECT 'order:refundTransfer') p LEFT JOIN cms_menu m ON m.perms=p.perms;
+-- Both rows must be OK. Assign other roles explicitly, refresh permissions and re-login.

+ 2 - 0
netflix-common/src/main/resources/fastjson.properties

@@ -0,0 +1,2 @@
+fastjson.parser.safeMode=true
+fastjson.parser.autoTypeSupport=false

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/mapper/LoginAuditMapper.java

@@ -0,0 +1,9 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.LoginAudit;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LoginAuditMapper extends BaseMapper<LoginAudit> {
+}

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/LoginAudit.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class LoginAudit extends BaseEntity {
+    private String loginType;
+    private String loginId;
+    private String account;
+    private String loginMethod;
+    private String result;
+    private String reason;
+    private String remoteIp;
+    private String forwardedFor;
+    private String realIp;
+    private String userAgent;
+    private String browser;
+    private String os;
+    private String device;
+    private String requestPath;
+    private String httpMethod;
+    private Long durationMs;
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelExchangeCodeData.java

@@ -21,7 +21,7 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id",
-		where = "1=1 :condition:")
+		where = "ec.type = 0 :condition:")
 public class ExcelExchangeCodeData {
 
 	/**

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/request/UserBalanceReq.java

@@ -4,6 +4,10 @@ import lombok.Getter;
 import lombok.Setter;
 
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.math.BigDecimal;
 
 /**
@@ -16,10 +20,15 @@ import java.math.BigDecimal;
 @Setter
 public class UserBalanceReq {
 	@NotNull
+	@Positive
 	private Long userId;
 
 	@NotNull
+	@Positive
+	@Digits(integer = 10, fraction = 0)
 	private BigDecimal deductBalance;
 
+	@NotBlank
+	@Size(max = 255)
 	private String remark;
 }

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.exchange.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -107,11 +108,24 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) throws Exception {
+		if (exchangeCodeReq.getNumber() == null || exchangeCodeReq.getNumber() < 1
+				|| exchangeCodeReq.getNumber() > 500) {
+			throw BusinessRuntimeException.getInstance("每次只能生成1至500个兑换码");
+		}
 		String skuIds = exchangeCodeReq.getSkuIds();
+		if (exchangeCodeReq.getType() == null) exchangeCodeReq.setType(0);
+		if (exchangeCodeReq.getCodeType() == null) exchangeCodeReq.setCodeType(1);
+		if (!List.of(0, 1).contains(exchangeCodeReq.getType())
+				|| !List.of(1, 2).contains(exchangeCodeReq.getCodeType())) {
+			throw BusinessRuntimeException.getInstance("兑换码类型参数错误");
+		}
 		if (StrUtil.isEmpty(skuIds)) {
 			throw BusinessRuntimeException.getInstance("请选择对应规格");
 		}
 		List<Long> skuList = Jsons.parseList(skuIds, Long.class);
+		if (CollUtil.isEmpty(skuList) || skuList.size() > 100) {
+			throw BusinessRuntimeException.getInstance("请选择1至100个规格");
+		}
 		Integer skuCount = goodsDonSkuMapper.selectCount(Wrappers.lambdaQuery(GoodsDonSku.class)
 				.in(GoodsDonSku::getId, skuList));
 		if (skuCount != skuList.size()) {

+ 11 - 3
netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java

@@ -58,10 +58,14 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void saveCoupon(Coupon coupon) throws Exception {
+		if (coupon.getId() != null) {
+			throw BusinessRuntimeException.getInstance("新增优惠券不能指定id,请使用编辑接口");
+		}
 		checkCouponParamsAndSaveOrUpdate(coupon);
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void updateCoupon(Coupon coupon) throws Exception {
 		if (coupon.getId() == null || coupon.getId() < 1) {
 			throw BusinessRuntimeException.getInstance("请输入正确的优惠券id");
@@ -77,6 +81,9 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 		if (entity == null || !entity.getDeleted()) {
 			throw BusinessRuntimeException.getInstance("该优惠券不存在");
 		}
+		// Creation time and deletion state are server-owned, never editable by request binding.
+		coupon.setCreatedTime(entity.getCreatedTime());
+		coupon.setDeleted(entity.getDeleted());
 		checkCouponParamsAndSaveOrUpdate(coupon);
 	}
 
@@ -201,16 +208,17 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 
 	public void checkCouponParamsAndSaveOrUpdate(Coupon coupon) throws Exception {
 		List<Coupon.CouponGoodsSku> goodsSkuList = Jsons.parseList(coupon.getGoodsSkuIds(), Coupon.CouponGoodsSku.class);
-		if (goodsSkuList.isEmpty()) {
+		if (goodsSkuList == null || goodsSkuList.isEmpty()) {
 			throw BusinessRuntimeException.getInstance("所选规格不存在");
 		}
 		if (coupon.getType() == Coupon.Type.discount) {
-			if (coupon.getDiscount() == null || (coupon.getDiscount().compareTo(BigDecimal.ZERO) < 0 && coupon.getDiscount().compareTo(BigDecimal.ZERO) > 0)) {
+			if (coupon.getDiscount() == null || coupon.getDiscount().compareTo(BigDecimal.ZERO) <= 0
+					|| coupon.getDiscount().compareTo(BigDecimal.ONE) > 0) {
 				throw BusinessRuntimeException.getInstance("请输入正确的折扣");
 			}
 		}
 		if (coupon.getType() == Coupon.Type.reduce) {
-			if (coupon.getReduceMoney() == null) {
+			if (coupon.getReduceMoney() == null || coupon.getReduceMoney().signum() <= 0) {
 				throw BusinessRuntimeException.getInstance("请配置其立减金额");
 			}
 

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -405,6 +405,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     @Override
     public void unifiedRefund(OrderRefundReq refundReq) throws Exception {
         OrderDon orderDon = orderDonMapper.selectById(refundReq.getOrderId());
+        if (orderDon == null) throw BusinessRuntimeException.getInstance("订单不存在");
         boolean multiQuantityOrder = orderDon != null
                 && orderDonTicketRecordService.exists(orderDon.getId());
         if (multiQuantityOrder) {
@@ -946,6 +947,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     @Transactional(rollbackFor = Throwable.class)
     public void unifiedUpgradeRefund(OrderRefundReq refundReq) throws Exception {
         UpgradeOrderDon orderDon = upgradeOrderDonMapper.selectById(refundReq.getOrderId());
+        if (orderDon == null) throw BusinessRuntimeException.getInstance("套餐订单不存在");
         UpgradePackage upgradePackage = upgradePackageMapper.selectById(orderDon.getPackageId());
         if (StrUtil.isEmpty(refundReq.getRefundType())) {
             refundReq.setRefundType("money");

+ 22 - 0
netflix-service/src/main/java/com/cyksj/service/order/RefundIntentService.java

@@ -0,0 +1,22 @@
+package com.cyksj.service.order;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.annotation.Propagation;
+import java.math.BigDecimal;
+import java.util.Map;
+@Service
+@RequiredArgsConstructor
+public class RefundIntentService {
+ private final JdbcTemplate jdbc;
+ /** Persist before any external payment call, even if the caller later rolls back. */
+ @Transactional(propagation=Propagation.REQUIRES_NEW,rollbackFor=Throwable.class)
+ public void bind(String refundNo, Long orderId, BigDecimal amount) {
+  if(amount==null || amount.signum()<=0 || amount.stripTrailingZeros().scale()>0) throw BusinessRuntimeException.getInstance("退款金额必须为正整数分");
+  jdbc.update("INSERT INTO payment_refund_intent(refund_no,order_id,amount) VALUES(?,?,?) ON DUPLICATE KEY UPDATE refund_no=VALUES(refund_no)",refundNo,orderId,amount);
+  Map<String,Object> row=jdbc.queryForMap("SELECT order_id,amount FROM payment_refund_intent WHERE refund_no=? FOR UPDATE",refundNo);
+  if(((Number)row.get("order_id")).longValue()!=orderId || new BigDecimal(row.get("amount").toString()).compareTo(amount)!=0) throw BusinessRuntimeException.getInstance("已有未核实退款请求,金额不可变更,请先核对渠道退款结果");
+ }
+}

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/order/RefundRequestNumber.java

@@ -0,0 +1,21 @@
+package com.cyksj.service.order;
+import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+/** One channel request per persisted cash-refund position; time is never part of the key. */
+public final class RefundRequestNumber {
+ private RefundRequestNumber() { }
+ public static String forOrder(Long orderId, BigDecimal recordedRefund) {
+  if(orderId==null || orderId<=0) throw new IllegalArgumentException("Invalid order ID");
+  BigDecimal amount=recordedRefund==null?BigDecimal.ZERO:recordedRefund;
+  if(amount.signum()<0) throw new IllegalArgumentException("Invalid recorded refund");
+  String input="standard-refund-v1:"+orderId+":"+amount.stripTrailingZeros().toPlainString();
+  try {
+   byte[] hash=MessageDigest.getInstance("SHA-256").digest(input.getBytes(StandardCharsets.UTF_8));
+   StringBuilder out=new StringBuilder(32);
+   for(int i=0;i<16;i++) out.append(String.format("%02x",hash[i] & 255));
+   return out.toString();
+  } catch(NoSuchAlgorithmException e) { throw new IllegalStateException(e); }
+ }
+}

+ 9 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java

@@ -48,6 +48,7 @@ import java.util.Optional;
 @Slf4j
 @RequiredArgsConstructor
 public class OrderRefundServiceImpl implements OrderRefundService {
+    private final com.cyksj.service.order.RefundIntentService refundIntentService;
 
 	private final OrderDonMapper orderDonMapper;
 
@@ -82,6 +83,14 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 				&& StrUtil.isBlank(outRefundNo)) {
 			throw BusinessRuntimeException.getInstance("批量订单必须走整单退款流程");
 		}
+
+        // A timeout must not mint a fresh channel refund number on retry.
+        // Preserve explicit batch IDs and PayPal's separate integration contract.
+        if (StrUtil.isBlank(outRefundNo) && !OrderDon.Type.BALANCE.getType().equals(refundReq.getRefundType()) && (orderDon.getType() == OrderDon.Type.WeChat
+                || orderDon.getType() == OrderDon.Type.ALI_PAY || orderDon.getType() == OrderDon.Type.STRIPE)) {
+            outRefundNo = com.cyksj.service.order.RefundRequestNumber.forOrder(orderDon.getId(), orderDon.getRefundMoney());
+            refundIntentService.bind(outRefundNo, orderDon.getId(), refundReq.getRefundMoney());
+        }
 		OrderDon.Type type = orderDon.getType();
 		String refundType = refundReq.getRefundType();
 		if (type == OrderDon.Type.WeChat && !refundType.equals(OrderDon.Type.BALANCE.getType())) {

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/user/LoginAuditWriter.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.user;
+
+import com.cyksj.mapper.LoginAuditMapper;
+import com.cyksj.model.entity.LoginAudit;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@RequiredArgsConstructor
+public class LoginAuditWriter {
+    private final LoginAuditMapper mapper;
+
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void write(LoginAudit audit) {
+        mapper.insert(audit);
+    }
+}

+ 15 - 0
netflix-web/pom.xml

@@ -12,6 +12,16 @@
     <artifactId>netflix-web</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -70,6 +80,11 @@
     </dependencies>
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.22.2</version>
+            </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>

+ 3 - 1
netflix-web/src/main/java/com/cyksj/Application.java

@@ -20,7 +20,9 @@ import org.springframework.validation.beanvalidation.MethodValidationPostProcess
 public class Application {
 
 	public static void main(String[] args) {
-		SpringApplication.run(Application.class, args);
+		System.setProperty("fastjson.parser.safeMode", "true");
+        System.setProperty("fastjson.parser.autoTypeSupport", "false");
+        SpringApplication.run(Application.class, args);
 	}
 
 

+ 67 - 0
netflix-web/src/main/java/com/cyksj/aspect/LoginAttemptAspect.java

@@ -0,0 +1,67 @@
+package com.cyksj.aspect;
+
+import lombok.RequiredArgsConstructor;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class LoginAttemptAspect {
+    private final LoginAuditRecorder recorder;
+
+    @Around("execution(public * com.cyksj.web.controller..*(..)) && @within(org.springframework.web.bind.annotation.RestController)")
+    public Object audit(ProceedingJoinPoint point) throws Throwable {
+        HttpServletRequest req = LoginAuditRecorder.request();
+        if (req == null) return point.proceed();
+        req.setAttribute(LoginAuditRecorder.START, System.nanoTime());
+        String path = req.getRequestURI();
+        boolean attempt = path.endsWith("/login") || path.endsWith("/login/phone")
+                || path.endsWith("/get/loginInfo") || path.contains("baseRedirect")
+                || path.endsWith("/checkQrCode") || path.endsWith("/switch/account")
+                || path.endsWith("/get/yh/user/token");
+        if (!attempt) return point.proceed();
+        String method = LoginAuditRecorder.inferMethod(path);
+        String account = null;
+        // 只读取账号白名单字段,绝不序列化整个参数对象。
+        for (String name : new String[]{"phone", "email", "login"}) {
+            String value = req.getParameter(name);
+            if (value != null && !value.isBlank()) { account = value; break; }
+        }
+        for (Object arg : point.getArgs()) {
+            if (arg == null || !arg.getClass().getName().startsWith("com.cyksj.model.")) continue;
+            BeanWrapper bean = new BeanWrapperImpl(arg);
+            for (String name : new String[]{"phone", "email", "login"}) {
+                if (!bean.isReadableProperty(name)) continue;
+                Object value = bean.getPropertyValue(name);
+                if (value instanceof String && !((String) value).isBlank()) {
+                    account = (String) value;
+                    break;
+                }
+            }
+            if (path.endsWith("/login/phone") && bean.isReadableProperty("type")) {
+                Object type = bean.getPropertyValue("type");
+                method = Integer.valueOf(2).equals(type) ? "email_code" : "sms_code";
+            }
+        }
+        req.setAttribute(LoginAuditRecorder.ACCOUNT, LoginAuditRecorder.clean(account, 256));
+        req.setAttribute(LoginAuditRecorder.METHOD, method);
+        String loginType = path.contains("/manage/") ? "login" : "user";
+        try {
+            Object result = point.proceed();
+            // 密码检查接口不创建 session,不能伪称真正登录成功。
+            if ("password_check".equals(method)) {
+                recorder.record(loginType, null, "CHECK_SUCCESS", "password_check_passed", null);
+            }
+            return result;
+        } catch (Throwable e) {
+            recorder.record(loginType, null, "FAILURE", e.getClass().getSimpleName(), null);
+            throw e;
+        }
+    }
+}

+ 24 - 0
netflix-web/src/main/java/com/cyksj/aspect/LoginAuditListener.java

@@ -0,0 +1,24 @@
+package com.cyksj.aspect;
+
+import cn.dev33.satoken.listener.SaTokenListener;
+import cn.dev33.satoken.stp.SaLoginModel;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class LoginAuditListener implements SaTokenListener {
+    private final LoginAuditRecorder recorder;
+
+    @Override
+    public void doLogin(String type, Object id, SaLoginModel model) {
+        recorder.record(type, id, "SUCCESS", "session_created", model == null ? null : model.getDevice());
+    }
+    @Override public void doLogout(String type, Object id, String token) { }
+    @Override public void doLogoutByLoginId(String type, Object id, String device, String token) { }
+    @Override public void doReplaced(String type, Object id, String device, String token) { }
+    @Override public void doDisable(String type, Object id, long time) { }
+    @Override public void doUntieDisable(String type, Object id) { }
+    @Override public void doCreateSession(String id) { }
+    @Override public void doLogoutSession(String id) { }
+}

+ 95 - 0
netflix-web/src/main/java/com/cyksj/aspect/LoginAuditRecorder.java

@@ -0,0 +1,95 @@
+package com.cyksj.aspect;
+
+import com.cyksj.model.entity.LoginAudit;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.service.user.LoginAuditWriter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Locale;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class LoginAuditRecorder {
+    static final String ACCOUNT = LoginAuditRecorder.class.getName() + ".account";
+    static final String METHOD = LoginAuditRecorder.class.getName() + ".method";
+    static final String START = LoginAuditRecorder.class.getName() + ".start";
+
+    public static HttpServletRequest request() {
+        if (!(RequestContextHolder.getRequestAttributes() instanceof ServletRequestAttributes)) return null;
+        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+    }
+
+    private final LoginAuditWriter writer;
+
+    public void record(String loginType, Object id, String result, String reason, String device) {
+        HttpServletRequest req = request();
+        LoginAudit audit = new LoginAudit();
+        audit.setCreatedTime(new Date());
+        audit.setUpdateTime(audit.getCreatedTime());
+        audit.setLoginType(clean(loginType, 32));
+        audit.setLoginId(id == null ? null : clean(String.valueOf(id), 64));
+        audit.setResult(result);
+        audit.setReason(clean(reason, 128));
+        audit.setDevice(clean(device, 128));
+        audit.setLoginMethod("unknown");
+        if (req != null) {
+            audit.setAccount(clean((String) req.getAttribute(ACCOUNT), 256));
+            String method = (String) req.getAttribute(METHOD);
+            audit.setLoginMethod(method == null ? inferMethod(req.getRequestURI()) : method);
+            // remoteIp 是直接连接地址;代理头仅作为未验证证据保存,不能用于鉴权。
+            audit.setRemoteIp(clean(req.getRemoteAddr(), 64));
+            audit.setForwardedFor(clean(req.getHeader("X-Forwarded-For"), 1024));
+            audit.setRealIp(clean(req.getHeader("X-Real-IP"), 64));
+            audit.setUserAgent(clean(req.getHeader("User-Agent"), 1024));
+            String ua = audit.getUserAgent() == null ? "" : audit.getUserAgent().toLowerCase(Locale.ROOT);
+            audit.setBrowser(ua.contains("micromessenger") ? "WeChat" : ua.contains("edg/") ? "Edge"
+                    : ua.contains("chrome/") ? "Chrome" : ua.contains("firefox/") ? "Firefox"
+                    : ua.contains("safari/") ? "Safari" : "Other");
+            audit.setOs(ua.contains("android") ? "Android" : ua.contains("iphone") || ua.contains("ipad") ? "iOS"
+                    : ua.contains("windows") ? "Windows" : ua.contains("mac os") ? "macOS"
+                    : ua.contains("linux") ? "Linux" : "Other");
+            audit.setRequestPath(clean(req.getRequestURI(), 512));
+            audit.setHttpMethod(clean(req.getMethod(), 16));
+            Object start = req.getAttribute(START);
+            if (start instanceof Long) audit.setDurationMs((System.nanoTime() - (Long) start) / 1000000);
+        }
+        try {
+            writer.write(audit);
+        } catch (Exception e) {
+            // 不因审计故障中断登录;兜底不输出 SQL、密码、token 或原始异常信息。
+            log.error("LOGIN_AUDIT_WRITE_FAILED type={} id={} result={} remoteIp={} errorClass={}",
+                    audit.getLoginType(), audit.getLoginId(), result, audit.getRemoteIp(), e.getClass().getSimpleName());
+            try {
+                log.warn("LOGIN_AUDIT_FALLBACK {}", Jsons.toJson(audit));
+            } catch (Exception serializationFailure) {
+                log.warn("LOGIN_AUDIT_FALLBACK_SERIALIZATION_FAILED type={} id={}", audit.getLoginType(), audit.getLoginId());
+            }
+        }
+    }
+
+    static String inferMethod(String path) {
+        String p = path.toLowerCase(Locale.ROOT);
+        if (p.contains("/get/yh/user/token")) return "admin_impersonation";
+        if (p.contains("/switch")) return "account_switch";
+        if (p.contains("google")) return "google";
+        if (p.contains("wx") || p.contains("wechat")) return "wechat";
+        if (p.contains("mini")) return "mini_program";
+        if (p.endsWith("/get/loginInfo".toLowerCase(Locale.ROOT))) return "sms_code";
+        if (p.contains("/manage/") && p.endsWith("/login")) return "password_check";
+        if (p.contains("/login/phone")) return "phone_or_email_code";
+        return "other";
+    }
+
+    static String clean(String s, int max) {
+        if (s == null) return null;
+        s = s.replace('\r', ' ').replace('\n', ' ');
+        return s.length() <= max ? s : s.substring(0, max);
+    }
+}

+ 32 - 0
netflix-web/src/main/java/com/cyksj/aspect/RefundAuthorizationAspect.java

@@ -0,0 +1,32 @@
+package com.cyksj.aspect;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import lombok.RequiredArgsConstructor;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class RefundAuthorizationAspect {
+    private final CmsUserMapper cmsUserMapper;
+    @Around("@annotation(permission)")
+    public Object authorize(ProceedingJoinPoint point, SaCheckPermission permission) throws Throwable {
+        for (String value : permission.value()) {
+            if (!"order:refund".equals(value) && !"order:refundTransfer".equals(value) && !value.startsWith("merchant:")) continue;
+            StpUtil.checkLogin();
+            StpUtil.checkPermission(value);
+            CmsUser admin = cmsUserMapper.selectById(StpUtil.getLoginIdAsLong());
+            if (admin == null || !Boolean.TRUE.equals(admin.getStatus())) {
+                throw BusinessRuntimeException.getInstance("后台账号不存在或已停用");
+            }
+        }
+        return point.proceed();
+    }
+}

+ 0 - 9
netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java

@@ -24,24 +24,15 @@ public class SaTokenConfigure implements WebMvcConfigurer {
 				.excludePathPatterns(List.of("/manage/admin/login",
 						"/manage/admin/get/loginInfo",
 						"/manage/corp/**",
-						"/manage/coupon/corp/send",
-						"/manage/coupon",
 						"/manage/register/wx/refund/notify",
-						"/manage/register/unLimit",
 						"/manage/gzh/msg/notify",
-						"/manage/admin/send/template",
-						"/manage/order/put/status/*",
 						"/manage/user/get/loginInfo",
 						"/manage/user/login",
-						"/manage/admin/send/template",
 						"/manage/admin/callback",
-						"/manage/coupon/get/classification",
 						"/manage/account/get/latest/orders",
 						"/manage/account/get/expired/accounts",
 						"/manage/account/put/account",
 						"/manage/account/netflix/credential",
-						"/manage/coupon/get/classificationList",
-						"/manage/coupon/get/couponList",
 						"/manage/order/wx/refund/notify",
 						"/manage/goods/whole/sale/deposit/refund/notify",
 						"/manage/admin/get/yh/user/token",

+ 53 - 0
netflix-web/src/main/java/com/cyksj/security/AdminLoginGuard.java

@@ -0,0 +1,53 @@
+package com.cyksj.security;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.support.TransactionTemplate;
+import java.util.Map;
+
+/** Persistent account lock. No HTTP unlock endpoint; schema must be deployed first. */
+@Service
+public class AdminLoginGuard {
+    private static final int MAX_FAILURES = 5;
+    private final JdbcTemplate jdbc;
+    private final TransactionTemplate transaction;
+    public AdminLoginGuard(JdbcTemplate jdbc, PlatformTransactionManager manager) {
+        this.jdbc = jdbc;
+        this.transaction = new TransactionTemplate(manager);
+        this.transaction.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+    }
+    protected void invalidateSessions(Long id) { StpUtil.logoutByLoginId(id); }
+    public void verify(String domain, Long id, boolean valid, boolean completeLogin) {
+        if (!"cms_user".equals(domain) && !"admin".equals(domain)) throw new IllegalArgumentException("Invalid admin domain");
+        // Serialize all credential attempts for this account, across application instances.
+        String error = transaction.execute(status -> {
+            jdbc.update("INSERT IGNORE INTO admin_login_guard (account_type, account_id, failed_count, locked) VALUES (?, ?, 0, 0)", domain, id);
+            Map<String, Object> row = jdbc.queryForMap("SELECT failed_count, locked FROM admin_login_guard WHERE account_type=? AND account_id=? FOR UPDATE", domain, id);
+            boolean locked = Boolean.TRUE.equals(row.get("locked")) || "1".equals(String.valueOf(row.get("locked")));
+            if (locked) return "账户已因登录失败被锁定,请联系开发人员解锁";
+            Boolean enabled = jdbc.queryForObject("SELECT status FROM " + domain + " WHERE id=?", Boolean.class, id);
+            if (!Boolean.TRUE.equals(enabled)) return "账户已禁用,请联系开发人员";
+            if (!valid) {
+                int failures = ((Number) row.get("failed_count")).intValue() + 1;
+                jdbc.update("UPDATE admin_login_guard SET failed_count=?, locked=?, last_failure_time=NOW(), locked_time=IF(?, NOW(), locked_time) WHERE account_type=? AND account_id=?", failures, failures >= MAX_FAILURES, failures >= MAX_FAILURES, domain, id);
+                if (failures >= MAX_FAILURES) {
+                    jdbc.update("UPDATE " + domain + " SET status=0 WHERE id=?", id);
+                    return "账户已因登录失败被锁定,请联系开发人员解锁";
+                }
+                return "账号或凭据错误";
+            }
+            // Password pre-check is not a successful login and must not reset SMS failures.
+            if (completeLogin) jdbc.update("UPDATE admin_login_guard SET failed_count=0 WHERE account_type=? AND account_id=? AND locked=0", domain, id);
+            return null;
+        });
+        // Throw AFTER committing; otherwise failure counters and disablement roll back.
+        if (error != null) {
+            if (error.contains("锁定")) invalidateSessions(id);
+            throw BusinessRuntimeException.getInstance(error);
+        }
+    }
+}

+ 14 - 0
netflix-web/src/main/java/com/cyksj/security/AdminRedirectPolicy.java

@@ -0,0 +1,14 @@
+package com.cyksj.security;
+import java.net.URI;
+import java.util.Arrays;
+public final class AdminRedirectPolicy {
+ private AdminRedirectPolicy() { }
+ public static boolean allowed(String target, String origins) {
+  try {
+   URI uri=URI.create(target);
+   if (!"https".equalsIgnoreCase(uri.getScheme()) || uri.getHost()==null || uri.getRawUserInfo()!=null || uri.getRawFragment()!=null) return false;
+   String origin="https://"+uri.getHost().toLowerCase()+(uri.getPort()==-1 || uri.getPort()==443?"":":"+uri.getPort());
+   return Arrays.stream(origins.split(",")).map(String::trim).anyMatch(origin::equals);
+  } catch (RuntimeException e) { return false; }
+ }
+}

+ 27 - 0
netflix-web/src/main/java/com/cyksj/security/BalanceIdempotency.java

@@ -0,0 +1,27 @@
+package com.cyksj.security;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.model.request.UserBalanceReq;
+import lombok.RequiredArgsConstructor;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.Map;
+@Service
+@RequiredArgsConstructor
+public class BalanceIdempotency {
+ private final JdbcTemplate jdbc;
+ @Transactional(propagation=Propagation.MANDATORY)
+ public boolean begin(long adminId, String operation, String requestId, UserBalanceReq request) {
+  if(requestId==null || !requestId.matches("[a-zA-Z0-9-]{16,64}")) throw BusinessRuntimeException.getInstance("缺少有效的幂等请求编号,请刷新管理后台");
+  String payload=request.getUserId()+"\n"+request.getDeductBalance().stripTrailingZeros().toPlainString()+"\n"+request.getRemark();
+  jdbc.update("INSERT INTO admin_balance_request (admin_id, operation, request_id, payload, completed) VALUES (?, ?, ?, ?, 0) ON DUPLICATE KEY UPDATE request_id=VALUES(request_id)",adminId,operation,requestId,payload);
+  Map<String,Object> row=jdbc.queryForMap("SELECT payload, completed FROM admin_balance_request WHERE admin_id=? AND operation=? AND request_id=? FOR UPDATE",adminId,operation,requestId);
+  if(!payload.equals(row.get("payload"))) throw BusinessRuntimeException.getInstance("请求编号已用于其他金额或用户,请勿修改后重用");
+  return !Boolean.TRUE.equals(row.get("completed")) && !"1".equals(String.valueOf(row.get("completed")));
+ }
+ @Transactional(propagation=Propagation.MANDATORY)
+ public void complete(long adminId,String operation,String requestId) {
+  jdbc.update("UPDATE admin_balance_request SET completed=1 WHERE admin_id=? AND operation=? AND request_id=?",adminId,operation,requestId);
+ }
+}

+ 22 - 1
netflix-web/src/main/java/com/cyksj/web/controller/external/ExternalController.java

@@ -1,5 +1,12 @@
 package com.cyksj.web.controller.external;
 
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.common.annotation.Log;
+import com.cyksj.enums.BusinessType;
+
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -41,6 +48,8 @@ import java.util.List;
  * 创建时间:2024/6/11 15:01
  */
 @RestController
+@SaCheckLogin
+@SaCheckRole("root")
 @RequestMapping("/external/app")
 @RequiredArgsConstructor
 public class ExternalController {
@@ -66,6 +75,7 @@ public class ExternalController {
      * 知乎 特殊镜像规格 兑换码列表
      */
     @GetMapping("/get/mirror")
+    @SaCheckPermission("exchangeCode:view")
     public Result<SearchResult<ExternalExchangeCodeView>> getMirror(@RequestParam(required = true, defaultValue = "18") Long gid) {
         //目前只展示规格id 444 GPT基础镜像2月
         List<Long> showSkuId = null;
@@ -79,7 +89,13 @@ public class ExternalController {
         if (CollUtil.isEmpty(showSkuId)) {
            return GatewayResponse.SUCCESS.newBuilder().toResult();
         }
-        SearchResult<ExternalExchangeCodeView> search = beanSearcher.search(ExternalExchangeCodeView.class, MapUtils.flatBuilder(request.getParameterMap())
+        int page = request.getParameter("start") == null ? 1 : Integer.parseInt(request.getParameter("start"));
+        int size = request.getParameter("limit") == null ? 10 : Integer.parseInt(request.getParameter("limit"));
+        if (page < 1 || size < 1 || size > 100) {
+            throw BusinessRuntimeException.getInstance("分页参数错误");
+        }
+        SearchResult<ExternalExchangeCodeView> search = beanSearcher.search(ExternalExchangeCodeView.class, MapUtils.builder()
+                .put("start", page).put("limit", size)
                 .field(ExternalExchangeCodeView::getSkuIds, showSkuId.toString())
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
@@ -89,6 +105,8 @@ public class ExternalController {
 	 * 退款 成功 重新生成兑换码
 	 */
 	@PutMapping("/refund/{id}")
+	@SaCheckPermission("exchangeCode:refund")
+	@Log(module = "兑换码/外部退款重发", businessType = BusinessType.PUT, isSaveRequestData = true)
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> refund(@PathVariable Long id) throws Exception {
 		ExchangeCode exchangeCode = exchangeCodeMapper.selectById(id);
@@ -139,6 +157,9 @@ public class ExternalController {
 				ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
 				exchangeCodeReq.setNumber(1);
 				exchangeCodeReq.setSkuIds(List.of(orderDon.getSkuId()).toString());
+				exchangeCodeReq.setType(0);
+				exchangeCodeReq.setCodeType(1);
+				exchangeCodeReq.setOperator("admin:" + StpUtil.getLoginIdAsLong());
 				exchangeCodeService.createExchangeCode(exchangeCodeReq);
 			} catch (Exception e) {
 			}

+ 19 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage;
 
+import cn.dev33.satoken.annotation.SaCheckRole;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -47,6 +48,8 @@ import java.util.Map;
 @RequiredArgsConstructor
 @Slf4j
 public class AdminController {
+    @org.springframework.beans.factory.annotation.Autowired
+    private com.cyksj.security.AdminLoginGuard adminLoginGuard;
 
     private final AdminService adminService;
 
@@ -75,19 +78,22 @@ public class AdminController {
         if (null == admin) {
             throw BusinessRuntimeException.getInstance("账号或凭据错误");
         }
+        adminLoginGuard.verify("admin", admin.getId(), true, false);
         if (null == admin.getStatus() || !admin.getStatus()) {
             throw BusinessRuntimeException.getInstance("账号或凭据错误");
         }
 
         // 对比密码
+        if (adminRequest.getPassWord() == null || adminRequest.getPassWord().isEmpty()) {
+            adminLoginGuard.verify("admin", admin.getId(), false, false);
+        }
         String encodePasscode = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(adminRequest.getPassWord()).toBase64String();
 
-        if (!StringUtils.equals(admin.getPassWord(), encodePasscode)) {
-            throw BusinessRuntimeException.getInstance("账号或凭据错误");
-        }
+        adminLoginGuard.verify("admin", admin.getId(), StringUtils.equals(admin.getPassWord(), encodePasscode), false);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    @SaCheckRole("root")
     @PostMapping("/post")
     public Result<String> saveAdmin(@RequestBody @Validated Admin admin) throws Exception {
         Long adminId = StpUtil.getLoginIdAsLong();
@@ -124,6 +130,7 @@ public class AdminController {
     /**
      * 删除管理员
      */
+    @SaCheckRole("root")
     @DeleteMapping("/delete/{id}")
     public Result<String> deleteAdminById(@PathVariable Long id) {
         Long adminId = StpUtil.getLoginIdAsLong();
@@ -144,6 +151,7 @@ public class AdminController {
     /**
      * 编辑管理员
      */
+    @SaCheckRole("root")
     @PutMapping("/put")
     public Result<String> editAdmin(@RequestBody Admin admin) throws Exception {
         Long adminId = StpUtil.getLoginIdAsLong();
@@ -194,26 +202,33 @@ public class AdminController {
         if (null == admin) {
             throw BusinessRuntimeException.getInstance("该用户不存在.");
         }
+        adminLoginGuard.verify("admin", admin.getId(), true, false);
         if (StrUtil.hasEmpty(phone, code)) {
+            adminLoginGuard.verify("admin", admin.getId(), false, false);
             throw BusinessRuntimeException.getInstance("请输入对应信息");
         }
         DateTime now = DateTime.now();
         PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
         if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+            adminLoginGuard.verify("admin", admin.getId(), false, false);
             throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
         }
         //3分钟失效
         Date updateTime = phoneCode.getUpdateTime();
         DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
         if (now.isAfter(afterFiveMinutes)) {
+            adminLoginGuard.verify("admin", admin.getId(), false, false);
             throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
         }
         if (!StrUtil.equals(code, phoneCode.getCode())) {
+            adminLoginGuard.verify("admin", admin.getId(), false, false);
             throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
         }
         // 生成token
 
+        adminLoginGuard.verify("admin", admin.getId(), true, true);
         StpUtil.login(admin.getId());
+        adminLoginGuard.verify("admin", admin.getId(), true, false);
 
         String token = StpUtil.getTokenValue();
 
@@ -231,6 +246,7 @@ public class AdminController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(page);
     }
 
+    @SaCheckRole("root")
     @GetMapping("/send/template")
     public Result<String> sendTemplate(String title, String channel, String url) throws Exception {
         for (String email : SEND_LIST) {

+ 16 - 6
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage;
 
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
@@ -684,7 +685,8 @@ public class CmsOrderController {
 	/**
 	 * 修改订单状态
 	 */
-	@PutMapping("/put/status/{orderId}")
+	@SaCheckPermission("order:edit")
+    @PutMapping("/put/status/{orderId}")
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> updateOrderStatus(@PathVariable Long orderId) {
 		long adminId = StpUtil.getLoginIdAsLong();
@@ -697,7 +699,7 @@ public class CmsOrderController {
 			throw BusinessRuntimeException.getInstance("该订单已是已完成状态");
 		}
 		if (orderDon.getStatus() != OrderDon.Status.hasPayment) {
-			throw BusinessRuntimeException.getInstance("该订单不是未支付状态");
+			throw BusinessRuntimeException.getInstance("仅已支付订单可以完成");
 		}
 		orderDon.setStatus(OrderDon.Status.complete);
 		cmsOrderDonService.updateById(orderDon);
@@ -977,7 +979,9 @@ public class CmsOrderController {
 	/**
 	 * 订单统一退款
 	 */
-	@PostMapping("/unified/refund")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/unified/refund")
 	@Log(module = "订单管理/统一退款", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
@@ -1086,7 +1090,9 @@ public class CmsOrderController {
 	/**
 	 * 订单补差价,补差价退款到余额
 	 */
-	@PutMapping("/refund/price/differ")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PutMapping("/refund/price/differ")
 	@Log(module = "订单管理/订单补差价", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> refundPriceDiffer(@RequestBody OrderRefundReq orderRefundReq) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
@@ -1102,7 +1108,9 @@ public class CmsOrderController {
 	/**
 	 * 将 balance/bxj 退款记录中的余额扣回并转退至原支付渠道
 	 */
-	@PutMapping("/clear/balance/refundMoney")
+	@SaCheckLogin
+    @SaCheckPermission("order:refundTransfer")
+    @PutMapping("/clear/balance/refundMoney")
 	@NoSubmit
 	public Result<String> clearBalanceToRefundMoney(@RequestBody @Validated OrderBalanceRefundReq refundReq) throws Exception {
 		cmsOrderDonService.clearBalanceToRefundMoney(refundReq);
@@ -1274,7 +1282,9 @@ public class CmsOrderController {
 	/**
 	 * 套餐订单统一退款
 	 */
-	@PostMapping("/unified/upgrade/refund")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/unified/upgrade/refund")
 	@Log(module = "套餐订单管理/统一退款", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> unifiedUpgradeRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();

+ 16 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -59,6 +59,7 @@ import java.util.Optional;
 @RestController
 @RequestMapping("/manage/user")
 public class CmsUserController{
+    private final com.cyksj.security.BalanceIdempotency balanceIdempotency;
 
     private final HttpServletRequest request;
 
@@ -428,16 +429,21 @@ public class CmsUserController{
     /**
      * 余额扣除
      */
+    @SaCheckPermission("userBalance:deduct")
     @PutMapping("/sub/balance")
     @Transactional(rollbackFor = Throwable.class)
     @Log(module = "用户管理/扣除用户余额", businessType = BusinessType.PUT, isSaveRequestData = true)
-    public Result<String> subBalance(@RequestBody @Validated UserBalanceReq balanceReq) {
+    public Result<String> subBalance(@RequestBody @Validated UserBalanceReq balanceReq, @RequestHeader(value="Idempotency-Key", required=false) String requestId) {
         BigDecimal deductBalance = balanceReq.getDeductBalance();
         if (deductBalance.compareTo(BigDecimal.ZERO) <= 0) {
             throw BusinessRuntimeException.getInstance("请扣除正确的余额数值");
         }
         long adminId = StpUtil.getLoginIdAsLong();
         CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+        if (cmsUser == null || !Boolean.TRUE.equals(cmsUser.getStatus())) {
+            throw BusinessRuntimeException.getInstance("后台账号不存在或已停用");
+        }
+        if (!balanceIdempotency.begin(adminId, "deduct", requestId, balanceReq)) return GatewayResponse.SUCCESS.newBuilder().toResult();
         Long userId = balanceReq.getUserId();
         User user = userMapper.selectById(userId);
         Assert.notNull(user, "用户不存在");
@@ -452,23 +458,29 @@ public class CmsUserController{
             throw BusinessRuntimeException.getInstance("扣除用户余额失败,请重试...");
         }
         userBenefitsService.recordBalanceBySource(userId, deductBalance.negate(), UserBalanceSourceRecord.Source.manual, null, UserBalanceSourceRecord.Source.manual.getDesc(), balanceReq.getRemark(), cmsUser.getNickname());
+        balanceIdempotency.complete(adminId, "deduct", requestId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
     /**
      * 增加余额
      */
+    @SaCheckPermission("userBalance:add")
     @PutMapping("/add/balance")
     @Transactional(rollbackFor = Throwable.class)
     @Log(module = "用户管理/增加用户余额", businessType = BusinessType.PUT, isSaveRequestData = true)
-    public Result<String> addBalance(@RequestBody @Validated UserBalanceReq balanceReq) {
+    public Result<String> addBalance(@RequestBody @Validated UserBalanceReq balanceReq, @RequestHeader(value="Idempotency-Key", required=false) String requestId) {
         long adminId = StpUtil.getLoginIdAsLong();
         CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+        if (cmsUser == null || !Boolean.TRUE.equals(cmsUser.getStatus())) {
+            throw BusinessRuntimeException.getInstance("后台账号不存在或已停用");
+        }
         Assert.notNull(cmsUser, "请重新登录");
         BigDecimal deductBalance = balanceReq.getDeductBalance();
         if (deductBalance.compareTo(BigDecimal.ZERO) <= 0) {
             throw BusinessRuntimeException.getInstance("请增加正确的余额数值");
         }
+        if (!balanceIdempotency.begin(adminId, "add", requestId, balanceReq)) return GatewayResponse.SUCCESS.newBuilder().toResult();
         Long userId = balanceReq.getUserId();
         User user = userMapper.selectById(userId);
         Assert.notNull(user, "用户不存在");
@@ -480,6 +492,7 @@ public class CmsUserController{
             throw BusinessRuntimeException.getInstance("增加用户余额失败,请重试...");
         }
         userBenefitsService.recordBalanceBySource(userId, deductBalance, UserBalanceSourceRecord.Source.add, null, UserBalanceSourceRecord.Source.add.getDesc(), balanceReq.getRemark(), cmsUser.getNickname());
+        balanceIdempotency.complete(adminId, "add", requestId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
@@ -619,6 +632,7 @@ public class CmsUserController{
     /**
      * 手动扣除用户操作记录
      */
+    @SaCheckPermission("userBalance:view")
     @GetMapping("/get/user/balance/sys/operate/record")
     public Result<SearchResult<UserBalanceSourceRecord>> sysOperate() {
         SearchResult<UserBalanceSourceRecord> search = beanSearcher.search(UserBalanceSourceRecord.class, MapUtils.flatBuilder(request.getParameterMap())

+ 46 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/LoginAuditController.java

@@ -0,0 +1,46 @@
+package com.cyksj.web.controller.manage;
+
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.LoginAuditMapper;
+import com.cyksj.model.entity.LoginAudit;
+import lombok.RequiredArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+import java.util.Date;
+
+@RestController
+@RequestMapping("/manage/login/audit")
+@SaCheckLogin
+@SaCheckRole("root")
+@RequiredArgsConstructor
+public class LoginAuditController {
+    private final LoginAuditMapper mapper;
+
+    @GetMapping("/get")
+    public Result<Page<LoginAudit>> list(@RequestParam(defaultValue = "1") int start,
+            @RequestParam(defaultValue = "20") int limit, String loginType, String loginId,
+            String account, String result, String loginMethod, String ip,
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date from,
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date to) {
+        if (start < 1 || limit < 1 || limit > 100 || (from != null && to != null && from.after(to))) {
+            throw BusinessRuntimeException.getInstance("查询参数错误");
+        }
+        LambdaQueryWrapper<LoginAudit> query = new LambdaQueryWrapper<LoginAudit>()
+                .eq(loginType != null, LoginAudit::getLoginType, loginType)
+                .eq(loginId != null, LoginAudit::getLoginId, loginId)
+                .eq(account != null, LoginAudit::getAccount, account)
+                .eq(result != null, LoginAudit::getResult, result)
+                .eq(loginMethod != null, LoginAudit::getLoginMethod, loginMethod)
+                .ge(from != null, LoginAudit::getCreatedTime, from)
+                .le(to != null, LoginAudit::getCreatedTime, to)
+                .orderByDesc(LoginAudit::getId);
+        if (ip != null) query.and(q -> q.eq(LoginAudit::getRemoteIp, ip).or().eq(LoginAudit::getRealIp, ip));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(mapper.selectPage(new Page<>(start, limit), query));
+    }
+}

+ 4 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/SpecialPayManageController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage;
 
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.dto.Result;
@@ -25,7 +26,9 @@ public class SpecialPayManageController {
 				specialPayService.getManageOrderPage(start, limit, orderNo, userId, productCode, status));
 	}
 
-	@PostMapping("/{orderNo}/refund")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/{orderNo}/refund")
 	public Result refund(@PathVariable String orderNo) throws Exception {
 		specialPayService.refundOrder(orderNo);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();

+ 5 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/AccountTempController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.account;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
@@ -181,7 +183,9 @@ public class AccountTempController {
 	/**
 	 * excel奈飞退款
 	 */
-	@PutMapping("/refund")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PutMapping("/refund")
 	public void excelRefund(MultipartFile file) throws IOException {
 		if (!file.getOriginalFilename().contains(".xls")) {
 			throw BusinessRuntimeException.getInstance("请导入excel文件");

+ 51 - 25
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.cms;
 
+import cn.dev33.satoken.annotation.SaCheckRole;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
@@ -70,6 +71,10 @@ import java.util.Optional;
 @RequiredArgsConstructor
 @Slf4j
 public class CmsAdminUserController {
+    @org.springframework.beans.factory.annotation.Value("${security.admin-login.allowed-redirect-origins:}")
+    private String allowedRedirectOrigins;
+    @org.springframework.beans.factory.annotation.Autowired
+    private com.cyksj.security.AdminLoginGuard adminLoginGuard;
 	private final CmsUserMapper cmsUserMapper;
 
 	private final PhoneCodeMapper phoneCodeMapper;
@@ -104,20 +109,23 @@ public class CmsAdminUserController {
 		if (null == admin) {
 			throw BusinessRuntimeException.getInstance("该用户不存在.");
 		}
+        adminLoginGuard.verify("cms_user", admin.getId(), true, false);
 		if (null == admin.getStatus() || !admin.getStatus()) {
 			throw BusinessRuntimeException.getInstance("无登录权限.");
 		}
 
 		// 对比密码
-		String encodePasscode = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(adminRequest.getPassword()).toBase64String();
+		if (adminRequest.getPassword() == null || adminRequest.getPassword().isEmpty()) {
+            adminLoginGuard.verify("cms_user", admin.getId(), false, false);
+        }
+        String encodePasscode = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(adminRequest.getPassword()).toBase64String();
 
-		if (!StringUtils.equals(admin.getPassword(), encodePasscode)) {
-			throw BusinessRuntimeException.getInstance("密码有误.");
-		}
+		adminLoginGuard.verify("cms_user", admin.getId(), StringUtils.equals(admin.getPassword(), encodePasscode), false);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
-	@PostMapping("/post")
+	@SaCheckRole("root")
+    @PostMapping("/post")
 	@Log(module = "用户管理/新增用户", businessType = BusinessType.POST, isSaveRequestData = true)
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> saveAdmin(@RequestBody @Validated CmsUserReq cmsUserReq) throws Exception {
@@ -156,7 +164,8 @@ public class CmsAdminUserController {
 	/**
 	 * 删除管理员
 	 */
-	@DeleteMapping("/delete/{id}")
+	@SaCheckRole("root")
+    @DeleteMapping("/delete/{id}")
 	@Log(module = "用户管理/删除用户", businessType = BusinessType.DELETE)
 	public Result<String> deleteAdminById(@PathVariable Long id) throws Exception {
 		Long adminId = StpUtil.getLoginIdAsLong();
@@ -194,7 +203,8 @@ public class CmsAdminUserController {
 	/**
 	 * 编辑管理员
 	 */
-	@PutMapping("/put")
+	@SaCheckRole("root")
+    @PutMapping("/put")
 	@Log(module = "用户管理/编辑用户", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> editAdmin(@RequestBody CmsUserReq cmsUserReq) throws Exception {
 		Long adminId = StpUtil.getLoginIdAsLong();
@@ -247,7 +257,8 @@ public class CmsAdminUserController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
 	}
 
-	@PutMapping("/put/status/{id}")
+	@SaCheckRole("root")
+    @PutMapping("/put/status/{id}")
 	public Result<String> updateUserStatus(@PathVariable("id") Integer id) {
 		if (id == null || id < 1) {
 			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_USER_NO_FIND);
@@ -266,7 +277,8 @@ public class CmsAdminUserController {
 	}
 
 	@SneakyThrows
-	@PutMapping("/put/reset/pwd/{id}")
+	@SaCheckRole("root")
+    @PutMapping("/put/reset/pwd/{id}")
 	public Result<String> resetPwd(@PathVariable("id") Integer id) {
 		CmsUser cmsUser = cmsUserMapper.selectById(id);
 		cmsUser.setPassword(Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(Constant.INITIAL_PASSWORD).toBase64String());
@@ -285,26 +297,33 @@ public class CmsAdminUserController {
 		if (null == admin) {
 			throw BusinessRuntimeException.getInstance("该用户不存在.");
 		}
+        adminLoginGuard.verify("cms_user", admin.getId(), true, false);
 		if (StrUtil.hasEmpty(phone, code)) {
-			throw BusinessRuntimeException.getInstance("请输入对应信息");
+			adminLoginGuard.verify("cms_user", admin.getId(), false, false);
+            throw BusinessRuntimeException.getInstance("请输入对应信息");
 		}
 		DateTime now = DateTime.now();
 		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
 		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+			adminLoginGuard.verify("cms_user", admin.getId(), false, false);
+            throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
 		}
 		//3分钟失效
 		Date updateTime = phoneCode.getUpdateTime();
 		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
 		if (now.isAfter(afterFiveMinutes)) {
-			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+			adminLoginGuard.verify("cms_user", admin.getId(), false, false);
+            throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
 		}
 		if (!StrUtil.equals(code, phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+			adminLoginGuard.verify("cms_user", admin.getId(), false, false);
+            throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
 		}
 		// 生成token
 
-		StpUtil.login(admin.getId());
+		adminLoginGuard.verify("cms_user", admin.getId(), true, true);
+        StpUtil.login(admin.getId());
+        adminLoginGuard.verify("cms_user", admin.getId(), true, false);
 
 		String token = StpUtil.getTokenValue();
 
@@ -345,13 +364,15 @@ public class CmsAdminUserController {
      */
     @GetMapping("/wx/authLogin")
     public Result<CpsAuthDto> wxAuthorize(String redirectUrl) throws Exception {
+        if (!com.cyksj.security.AdminRedirectPolicy.allowed(redirectUrl, allowedRedirectOrigins)) throw BusinessRuntimeException.getInstance("后台登录跳转地址未授权,请联系开发配置");
         CpsAuthDto cpsAuthDto = new CpsAuthDto();
         Long mappingId = SEQUENCE.nextId();
         String authState = mappingId.toString();
-        redisService.set(authState, authState, 60 * 60 * 24L);
+
         AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
         redirect.setUrl(redirectUrl);
-        String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
+        String state = java.util.UUID.randomUUID().toString();
+        redisService.set("cms:oauth:state:" + state, Jsons.toJson(redirect), 300L);
         String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getManageRedirectUri());
         cpsAuthDto.setAuthUrl(wxAuthUrl);
         cpsAuthDto.setAuthState(authState);
@@ -364,19 +385,20 @@ public class CmsAdminUserController {
     @GetMapping("/wx/authLogin/baseRedirect")
     public Result<String> wxAuthLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
         if (StrUtil.isEmpty(state)) throw BusinessRuntimeException.getInstance("授权错误,请重新授权");
-        String json = Codec.DoBase64.custom().setData(state).decodeAsText();
-        AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
+        if (!state.matches("[a-f0-9-]{36}") || !redisService.setNx("cms:oauth:used:" + state, "1", 300L)) throw BusinessRuntimeException.getInstance("授权已失效,请重新登录");
+        Object storedState = redisService.get("cms:oauth:state:" + state);
+        redisService.del("cms:oauth:state:" + state);
+        if (!(storedState instanceof String)) throw BusinessRuntimeException.getInstance("授权已失效,请重新登录");
+        AuthRedirect re = Jsons.parseObject((String) storedState, AuthRedirect.class);
+        if (!com.cyksj.security.AdminRedirectPolicy.allowed(re.getUrl(), allowedRedirectOrigins)) throw BusinessRuntimeException.getInstance("后台登录跳转地址未授权");
         AuthToken token = weChatService.getAuthToken(code, wxOpenPlatYHLXLoginConfig.getAppId());
         GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
         String unionId = userinfo.getUnionid();
         String openId = userinfo.getOpenid();
-        CmsUser user = Optional.ofNullable(
-                        cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getUnionid, unionId)
-                                .orderByAsc(CmsUser::getId)
-                                .last("limit 1")))
-                .orElseGet(() -> cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getOpenId, openId)
-                        .orderByAsc(CmsUser::getId)
-                        .last("limit 1")));
+        if (StrUtil.isBlank(openId)) throw BusinessRuntimeException.getInstance("微信身份无效");
+        CmsUser user = null;
+        if (StrUtil.isNotBlank(unionId)) user = cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getUnionid, unionId).orderByAsc(CmsUser::getId).last("limit 1"));
+        if (user == null) user = cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getOpenId, openId).orderByAsc(CmsUser::getId).last("limit 1"));
 
         String url = re.getUrl();
         if (user == null){
@@ -386,9 +408,12 @@ public class CmsAdminUserController {
             String bindWxKey = RandomUtil.randomString(10);
             redisService.set("cms_bind_wx:" + bindWxKey, jsonObject.toString(), 12 * 60L);
             response.sendRedirect(url.contains("?") ? url + "&bk=" + bindWxKey : url + "?bk=" + bindWxKey);
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
         }
 
+        adminLoginGuard.verify("cms_user", user.getId(), true, true);
         StpUtil.login(user.getId());
+        adminLoginGuard.verify("cms_user", user.getId(), true, false);
         String cmsToken = StpUtil.getTokenValue();
         if (StrUtil.isNotBlank(url)) {
             response.sendRedirect(url.contains("?") ? url + "&t=" + cmsToken : url + "?t=" + cmsToken);
@@ -430,6 +455,7 @@ public class CmsAdminUserController {
         if (null == admin) {
             throw BusinessRuntimeException.getInstance("该用户不存在.");
         }
+        adminLoginGuard.verify("cms_user", admin.getId(), true, false);
         String token = StpUtil.getTokenValue();
         admin.setPassword("");
 

+ 7 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.cms;
 
+import cn.dev33.satoken.annotation.SaCheckRole;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -39,13 +40,15 @@ public class CmsMenuController {
 
 	private final CmsRoleMenuMapper cmsRoleMenuMapper;
 
-	@PostMapping("/post")
+	@SaCheckRole("root")
+    @PostMapping("/post")
 	public Result<String> addMenu(@RequestBody @Validated CmsMenu cmsMenu) {
 		cmsMenuMapper.insert(cmsMenu);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("新增菜单成功");
 	}
 
-	@PutMapping("/put")
+	@SaCheckRole("root")
+    @PutMapping("/put")
 	public Result<String> putMenu(@RequestBody CmsMenu cmsMenu) throws Exception {
 		if (cmsMenu.getId() == null || cmsMenu.getId() < 1) {
 			throw BusinessRuntimeException.getInstance("菜单不存在");
@@ -63,7 +66,8 @@ public class CmsMenuController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑菜单成功");
 	}
 
-	@DeleteMapping("/delete/{id}")
+	@SaCheckRole("root")
+    @DeleteMapping("/delete/{id}")
 	public Result<String> deleteMenuById(@PathVariable("id") Long id) throws Exception {
 		if (id == null || id < 1) {
 			throw BusinessRuntimeException.getInstance("菜单不存在");

+ 7 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsRoleController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.cms;
 
+import cn.dev33.satoken.annotation.SaCheckRole;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -47,7 +48,8 @@ public class CmsRoleController {
 
 	private final HttpServletRequest request;
 
-	@PostMapping("/post")
+	@SaCheckRole("root")
+    @PostMapping("/post")
 	public Result<String> addRole(@RequestBody @Validated CmsRoleReq cmsRoleReq) {
 		try {
 			CmsRole cmsRole = new CmsRole();
@@ -63,7 +65,8 @@ public class CmsRoleController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("新增角色成功");
 	}
 
-	@PostMapping("/put")
+	@SaCheckRole("root")
+    @PostMapping("/put")
 	public Result<String> putRole(@RequestBody CmsRoleReq cmsRoleReq) throws Exception {
 		if (cmsRoleReq.getId() == null || cmsRoleReq.getId() < 0) {
 			throw BusinessRuntimeException.getInstance("角色不存在");
@@ -99,7 +102,8 @@ public class CmsRoleController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("更新角色成功");
 	}
 
-	@DeleteMapping("/delete/{id}")
+	@SaCheckRole("root")
+    @DeleteMapping("/delete/{id}")
 	public Result<String> delRoleById(@PathVariable("id") Long id) {
 		if (id == null || id < 0) {
 			throw BusinessRuntimeException.getInstance("角色不存在");

+ 12 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/interceptor/StpInterfaceImpl.java

@@ -18,17 +18,27 @@ import java.util.List;
 public class StpInterfaceImpl implements StpInterface {
 	@Autowired
 	private CmsUserManager cmsUserManager;
+    @Autowired private com.cyksj.mapper.manage.cms.CmsUserMapper cmsUserMapper;
+    private boolean enabled(Object loginId, String loginType) {
+        if (!"login".equals(loginType)) return false;
+        com.cyksj.model.entity.CmsUser user = cmsUserMapper.selectById(Long.valueOf(loginId.toString()));
+        return user != null && Boolean.TRUE.equals(user.getStatus());
+    }
 
 	/**
 	 * 用户权限列表
 	 */
 	@Override
 	public List<String> getPermissionList(Object loginId, String loginType) {
-		return new ArrayList<>(cmsUserManager.getUserPermissions(Long.valueOf(loginId.toString())));
+		if (!enabled(loginId, loginType)) return java.util.Collections.emptyList();
+        java.util.Set<String> values = cmsUserManager.getUserPermissions(Long.valueOf(loginId.toString()));
+        return values == null ? java.util.Collections.emptyList() : new ArrayList<>(values);
 	}
 
 	@Override
 	public List<String> getRoleList(Object loginId, String loginType) {
-		return new ArrayList<>(cmsUserManager.getUserRoles(Long.valueOf(loginId.toString())));
+		if (!enabled(loginId, loginType)) return java.util.Collections.emptyList();
+        java.util.Set<String> values = cmsUserManager.getUserRoles(Long.valueOf(loginId.toString()));
+        return values == null ? java.util.Collections.emptyList() : new ArrayList<>(values);
 	}
 }

+ 9 - 16
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.corp;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -520,23 +522,14 @@ public class WxCorpController {
 	/**
 	 * 企业微信订单统一退款
 	 */
-	@PostMapping("/unified/refund")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/unified/refund")
 	public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
-		String followId = getCorpUuid();
-		if (StrUtil.isEmpty(followId)) {
-			throw BusinessRuntimeException.getInstance("请先授权登录");
-		}
-		CorpFollow corpFollow = corpFollowMapper.selectOne(Wrappers.lambdaQuery(CorpFollow.class)
-				.eq(CorpFollow::getUserid, followId)
-				.eq(CorpFollow::getWxCorpId, 2)
-				.last("limit 1"));
-		if (corpFollow == null) {
-			corpFollow = new CorpFollow();
-			corpFollow.setName("企业客服");
-		}
-		refundReq.setOperator(corpFollow.getName());
-		cmsOrderDonService.unifiedRefund(refundReq);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功");
+        // Caller-controlled employee cookies must never authorize money movement.
+        refundReq.setOperator("admin:" + cn.dev33.satoken.stp.StpUtil.getLoginIdAsLong());
+        cmsOrderDonService.unifiedRefund(refundReq);
+        return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功");
 	}
 
 	/**

+ 40 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.coupon;
 
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -52,6 +54,7 @@ import java.util.stream.Collectors;
  *创建者: JavaZou
  *创建时间:2022/11/17 13:44
  */
+@SaCheckLogin
 @RestController
 @RequestMapping("/manage/coupon")
 @RequiredArgsConstructor
@@ -95,6 +98,7 @@ public class CouponController {
 	 * 新增优惠券
 	 */
 	@PostMapping
+	@SaCheckPermission("coupon:add")
 	@Log(module = "优惠券/新增优惠券", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<String> couponSave(@RequestBody @Validated Coupon coupon) throws Exception {
 		couponCommonService.saveCoupon(coupon);
@@ -105,6 +109,7 @@ public class CouponController {
 	 * 删除优惠券
 	 */
 	@DeleteMapping("/{id}")
+	@SaCheckPermission("coupon:delete")
 	@Transactional(rollbackFor = Throwable.class)
 	@Log(module = "优惠券/删除优惠券", businessType = BusinessType.DELETE)
 	public Result<String> couponSave(@PathVariable Long id) throws Exception {
@@ -120,6 +125,7 @@ public class CouponController {
 	 * 修改优惠券
 	 */
 	@PutMapping
+	@SaCheckPermission("coupon:edit")
 	@Log(module = "优惠券/编辑优惠券", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> putCoupon(@RequestBody @Validated Coupon coupon) throws Exception {
 		couponCommonService.updateCoupon(coupon);
@@ -130,6 +136,7 @@ public class CouponController {
 	 * 发放优惠券
 	 */
 	@PostMapping("/send")
+	@SaCheckPermission("coupon:send")
 	@Log(module = "优惠券/发放优惠券", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<String> senCoupon(@RequestBody @Validated CouponActiveReq couponActiveReq) throws Exception {
 		couponCommonService.sendCoupon(couponActiveReq);
@@ -140,6 +147,7 @@ public class CouponController {
 	 * 优惠券 设置为推荐优惠券
 	 */
 	@PutMapping("/set/hot/{couponId}")
+	@SaCheckPermission("coupon:edit")
 	@Log(module = "优惠券/推荐优惠券", businessType = BusinessType.POST)
 	public Result<String> setHotCoupon(@PathVariable @Min(value = 1) Long couponId, @RequestBody CouponRecommend recommend) {
 		recommend.setCouponId(couponId);
@@ -151,6 +159,7 @@ public class CouponController {
 	 * 优惠券关联固定推广者
 	 */
 	@PostMapping("/set/relation")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> setPopularizeRelation(@RequestBody CouponDistributeReq couponDistributeReq) {
 		couponCommonService.setPopularizeRelation(couponDistributeReq);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("优惠券关联固定推广者成功");
@@ -160,6 +169,7 @@ public class CouponController {
 	 * 设置固定推广者兑换码
 	 */
 	@PutMapping("/set/relation/exCode")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> setPopularizeRelationCode(@RequestBody CouponDistributePopularize couponDistributePopularize) {
 		couponCommonService.setPopularizeRelationCode(couponDistributePopularize);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("设置固定推广者兑换码成功");
@@ -169,6 +179,7 @@ public class CouponController {
 	 * 关联某优惠券列表
 	 */
 	@GetMapping("/get/relation/list")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponDistributePopularizeView>> getRelationList(HttpServletRequest request) {
 		SearchResult<CouponDistributePopularizeView> search = beanSearcher.search(CouponDistributePopularizeView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
@@ -182,6 +193,7 @@ public class CouponController {
 	 * 删除固定推广者关联
 	 */
 	@DeleteMapping("/relation/del/{relationId}")
+	@SaCheckPermission("coupon:delete")
 	public Result<String> deleteRelationById(@PathVariable Long relationId) {
 		couponDistributePopularizeMapper.deleteById(relationId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("删除推广者关联成功");
@@ -191,6 +203,7 @@ public class CouponController {
 	 * 优惠券列表
 	 */
 	@GetMapping
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponView>> couponList(HttpServletRequest request) {
 		SearchResult<CouponView> search = beanSearcher.search(CouponView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
@@ -212,6 +225,7 @@ public class CouponController {
 	 * 所有优惠券列表
 	 */
 	@GetMapping("/get/couponList")
+	@SaCheckPermission("coupon:view")
 	public Result<List<Coupon>> getCouponList() {
 		List<Coupon> couponList = beanSearcher.searchAll(Coupon.class, MapUtils.flatBuilder(request.getParameterMap())
 				.field(Coupon::getDeleted, true)
@@ -224,6 +238,7 @@ public class CouponController {
 	 * 优惠券发放列表
 	 */
 	@GetMapping("/active/list")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponActiveView>> couponActiveList(HttpServletRequest request) {
 		SearchResult<CouponActiveView> search = beanSearcher.search(CouponActiveView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
@@ -244,6 +259,7 @@ public class CouponController {
 	 * 发放优惠券停用
 	 */
 	@PutMapping("/active/putStatus/{couponActiveId}")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> activePutStatus(@PathVariable Long couponActiveId) {
 		CouponActive couponActive = couponActiveMapper.selectById(couponActiveId);
 		if (couponActive == null || !couponActive.getDeleted()) {
@@ -261,6 +277,7 @@ public class CouponController {
 	 * 发放优惠券失效
 	 */
 	@PutMapping("/active/putExpiryStatus/{couponActiveId}")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> activePutExpiryStatus(@PathVariable Long couponActiveId) {
 		CouponActive couponActive = couponActiveMapper.selectById(couponActiveId);
 		if (couponActive == null || !couponActive.getDeleted()) {
@@ -280,6 +297,7 @@ public class CouponController {
 	 * 推荐发放列表
 	 */
 	@GetMapping("/recommend/list")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponRecommendView>> couponRecommendList(HttpServletRequest request) {
 		SearchResult<CouponRecommendView> search = beanSearcher.search(CouponRecommendView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
@@ -308,6 +326,7 @@ public class CouponController {
 	 * 推荐优惠券设置/取消推荐
 	 */
 	@PutMapping("/recommend/putStatus/{recommendId}")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> putRecommendStatusById(@PathVariable Long recommendId, @RequestBody CouponRecommend couponRecommend) {
 		CouponRecommend dbRecommend = couponRecommendMapper.selectById(recommendId);
 		if (dbRecommend == null || !dbRecommend.getDeleted()) {
@@ -330,6 +349,7 @@ public class CouponController {
 	 * 删除推荐优惠券
 	 */
 	@DeleteMapping("/recommend/del/{recommendId}")
+	@SaCheckPermission("coupon:delete")
 	public Result<String> deleteRecommendById(@PathVariable Long recommendId) {
 		CouponRecommend couponRecommend = couponRecommendMapper.selectById(recommendId);
 		if (couponRecommend == null || !couponRecommend.getDeleted()) {
@@ -351,6 +371,7 @@ public class CouponController {
 	 * 企业微信发放优惠券
 	 */
 	@PostMapping("/corp/send")
+	@SaCheckPermission("coupon:send")
 	public Result<String> corpSendCoupon(@RequestBody @Validated CorpCouponSendReq corpCouponSendReq) throws Exception {
 		String corpId = corpCouponSendReq.getCorpId();
 		String externalUserId = corpCouponSendReq.getExternalUserId();
@@ -367,6 +388,7 @@ public class CouponController {
 	 * 新增优惠券分类
 	 */
 	@PostMapping("/post/classification")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> saveClassification(@RequestBody @Validated CouponClassification classification) {
 		try {
 			couponClassificationMapper.insert(classification);
@@ -380,6 +402,7 @@ public class CouponController {
 	 * 删除优惠券分类
 	 */
 	@DeleteMapping("/delete/classification/{classificationId}")
+	@SaCheckPermission("coupon:delete")
 	public Result<String> deletedClassificationById(@PathVariable Long classificationId) {
 		Integer count = couponMapper.selectCount(Wrappers.lambdaQuery(Coupon.class)
 				.eq(Coupon::getClassificationId, classificationId)
@@ -395,6 +418,7 @@ public class CouponController {
 	 * 优惠券转移分类
 	 */
 	@PutMapping("/update/coupon/classification")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> changeCouponClassificationByClassificationId(@RequestBody @Validated CouponClassificationReq req) {
 		Long classificationId = req.getId();
 		Long newClassificationId = req.getNewClassificationId();
@@ -419,6 +443,7 @@ public class CouponController {
 	 * 编辑优惠券分类
 	 */
 	@PutMapping("/update/classification")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> updateClassification(@RequestBody @Validated CouponClassification classification) {
 		Long classificationId = classification.getId();
 		Assert.notNull(classificationId, "分类id为空");
@@ -434,6 +459,7 @@ public class CouponController {
 	 * 优惠券分类列表
 	 */
 	@GetMapping("/get/classification")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponClassificationView>> classificationView() {
 		SearchResult<CouponClassificationView> search = beanSearcher.search(CouponClassificationView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
@@ -443,6 +469,7 @@ public class CouponController {
 	 * 优惠券所有分类
 	 */
 	@GetMapping("/get/classificationList")
+	@SaCheckPermission("coupon:view")
 	public Result<List<CouponClassification>> getClassificationList() {
 		List<CouponClassification> CouponClassifications = beanSearcher.searchAll(CouponClassification.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(CouponClassifications);
@@ -480,6 +507,7 @@ public class CouponController {
 	 * 设置 设备活动满减配置
 	 */
 	@PostMapping("/set/equipment/activity/reduce")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> setEquipmentAcReduceConfig(@RequestBody EquipmentActivityReduce equipmentActivityReduce) {
 		equipmentActivityReduceService.saveOrUpdateEquipmentAcReduceConfig(equipmentActivityReduce);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -489,6 +517,7 @@ public class CouponController {
 	 * 编辑 设备活动满减配置
 	 */
 	@PutMapping("/put/equipment/activity/reduce")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> updateEquipmentAcReduceConfig(@RequestBody EquipmentActivityReduce equipmentActivityReduce) {
 		if (equipmentActivityReduce.getId() == null) {
 			throw BusinessRuntimeException.getInstance("记录不存在..");
@@ -501,6 +530,7 @@ public class CouponController {
 	 * 设备活动满减列表
 	 */
 	@GetMapping("/get/equipment/activity/reduce")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<EquipmentActivityReduce>> getEquipmentAcReduceConfig() {
 		SearchResult<EquipmentActivityReduce> search = beanSearcher.search(EquipmentActivityReduce.class, MapUtils.flatBuilder(request.getParameterMap())
 				.field(EquipmentActivityReduce::getDeleted, true)
@@ -514,6 +544,7 @@ public class CouponController {
 	 * 删除设备满减活动
 	 */
 	@DeleteMapping("/del/equipment/activity/reduce/{id}")
+	@SaCheckPermission("coupon:delete")
 	public Result<String> getEquipmentAcReduceConfig(@PathVariable Long id) {
 		Optional.ofNullable(equipmentActivityReduceService.getById(id)).ifPresent(e -> {
 			e.setDeleted(false);
@@ -526,6 +557,7 @@ public class CouponController {
 	 * 优惠券领取详情
 	 */
 	@GetMapping("/get/receipt/detail/{couponId}")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponReceiptDetailView>> getReceiptDetail(@PathVariable Long couponId) {
 		SearchResult<CouponReceiptDetailView> search = beanSearcher.search(CouponReceiptDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.put("cid",String.format("and id = %s", couponId))
@@ -537,6 +569,7 @@ public class CouponController {
 	 * 优惠券使用详情
 	 */
 	@GetMapping("/get/used/detail/{couponId}")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponUsedDetailView>> getUsedDetail(@PathVariable Long couponId) {
 		SearchResult<CouponUsedDetailView> search = beanSearcher.search(CouponUsedDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.put("cid",String.format("and id = %s", couponId))
@@ -548,6 +581,7 @@ public class CouponController {
 	 * 使用优惠券订单金额
 	 */
 	@GetMapping("/get/used/money/{couponId}")
+	@SaCheckPermission("coupon:view")
 	public Result<BigDecimal> getUsedMoney(@PathVariable Long couponId) {
 		BigDecimal money = Optional.ofNullable(orderDonMapper.getCouponUsedMoney(couponId)).orElse(BigDecimal.ZERO);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(money.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
@@ -557,6 +591,7 @@ public class CouponController {
 	 * 优惠券级联列表
 	 */
 	@GetMapping("/get/cascade")
+	@SaCheckPermission("coupon:view")
 	public Result<List<CouponClassificationCascadeView>> getCouponClassificationCascade() {
 		List<CouponClassificationCascadeView> couponClassificationCascadeViews = beanSearcher.searchAll(CouponClassificationCascadeView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 
@@ -598,6 +633,7 @@ public class CouponController {
 	 * 新增优惠弹窗
 	 */
 	@PostMapping("/post/popups")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> insertPopups(@RequestBody CouponUserPopups popups) {
 		couponUserPopupsMapper.insert(popups);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -607,6 +643,7 @@ public class CouponController {
 	 * 编辑优惠弹窗
 	 */
 	@PutMapping("/update/popups")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> updatePopups(@RequestBody CouponUserPopups popups) {
 		couponUserPopupsMapper.updateById(popups);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -616,6 +653,7 @@ public class CouponController {
 	 * 删除优惠弹窗
 	 */
 	@DeleteMapping("/delete/popups/{id}")
+	@SaCheckPermission("coupon:delete")
 	public Result<String> updatePopups(@PathVariable Long id) {
 		couponUserPopupsMapper.deleteById(id);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -625,6 +663,7 @@ public class CouponController {
 	 * 上下架优惠弹窗
 	 */
 	@PutMapping("/update/popups/status/{id}")
+	@SaCheckPermission("coupon:edit")
 	public Result<String> updatePopupsStatusById(@PathVariable Long id) {
 		Optional.ofNullable(couponUserPopupsMapper.selectById(id)).ifPresent(en->{
 			en.setStatus(!en.getStatus());
@@ -637,6 +676,7 @@ public class CouponController {
 	 * 优惠弹窗列表
 	 */
 	@GetMapping("/get/popups")
+	@SaCheckPermission("coupon:view")
 	public Result<SearchResult<CouponUserPopups>> getPopups() {
 		SearchResult<CouponUserPopups> search = beanSearcher.search(CouponUserPopups.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(CouponUserPopups::getUpdateTime).desc().build());
 		search.getDataList().forEach(pop->{

+ 41 - 16
netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.exchange;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -25,6 +26,7 @@ import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -41,6 +43,7 @@ import java.util.List;
  *创建时间:2022/11/7 14:37
  */
 @RestController
+@SaCheckLogin
 @RequestMapping("/manage/exchange/code")
 @RequiredArgsConstructor
 public class ExchangeCodeController {
@@ -63,7 +66,7 @@ public class ExchangeCodeController {
 	 * 生成兑换码 并导出
 	 */
 	@GetMapping("/createAndExport")
-	@SaCheckPermission("exchangeCode:add")
+	@SaCheckPermission({"exchangeCode:add", "exchangeCode:export"})
 	@Log(module = "兑换码/生成兑换码", businessType = BusinessType.POST, isSaveRequestData = true)
 	public void createAndExportCode(ExchangeCodeReq exchangeCodeReq, HttpServletResponse response) throws Exception {
 		if (ObjectUtil.hasEmpty(exchangeCodeReq.getSkuIds(), exchangeCodeReq.getNumber())) {
@@ -92,14 +95,7 @@ public class ExchangeCodeController {
 		if (skuId != null) {
 			condition += String.format(" and JSON_CONTAINS(sku_ids,'%s')", skuId);
 		}
-		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-		if (StrUtil.isNotEmpty(condition)) {
-			builder.put("condition", condition);
-		}
-		if (!cmsUserService.isRootRole(adminId)) {
-			CmsUser cmsUser = cmsUserMapper.selectById(adminId);
-			builder.field(ExchangeCodeView::getOperator, cmsUser.getNickname());
-		}
+		MapBuilder builder = safeSearchBuilder(condition, adminId);
 		SearchResult<ExchangeCodeView> search = beanSearcher.search(ExchangeCodeView.class, builder.build());
 		search.getDataList().forEach(data -> {
 			try {
@@ -121,6 +117,7 @@ public class ExchangeCodeController {
 	 */
 	@GetMapping("/export")
 	@SaCheckPermission("exchangeCode:export")
+	@Log(module = "兑换码/导出", businessType = BusinessType.POST, isSaveRequestData = true)
 	public void exportExchangeCode(HttpServletResponse response, Long goodsId, Long skuId) {
 		long adminId = StpUtil.getLoginIdAsLong();
 		String condition = StrUtil.EMPTY;
@@ -130,15 +127,43 @@ public class ExchangeCodeController {
 		if (skuId != null) {
 			condition += String.format(" and JSON_CONTAINS(sku_ids,'%s')", skuId);
 		}
-		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-		if (StrUtil.isNotEmpty(condition)) {
-			builder.put("condition", condition);
-		}
-		if (!cmsUserService.isRootRole(adminId)) {
-			CmsUser cmsUser = cmsUserMapper.selectById(adminId);
-			builder.field(ExchangeCodeView::getOperator, cmsUser.getNickname());
+		MapBuilder builder = safeSearchBuilder(condition, adminId);
+		if (beanSearcher.searchCount(ExcelExchangeCodeData.class, builder.build()).longValue() > 10000) {
+			throw BusinessRuntimeException.getInstance("每次最多导出10000条,请缩小查询范围");
 		}
 		List<ExcelExchangeCodeData> data = beanSearcher.searchAll(ExcelExchangeCodeData.class, builder.build());
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelExchangeCodeData.class, data, "银河兑换码", "银河兑换码", ExcelTypeEnum.XLSX, null);
 	}
+
+	// 不透传请求参数:condition、字段操作符、逻辑分组均不能由客户端指定。
+	private MapBuilder safeSearchBuilder(String condition, long adminId) {
+		MapBuilder builder = MapUtils.builder().put("condition", condition);
+		String code = request.getParameter("code");
+		if (StrUtil.isNotBlank(code)) builder.field(ExchangeCodeView::getCode, code);
+		String userId = request.getParameter("userId");
+		if (StrUtil.isNotBlank(userId)) builder.field(ExchangeCodeView::getUserId, Long.valueOf(userId));
+		String useStatus = request.getParameter("useStatus");
+		if (StrUtil.isNotBlank(useStatus)) {
+			if (!List.of("true", "false", "0", "1").contains(useStatus)) {
+				throw BusinessRuntimeException.getInstance("使用状态参数错误");
+			}
+			builder.field(ExchangeCodeView::getUseStatus, "true".equals(useStatus) || "1".equals(useStatus));
+		}
+		String codeType = request.getParameter("codeType");
+		if (StrUtil.isNotBlank(codeType)) builder.field(ExchangeCodeView::getCodeType, Integer.valueOf(codeType));
+		if (!StpUtil.hasRole("root")) {
+			CmsUser admin = cmsUserMapper.selectById(adminId);
+			if (admin == null || StrUtil.isBlank(admin.getNickname())
+					|| cmsUserMapper.selectCount(Wrappers.lambdaQuery(CmsUser.class)
+					.eq(CmsUser::getNickname, admin.getNickname())) != 1) {
+				throw BusinessRuntimeException.getInstance("创建人信息不唯一,请联系管理员核实数据归属");
+			}
+			builder.field(ExchangeCodeView::getOperator, admin.getNickname());
+		}
+		int page = request.getParameter("start") == null ? 1 : Integer.parseInt(request.getParameter("start"));
+		int size = request.getParameter("limit") == null ? 10 : Integer.parseInt(request.getParameter("limit"));
+		if (page < 1 || size < 1 || size > 100) throw BusinessRuntimeException.getInstance("分页参数错误");
+		builder.put("start", page).put("limit", size);
+		return builder;
+	}
 }

+ 8 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonWholeSaleController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.goods;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
@@ -196,7 +198,9 @@ public class CmsGoodsDonWholeSaleController {
 	/**
 	 * 押金退款
 	 */
-	@PostMapping("/deposit/refund/{id}")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/deposit/refund/{id}")
 	@Log(module = "批发押金退款", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<String> depositRefund(@PathVariable Long id) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
@@ -250,7 +254,9 @@ public class CmsGoodsDonWholeSaleController {
 	/**
 	 * 批发订单退款
 	 */
-	@PostMapping("/refund/order")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/refund/order")
 	@Log(module = "批发订单退款", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<String> wholesaleOrderRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();

+ 9 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/invoice/UserInvoiceController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.invoice;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -81,7 +82,8 @@ public class UserInvoiceController {
 	/**
 	 * 税率管理列表
 	 */
-	@GetMapping("/get/company/taxRate")
+	@SaCheckPermission("merchant:view")
+    @GetMapping("/get/company/taxRate")
 	public Result<List<InvoiceCompany>> getCompanyTaxRate() {
 		List<InvoiceCompany> invoiceCompanies = beanSearcher.searchAll(InvoiceCompany.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(invoiceCompanies);
@@ -90,7 +92,8 @@ public class UserInvoiceController {
 	/**
 	 * 新增公司税率
 	 */
-	@PostMapping("/post/company/taxRate")
+	@SaCheckPermission("merchant:edit")
+    @PostMapping("/post/company/taxRate")
 	public Result<String> insertCompanyTaxRate(@RequestBody InvoiceCompany invoiceCompany) {
 		invoiceCompanyMapper.insert(invoiceCompany);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -99,7 +102,8 @@ public class UserInvoiceController {
 	/**
 	 * 编辑公司税率
 	 */
-	@PutMapping("/update/company/taxRate")
+	@SaCheckPermission("merchant:edit")
+    @PutMapping("/update/company/taxRate")
 	public Result<String> updateCompanyTaxRate(@RequestBody InvoiceCompany invoiceCompany) {
 		invoiceCompanyMapper.updateById(invoiceCompany);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -108,7 +112,8 @@ public class UserInvoiceController {
 	/**
 	 * 删除公司税率
 	 */
-	@DeleteMapping("/delete/company/taxRate/{id}")
+	@SaCheckPermission("merchant:delete")
+    @DeleteMapping("/delete/company/taxRate/{id}")
 	public Result<String> updateCompanyTaxRate(@PathVariable Long id) {
 		invoiceCompanyMapper.deleteById(id);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();

+ 5 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.mirrorshop;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -159,7 +161,9 @@ public class UserMirrorShopController {
 	/**
 	 * 加盟费 退款
 	 */
-	@PutMapping("/fee/refund/{orderId}")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PutMapping("/fee/refund/{orderId}")
 	public Result<String> refundUserMirrorShopFee(@PathVariable Long orderId) throws Exception {
 		userMirrorCommonService.refundUserMirrorShopFee(orderId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();

+ 9 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.register;
 
+import cn.dev33.satoken.annotation.SaCheckRole;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
@@ -136,8 +138,10 @@ public class CmsRegisterController {
     /**
      * 微信订单退款
      */
+    @SaCheckLogin
+    @SaCheckPermission({"order:refund", "sign:refund"})
     @PostMapping("/wx/refund")
-    @SaCheckPermission("sign:refund")
+
     public Result<String> wxRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
         RegisterOrderDon registerOrderDon = registerOrderDonService.getById(refundReq.getOrderId());
         if (registerOrderDon==null) throw BusinessRuntimeException.getInstance("");
@@ -178,6 +182,8 @@ public class CmsRegisterController {
     /**
      * 注册 统一退款
      */
+    @SaCheckLogin
+    @SaCheckPermission("order:refund")
     @PostMapping("/unified/refund")
     public Result<String> unifiedRefund(@RequestBody OrderRefundReq refundReq) throws Exception {
         registerOrderDonService.unifiedRefund(refundReq);
@@ -187,6 +193,7 @@ public class CmsRegisterController {
     /**
      * 获取需要解除限制的账号列表
      */
+    @SaCheckRole("root")
     @GetMapping("/unLimit")
     public Result<SearchResult<SpotifyUnLimitRecord>> getUnLimit(){
         SearchResult<SpotifyUnLimitRecord> search = beanSearcher.search(SpotifyUnLimitRecord.class, MapUtils.flatBuilder(request.getParameterMap())
@@ -197,6 +204,7 @@ public class CmsRegisterController {
     /**
      * 修改解除限制状态
      */
+    @SaCheckRole("root")
     @PutMapping("/unLimit")
     public Result<String> upUnLimit(@RequestBody SpotifyUnLimitRecord spotifyUnLimitRecord) throws Exception {
         spotifyUnLimitRecordMapper.update(null, Wrappers.lambdaUpdate(SpotifyUnLimitRecord.class)

+ 41 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java

@@ -1,6 +1,8 @@
 package com.cyksj.web.controller.manage.shop;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -28,6 +30,7 @@ import java.util.Optional;
  * @author chan
  * @date 2022/12/13 4:53 PM
  */
+@SaCheckLogin
 @RestController
 @RequestMapping("/manage/shop")
 @RequiredArgsConstructor
@@ -44,10 +47,17 @@ public class ShopConfigController {
 
     private final ZfbShopOrderDayLimitMapper zfbShopOrderDayLimitMapper;
 
+    @SaCheckPermission("merchant:view")
     @GetMapping
     public Result<SearchResult<ShopConfig>> get() {
-	    SearchResult<ShopConfig> searchResult = beanSearcher.search(ShopConfig.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+	    SearchResult<ShopConfig> searchResult = beanSearcher.search(ShopConfig.class, MapUtils.builder()
+                .field(ShopConfig::getType, request.getParameter("type"))
+                .put("start", Math.max(1, parsePage("start", 1)))
+                .put("limit", Math.max(1, Math.min(100, parsePage("limit", 10))))
+                .orderBy(ShopConfig::getId).desc().build());
 	    searchResult.getDataList().forEach((shopConfig) -> {
+            shopConfig.setAppPrivateKey(null);
+            shopConfig.setSecret(null);
 		    shopConfig.setChannelCount(channelService.count(Wrappers.lambdaQuery(Channel.class).eq(Channel::getWxShopId, shopConfig.getAppId()).or().eq(Channel::getZfbShopId, shopConfig.getAppId())));
 
 		    Optional.ofNullable(zfbShopOrderDayLimitMapper.selectOne(Wrappers.lambdaQuery(ZfbShopOrderDayLimit.class)
@@ -60,18 +70,35 @@ public class ShopConfigController {
 	    return GatewayResponse.SUCCESS.newBuilder().toResult(searchResult);
     }
 
+    @SaCheckPermission("merchant:add")
     @PostMapping
     public Result<String> post(@RequestBody ShopConfig shopConfig){
+        if (shopConfig.getId() != null) throw BusinessRuntimeException.getInstance("新增商户不能携带ID");
+        validateMerchant(shopConfig);
+        if (("wx".equals(shopConfig.getType()) && StrUtil.isBlank(shopConfig.getSecret())) || ("zfb".equals(shopConfig.getType()) && StrUtil.isBlank(shopConfig.getAppPrivateKey()))) throw BusinessRuntimeException.getInstance("请填写商户密钥");
+        shopConfig.setCreatedTime(null);
+        shopConfig.setUpdateTime(null);
         shopConfigService.save(shopConfig);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    @SaCheckPermission("merchant:edit")
     @PutMapping
     public Result<String> put(@RequestBody ShopConfig shopConfig){
+        if (shopConfig.getId() == null) throw BusinessRuntimeException.getInstance("缺少商户ID");
+        ShopConfig existing = shopConfigService.getById(shopConfig.getId());
+        if (existing == null) throw BusinessRuntimeException.getInstance("商户不存在");
+        validateMerchant(shopConfig);
+        if (!existing.getAppId().equals(shopConfig.getAppId()) || !existing.getType().equals(shopConfig.getType())) throw BusinessRuntimeException.getInstance("商户号和类型不可直接修改,请新增商户并迁移关联");
+        if (StrUtil.isBlank(shopConfig.getSecret())) shopConfig.setSecret(existing.getSecret());
+        if (StrUtil.isBlank(shopConfig.getAppPrivateKey())) shopConfig.setAppPrivateKey(existing.getAppPrivateKey());
+        shopConfig.setCreatedTime(existing.getCreatedTime());
+        shopConfig.setUpdateTime(null);
         shopConfigService.updateById(shopConfig);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    @SaCheckPermission("merchant:delete")
     @DeleteMapping("/{id}")
     public Result<String> del(@PathVariable Long id){
         shopConfigService.removeById(id);
@@ -98,6 +125,7 @@ public class ShopConfigController {
     /**
      * 支付宝每日限单数 配置列表
      */
+    @SaCheckPermission("merchant:view")
     @GetMapping("/get/zfb/limit")
     public Result<List<ZfbShopOrderDayLimit>> getZfbShopOrderDayLimit() {
         List<ZfbShopOrderDayLimit> orderDayLimits = beanSearcher.searchAll(ZfbShopOrderDayLimit.class, MapUtils.flatBuilder(request.getParameterMap()).build());
@@ -107,6 +135,7 @@ public class ShopConfigController {
     /**
      * 编辑支付宝限制单数配置
      */
+    @SaCheckPermission("merchant:edit")
     @PutMapping("/update/zfb/limit")
     public Result<String> updateZfbShopOrderDayLimit(ZfbShopOrderDayLimit zfbShopOrderDayLimit) {
         zfbShopOrderDayLimitMapper.updateById(zfbShopOrderDayLimit);
@@ -116,6 +145,7 @@ public class ShopConfigController {
     /**
      * 新增支付宝限制单数配置
      */
+    @SaCheckPermission("merchant:edit")
     @PostMapping("/save/zfb/limit")
     public Result<String> saveZfbShopOrderDayLimit(@RequestBody ZfbShopOrderDayLimit zfbShopOrderDayLimit) {
         zfbShopOrderDayLimit.setHourLimitOrders(RandomUtil.randomInt(zfbShopOrderDayLimit.getHourRandOrdersSt(), zfbShopOrderDayLimit.getHourRandOrdersEnd()));
@@ -129,9 +159,19 @@ public class ShopConfigController {
     /**
      * 新增支付宝限制单数配置
      */
+    @SaCheckPermission("merchant:delete")
     @DeleteMapping("/delete/zfb/limit/{id}")
     public Result<String> saveZfbShopOrderDayLimit(@PathVariable Long id) {
         zfbShopOrderDayLimitMapper.deleteById(id);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+    private int parsePage(String name, int fallback) {
+        String value=request.getParameter(name);
+        if (StrUtil.isBlank(value)) return fallback;
+        try { return Integer.parseInt(value); } catch (NumberFormatException e) { throw BusinessRuntimeException.getInstance("分页参数错误"); }
+    }
+    private void validateMerchant(ShopConfig value) {
+        if (StrUtil.isBlank(value.getAppId()) || !("wx".equals(value.getType()) || "zfb".equals(value.getType()))) throw BusinessRuntimeException.getInstance("商户号或类型无效");
+    }
+
 }

+ 5 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/spotify/SpotifyUpgradeController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.spotify;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -95,7 +97,9 @@ public class SpotifyUpgradeController {
 	/**
 	 * 订单退款
 	 */
-	@PostMapping("/refund/{orderId}")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/refund/{orderId}")
 	public Result<String> refund(@PathVariable Long orderId) throws Exception {
 		orderRefundService.refundSpotifyUpgrade(orderId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();

+ 5 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/vip/CmsVipController.java

@@ -1,5 +1,7 @@
 package com.cyksj.web.controller.manage.vip;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -77,7 +79,9 @@ public class CmsVipController {
 	/**
 	 * 会员订单退款
 	 */
-	@PostMapping("/refund/order")
+	@SaCheckLogin
+    @SaCheckPermission("order:refund")
+    @PostMapping("/refund/order")
 	public Result<String> refundOrders(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
 		refundReq.setAdminId(adminId);

+ 16 - 1
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -56,6 +56,8 @@ public class SysConfigController {
 
 	private final SysConfigService sysConfigService;
 
+    private final com.cyksj.mapper.manage.cms.CmsUserMapper cmsUserMapper;
+
 	private final HelpQuestionMapper helpQuestionMapper;
 
 	private final HelpQuestionClassificationMapper helpQuestionClassificationMapper;
@@ -74,6 +76,7 @@ public class SysConfigController {
 
 	@GetMapping("/get")
 	public Result<SysConfig> get(String key) {
+        checkMerchantConfig(key, "merchant:view");
 		try {
 			String cacheKey = RedisService.key.SYS_CONFIG_CACHE_KEY.getName() + key;
 			Object o = redisService.get(cacheKey);
@@ -113,6 +116,7 @@ public class SysConfigController {
 	@Log(module = "系统设置/新增配置", businessType = BusinessType.POST, isSaveRequestData = true)
 	public Result<SysConfig> post(@RequestBody SysConfig sysConfig) {
         StpUtil.checkLogin();
+        checkMerchantConfig(sysConfig.getSysKey(), "merchant:edit");
         sysConfig.setId(null);
 		sysConfigService.save(sysConfig);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
@@ -124,7 +128,8 @@ public class SysConfigController {
 		long adminId = StpUtil.getLoginIdAsLong();
 		Long id = sysConfig.getId();
 		SysConfig byId = sysConfigService.getById(id);
-		sysConfig.setSysKey(byId.getSysKey());
+		checkMerchantConfig(byId.getSysKey(), "merchant:edit");
+        sysConfig.setSysKey(byId.getSysKey());
 		if (Constant.EQUIPMENT_DISTRIBUTE_KEY.equals(sysConfig.getSysKey())) {
 			String sysValue = sysConfig.getSysValue();
 			if (StrUtil.isNotBlank(sysValue)) {
@@ -170,6 +175,7 @@ public class SysConfigController {
 	public Result<String> update(@PathVariable Long id) {
 		SysConfig byId = sysConfigService.getById(id);
 		if (byId != null) {
+            checkMerchantConfig(byId.getSysKey(), "merchant:edit");
 			sysConfigService.removeById(id);
 
 			String key = byId.getSysKey();
@@ -283,4 +289,13 @@ public class SysConfigController {
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(index - 1);
 	}
+    private void checkMerchantConfig(String key, String permission) {
+        if ("sys_default_shop_key".equals(key)) {
+            StpUtil.checkLogin();
+            StpUtil.checkPermission(permission);
+            com.cyksj.model.entity.CmsUser admin = cmsUserMapper.selectById(StpUtil.getLoginIdAsLong());
+            if (admin == null || !Boolean.TRUE.equals(admin.getStatus())) throw BusinessRuntimeException.getInstance("后台账号不存在或已停用");
+        }
+    }
+
 }

+ 4 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -129,8 +129,11 @@ public class UserController {
      */
     @GetMapping("/get/ticket/code/detail")
     public Result<ExchangeCodeDetailView> getTicketCodeDetail(String code) throws Exception {
+        if (StrUtil.isBlank(code) || code.length() > 256) {
+            throw BusinessRuntimeException.getInstance("错误兑换码");
+        }
         code = URLUtil.decode(code);
-        ExchangeCodeDetailView exchangeCodeDetailView = beanSearcher.searchFirst(ExchangeCodeDetailView.class, MapUtils.flatBuilder(request.getParameterMap()).field(ExchangeCodeDetailView::getCode, code).build());
+        ExchangeCodeDetailView exchangeCodeDetailView = beanSearcher.searchFirst(ExchangeCodeDetailView.class, MapUtils.builder().field(ExchangeCodeDetailView::getCode, code).build());
         if (exchangeCodeDetailView == null) {
             throw BusinessRuntimeException.getInstance("错误兑换码");
         }

+ 7 - 0
pom.xml

@@ -12,6 +12,7 @@
     <description>netflix</description>
     <properties>
         <java.version>11</java.version>
+        <fastjson.version>1.2.84</fastjson.version>
         <spring.boot.version>2.4.3</spring.boot.version>
         <jackson.version>2.10.3</jackson.version>
 
@@ -22,6 +23,12 @@
 
     <dependencyManagement>
         <dependencies>
+            <!-- Pin transitive Fastjson 1.x dependencies to the security fix release. -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.springframework.boot</groupId>