Skip to content

[需求] 企业CLA签署管理平台优化-2-的开发实现-app-cla-server部分 - #519

Open
fly333sky wants to merge 1 commit into
reviewfrom
issue-1975-from-review
Open

fly333sky wants to merge 1 commit into
reviewfrom
issue-1975-from-review

Conversation

@fly333sky

Copy link
Copy Markdown

背景

[需求] 企业CLA签署管理平台优化-2(app-cla-server)· 开发流水线 · 开发预览阶段(代码已推 + 预览已部署 + UT 已补;门禁/对抗由 PR CI 异步跑)

改动内容

feat(app-cla-server, app-cla-webui): 新增已申请企业名单 CSV 导出功能

改动概述

基于 issue #1975 和 design.md,在既有企业签署名单查询链路上新增只读 CSV 导出能力。app-cla-server 新增 GET /v1/corporation-signing/export/:link_id 接口,复用现有鉴权与查询逻辑;app-cla-webui 名单页面新增「导出名单」按钮完成浏览器文件下载。

改动文件清单

app-cla-server(6 个修改文件 + 1 个新增测试文件)

  1. signing/app/corp_signing.go — 核心实现

    • CorpSigningService 接口新增 Export(userId, linkId string, adminAdded bool, searchQuery string) ([]byte, error) 方法
    • Export 方法实现:复用 checkIfCommunityManager 权限校验 → 循环 FindPage(pageSize=200, maxPages=500) 全量收集 DTO → 调 CSV 纯函数生成字节流
    • 新增纯函数 corpListToCSV(rows []CorpSigningDTO) []byte:使用 encoding/csv 标准库生成,前置 UTF-8 BOM 保证 Excel 中文不乱码;表头 序号,企业名称,申请状态,CLA语言,申请时间;申请状态由 HasAdminAdded 判定(已完成/未完成);空列表仅输出表头
    • 新增纯函数 escapeCSVCell(s string) string:单元格以 =/+/-/@ 开头时前缀 ' 防公式注入
    • 导出不含 admin_emailadmin_name 等个人敏感字段(内容红线 D1)
  2. signing/adapter/corp_signing.go — 适配层

    • 新增 ExportCorpSigningList(userId, linkId string, adminAdded bool, searchQuery string) ([]byte, models.IModelError),透传 service 层 Export 方法
  3. models/adapter.go — 模型层入口

    • 新增 ExportCorpSigningList(userId, linkID string, adminAdded bool, searchQuery string) ([]byte, IModelError) 透传函数
  4. models/init.go — 接口定义

    • corpSigningAdapter 接口新增 ExportCorpSigningList 方法签名
  5. controllers/corp_signing.go — 控制器

    • 新增 Export() 方法(仿 GetPage),带 @router /export/:link_id [get] 注解
    • 鉴权自动继承 Prepare()(GET 且非 /cla/diff/cla/agreeapiPrepare(PermissionOwnerOfOrg)
    • 成功时设置 Content-Type: text/csv; charset=utf-8Content-Disposition: attachment; filename=...,以 ctl.Ctx.Output.Body() 输出内存字节流
    • 错误码体系与 GetPage 完全一致(401 missing_token 等)
  6. routers/commentsRouter.go — 路由注册

    • 追加 Export 路由注册项(/export/:link_id, GET),与 GetPage 注册项同款
  7. signing/app/corp_signing_export_test.go(新增)— 单元测试

    • TestCorpListToCSVBOM:BOM 存在性
    • TestCorpListToCSVEmpty:空列表仅表头
    • TestCorpListToCSVNormal:正常多行输出,含序号/企业名称/状态/语言/时间校验
    • TestCorpListToCSVFormulaInjection=/+/-/@ 开头单元格转义
    • TestCorpListToCSVSpecialChars:含逗号/引号/中文企业名转义与编码
    • TestEscapeCSVCell:escapeCSVCell 函数各分支(表驱动)
    • TestExportSuccess:正常路径(权限校验通过 + 数据收集 + CSV 生成)
    • TestExportEmptyResult:空名单路径
    • TestExportLinkNotFound:link 不存在异常路径
    • TestExportNoPermission:无权限异常路径
    • TestExportMultiPage:多页分页收集(200+5 条跨 2 页)
    • 增量覆盖率:Export 94.1%、corpListToCSV 100%、escapeCSVCell 100%

app-cla-webui(4 个修改文件)

  1. src/util/api.js — 新增常量 exportCorporationSigningList = '/v1/corporation-signing/export'
  2. src/views/CorporationList.vue
    • 搜索框旁新增「导出名单」按钮(el-button size="small" :loading="exportLoading"
    • 新增 exportCorpList() 方法:空名单时 ElMessage.info(t('corp.no_data')) 不发请求;否则 http(responseType: 'blob') 请求导出接口 → saveAs 下载 已申请企业名单_<状态>_<时间戳>.csv;失败走 util.catchErr(401 自动弹 ReLoginDialog);下载期间按钮 loading 防重复
    • 新增 exportLoading ref + .searchBar flex 布局样式
  3. src/i18n/org/org-zh.js — 新增 export_list: '导出名单'
  4. src/i18n/org/org-en.js — 新增 export_list: 'Export List'

需求对应

相关 Issue

resolve https://github.com/opensourceways/backlog/issues/1975

AI 使用声明

当前 PR 是否有 AI 参与:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants