Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70ede5033d | ||
|
|
308ded5016 | ||
|
|
46aa770381 |
65
0-红山开源_通知系统.docx.beautified.md
Normal file
65
0-红山开源_通知系统.docx.beautified.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# 通知系统
|
||||||
|
|
||||||
|
## 开源项目
|
||||||
|
|
||||||
|
| 类型 | 模块 | 触发场景 | 收信人 | 文案参考 | 文案跳转 |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 系统通知 | 开源项目 | 账号有权限变更:用户在所属仓库发生角色变更,如开发者变更为报告者 | 发生权限变更的用户 | 仓库 xxxx已把你的角色改为xxx | 点击通知将跳转到该仓库详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 用户被拉入项目:<br/>1.仓库管理员添加用户为项目成员<br/>2.用户申请加入项目被审批通过 | 被拉入项目的用户 | 你已加入 xxxx 项目 | 点击通知将跳转到该仓库详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 用户被从项目移出:仓库管理员将用户从项目成员中移除 | 被移除项目的用户 | 你已被移出xxxx 项目 | 点击通知无跳转 |
|
||||||
|
| 系统通知 | 开源项目 | 用户被拉入组织 | 被拉入组织的用户 | 你已被拉入组织 xxx 的 xxx 团队,拥有xxx权限 | 点击通知将跳转到该组织详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 用户被从组织移出:<br/>1.用户被组织owner/管理员从组织团队中移除,用户不再属于组织<br/>2.用户主动离开团队 | “ ” | 1.你已被移出xxx组织<br/>2.你已被移出组织 xxx 的 xxx团队 | 点击通知无跳转 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库有新的issue | 仓库管理者 | xxx在 xxx 新建疑修:xxxx | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库有新的PR | 仓库管理者 | xxx在 xxx 提交了一个合并请求:xxx | 点击通知将跳转到该合并请求详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库有成员变动:<br/>我管理的仓库有新的成员 | 仓库管理者 | xxx 已加入项目 xxxx | 点击通知将跳转到该项目详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库有成员变动:<br/>我管理的仓库有移出成员 | 仓库管理者 | xxx 已被移出项目 xxxx | 点击通知将跳转到该项目详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库设置被更改:更改项目名称,项目标识,项目简介,项目类别,项目语言,项目公私有状态 | 仓库管理者 | xxx更改了 xxx 仓库设置:<br/>更改xxx为"xxx"<br/>更改xxx为"xxx" | 点击通知将跳转到该项目的仓库设置页面 |
|
||||||
|
| 系统通知 | 开源项目 | 有新的issue指派给我 | Issue负责人 | xxx在 xxx 指派给你一个疑修:xxx | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 有新的PR指派给我 | PR负责人 | xxx在 xxx 指派给你一个合并请求:xxx | 点击通知将跳转到该合并请求详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我创建的issue变更:修改负责人,状态,类型,优先级,完成度,指定分支,开始日期,结束日期,里程碑,标记 | Issue创建人 | 在项目 xxx 的疑修 xxx 中:<br/>xxx 将xx从 xxx 修改为 xxx | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我负责的issue状态变更:修改负责人,状态,类型,优先级,完成度,指定分支,开始日期,结束日期,里程碑,标记 | Issue负责人 | 在项目 xxx 的疑修 xxx 中:xxx 将xxx 从 xxx 修改为 xxx | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我创建的PR被拒绝 | PR创建人 | 你提交的合并请求:xxx在 被拒绝 | 点击通知无跳转 |
|
||||||
|
| 系统通知 | 开源项目 | 我创建的PR被合并 | PR创建人 | 你提交的合并请求:xxx已通过 | 点击通知将跳转到该合并请求详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我负责的PR被拒绝 | PR的负责人 | 你提交的合并请求:xxx 被拒绝 | 点击通知无跳转 |
|
||||||
|
| 系统通知 | 开源项目 | 我负责的PR被合并 | PR的负责人 | 你提交的合并请求:xxx已通过 | 点击通知将跳转到该合并请求详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我创建的issue临近结束日期最后一天:如当天是10-11,结束日期为10-12 | Issue创建人 | 疑修 xxx 已临近截止日期,请尽快处理 | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我负责的issue临近结束日期最后一天:如当天是10-11,结束日期为10-12 | Issue负责人 | 疑修 xxx 已临近截止日期,请尽快处理 | 点击通知将跳转到该issue详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库被点赞 | 仓库管理员 | Xxx 点赞了你管理的仓库 xxx | 点击通知将跳转到点赞用户的开源主页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库被fork:公有仓库被fork | 仓库管理员 | Xxx 复刻了你管理的仓库 xxx 到 xxx | 点击通知将跳转到fork后的仓库 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库被fork:私有仓库被fork | 仓库管理员 | Xxx 复刻了你管理的仓库 xxx 到 xxx | 目前点击跳转no page,因无访问权限 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库有新的里程碑 | 仓库管理员 | Xxx 在 xxx 创建了一个里程碑:xxx | 点击通知将跳转到该里程碑详情页 |
|
||||||
|
| 系统通知 | 开源项目 | 我管理的仓库里程碑已完成:里程碑里面所有疑修均已关闭 | 仓库管理员 | 在 xxx 仓库,里程碑 xxx 的完成度已达到了100% | 点击通知将跳转到该里程碑详情页 |
|
||||||
|
| @我 | 开源项目 | Issue描述中@我 | 被@的用户 | xxx(用户名)在易修 xxx中@你<br/>仓库:xxx | 点击通知跳转到该易修详情页 |
|
||||||
|
| @我 | 开源项目 | Issue评论中@我 | 被@的用户 | xxx(用户名)在易修 xxx中@你<br/>仓库:xxx | 点击通知跳转到该易修详情页 |
|
||||||
|
| @我 | 开源项目 | PR描述中@我 | 被@的用户 | xxx(用户名)在合并请求 xxx中@你<br/>仓库:xxx | 点击通知跳转到该合并请求详情页 |
|
||||||
|
| @我 | 开源项目 | PR评论中@我 | 被@的用户 | xxx(用户名)在合并请求 xxx中@你<br/>仓库:xxx | 点击通知跳转到该合并请求详情页 |
|
||||||
|
|
||||||
|
## 创客空间
|
||||||
|
|
||||||
|
| 类型 | 模块 | 触发场景 | 收信人 | 文案参考 | 文案跳转 |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务进入成果征集中状态:<br/>1.内部企业发布的任务通过管理员审核<br/>2.管理员发布任务成功 | 任务发布者 | 创客任务 xxx 已进入成果征集阶段 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务进入成果评选中状态:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已进入成果评选阶段 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务进入公示中状态:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已进入结果公示阶段 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务进入协议签订中状态:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已进入协议签订阶段 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务进入支付中状态:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已进入支付阶段 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务由于延期自动关闭:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已关闭 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务被系统管理员手动关闭:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已关闭 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 应征者成果已公示:任务已进入公示期且设置了应征者名单公示 | 所有参与应征者收到通知 | 创客任务 xxx 已将成果进行公示 | 点击通知跳转到该任务详情页 |
|
||||||
|
| 系统通知 | 创客空间 | 我发布的任务已延期:<br/>1.管理员发布的任务<br/>2.内部企业发布的任务 | 任务发布者 | 创客任务 xxx 已延期,请尽快处理 | 点击通知跳转到该任务详情页 |
|
||||||
|
|
||||||
|
## 开放竞赛
|
||||||
|
|
||||||
|
| 类型 | 模块 | 触发场景 | 收信人 | 文案参考 | 文案跳转 |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 系统通知 | 开放竞赛 | 已报名竞赛进入比赛阶段(提交作品开始时间已开始) | 参赛者 | 你报名的竞赛 xxx 已进入比赛进行阶段,可在此阶段提 交作品 | 点击通知跳转到竞赛详情页 |
|
||||||
|
| 系统通知 | 开放竞赛 | 已报名竞赛临近结束时间(3天) | 参赛者 | 你报名的竞赛 xxx 距作品提交结束日期仅剩 3 天,若尚 未提交参赛作品,请尽快提交 | 点击通知跳转到竞赛详情页 |
|
||||||
|
| 系统通知 | 开放竞赛 | 已报名竞赛进入公示阶段(提交作品结束时间已结束) | 参赛者 | 你报名的竞赛 xxx 已进入成绩公示阶段,可查看排行榜 | 点击通知跳转到竞赛详情页 |
|
||||||
|
|
||||||
|
## 专家评审系统
|
||||||
|
|
||||||
|
| 类型 | 模块 | 触发场景 | 收信人 | 文案参考 | 文案跳转 |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 系统通知 | 专家评审 | 专家注册通过<br/>1.初次注册审核通过<br/>2.修改资料审核通 | 注册专家的用户 | 你的专家资料已审核通过,成功注册为专家! | 点击通知跳转到该用户登记专家资料页面 |
|
||||||
|
| 系统通知 | 专家评审 | 专家收到评审任务<br/>1.创客评审任务<br/>2.竞赛评审任务 | 收到指派任务的专家 | 你有新的专家评审任务 xxx,请及时完成评审 | 点击通知跳转到当前评审任务详情页 |
|
||||||
|
| 系统通知 | 专家评审 | 创客评审任务已到达评审结束时间<br/>1.创客评审任务<br/>2.竞赛评审任务 | 系统管理员 | 专家评审任务 xxx 已评审完成,请根据专家评审意见公示结果 | 点击通知跳转到查看任务评审结果页面 |
|
||||||
233
cadvisor.yaml
Normal file
233
cadvisor.yaml
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
---
|
||||||
|
kind: "DaemonSet"
|
||||||
|
apiVersion: "apps/v1"
|
||||||
|
metadata:
|
||||||
|
name: "cadvisor"
|
||||||
|
namespace: "base-service"
|
||||||
|
uid: "6a273cc5-a389-4a19-bc45-3d2f6dfb14f4"
|
||||||
|
resourceVersion: "11770660"
|
||||||
|
generation: 1
|
||||||
|
creationTimestamp: "2025-07-14T09:16:44Z"
|
||||||
|
annotations:
|
||||||
|
deprecated.daemonset.template.generation: "1"
|
||||||
|
field.cattle.io/publicEndpoints: "[{\"nodeName\":\":osredm-master\",\"addresses\"\
|
||||||
|
:[\"172.20.32.234\"],\"port\":8080,\"protocol\":\"TCP\",\"podName\":\"base-service:cadvisor-jwddk\"\
|
||||||
|
,\"allNodes\":false}]"
|
||||||
|
kubectl.kubernetes.io/last-applied-configuration: "{\"apiVersion\":\"apps/v1\"\
|
||||||
|
,\"kind\":\"DaemonSet\",\"metadata\":{\"annotations\":{\"mon-name\":\"容器监控探针\
|
||||||
|
\"},\"name\":\"cadvisor\",\"namespace\":\"base-service\"},\"spec\":{\"selector\"\
|
||||||
|
:{\"matchLabels\":{\"app\":\"cadvisor\"}},\"template\":{\"metadata\":{\"labels\"\
|
||||||
|
:{\"app\":\"cadvisor\"}},\"spec\":{\"containers\":[{\"image\":\"google/cadvisor:v0.31.0\"\
|
||||||
|
,\"name\":\"cadvisor\",\"ports\":[{\"containerPort\":8080}],\"volumeMounts\"\
|
||||||
|
:[{\"mountPath\":\"/rootfs\",\"name\":\"rootfs\",\"readOnly\":true},{\"mountPath\"\
|
||||||
|
:\"/var/run\",\"name\":\"var-run\",\"readOnly\":true},{\"mountPath\":\"/sys\"\
|
||||||
|
,\"name\":\"sys\",\"readOnly\":true},{\"mountPath\":\"/var/lib/docker\",\"name\"\
|
||||||
|
:\"docker\",\"readOnly\":true}]}],\"hostNetwork\":true,\"hostPID\":true,\"tolerations\"\
|
||||||
|
:[{\"effect\":\"NoSchedule\",\"key\":\"node-role.kubernetes.io/master\"}],\"\
|
||||||
|
volumes\":[{\"hostPath\":{\"path\":\"/\"},\"name\":\"rootfs\"},{\"hostPath\"\
|
||||||
|
:{\"path\":\"/var/run\"},\"name\":\"var-run\"},{\"hostPath\":{\"path\":\"/sys\"\
|
||||||
|
},\"name\":\"sys\"},{\"hostPath\":{\"path\":\"/var/lib/docker\"},\"name\":\"\
|
||||||
|
docker\"}]}}}}\n"
|
||||||
|
mon-name: "容器监控探针"
|
||||||
|
managedFields:
|
||||||
|
- manager: "kubectl-client-side-apply"
|
||||||
|
operation: "Update"
|
||||||
|
apiVersion: "apps/v1"
|
||||||
|
time: "2025-07-14T09:16:44Z"
|
||||||
|
fieldsType: "FieldsV1"
|
||||||
|
fieldsV1:
|
||||||
|
f:metadata:
|
||||||
|
f:annotations:
|
||||||
|
".": {}
|
||||||
|
f:deprecated.daemonset.template.generation: {}
|
||||||
|
f:kubectl.kubernetes.io/last-applied-configuration: {}
|
||||||
|
f:mon-name: {}
|
||||||
|
f:spec:
|
||||||
|
f:revisionHistoryLimit: {}
|
||||||
|
f:selector: {}
|
||||||
|
f:template:
|
||||||
|
f:metadata:
|
||||||
|
f:labels:
|
||||||
|
".": {}
|
||||||
|
f:app: {}
|
||||||
|
f:spec:
|
||||||
|
f:containers:
|
||||||
|
k:{"name":"cadvisor"}:
|
||||||
|
".": {}
|
||||||
|
f:image: {}
|
||||||
|
f:imagePullPolicy: {}
|
||||||
|
f:name: {}
|
||||||
|
f:ports:
|
||||||
|
".": {}
|
||||||
|
k:{"containerPort":8080,"protocol":"TCP"}:
|
||||||
|
".": {}
|
||||||
|
f:containerPort: {}
|
||||||
|
f:hostPort: {}
|
||||||
|
f:protocol: {}
|
||||||
|
f:resources: {}
|
||||||
|
f:terminationMessagePath: {}
|
||||||
|
f:terminationMessagePolicy: {}
|
||||||
|
f:volumeMounts:
|
||||||
|
".": {}
|
||||||
|
k:{"mountPath":"/rootfs"}:
|
||||||
|
".": {}
|
||||||
|
f:mountPath: {}
|
||||||
|
f:name: {}
|
||||||
|
f:readOnly: {}
|
||||||
|
k:{"mountPath":"/sys"}:
|
||||||
|
".": {}
|
||||||
|
f:mountPath: {}
|
||||||
|
f:name: {}
|
||||||
|
f:readOnly: {}
|
||||||
|
k:{"mountPath":"/var/lib/docker"}:
|
||||||
|
".": {}
|
||||||
|
f:mountPath: {}
|
||||||
|
f:name: {}
|
||||||
|
f:readOnly: {}
|
||||||
|
k:{"mountPath":"/var/run"}:
|
||||||
|
".": {}
|
||||||
|
f:mountPath: {}
|
||||||
|
f:name: {}
|
||||||
|
f:readOnly: {}
|
||||||
|
f:dnsPolicy: {}
|
||||||
|
f:hostNetwork: {}
|
||||||
|
f:hostPID: {}
|
||||||
|
f:restartPolicy: {}
|
||||||
|
f:schedulerName: {}
|
||||||
|
f:securityContext: {}
|
||||||
|
f:terminationGracePeriodSeconds: {}
|
||||||
|
f:tolerations: {}
|
||||||
|
f:volumes:
|
||||||
|
".": {}
|
||||||
|
k:{"name":"docker"}:
|
||||||
|
".": {}
|
||||||
|
f:hostPath:
|
||||||
|
".": {}
|
||||||
|
f:path: {}
|
||||||
|
f:type: {}
|
||||||
|
f:name: {}
|
||||||
|
k:{"name":"rootfs"}:
|
||||||
|
".": {}
|
||||||
|
f:hostPath:
|
||||||
|
".": {}
|
||||||
|
f:path: {}
|
||||||
|
f:type: {}
|
||||||
|
f:name: {}
|
||||||
|
k:{"name":"sys"}:
|
||||||
|
".": {}
|
||||||
|
f:hostPath:
|
||||||
|
".": {}
|
||||||
|
f:path: {}
|
||||||
|
f:type: {}
|
||||||
|
f:name: {}
|
||||||
|
k:{"name":"var-run"}:
|
||||||
|
".": {}
|
||||||
|
f:hostPath:
|
||||||
|
".": {}
|
||||||
|
f:path: {}
|
||||||
|
f:type: {}
|
||||||
|
f:name: {}
|
||||||
|
f:updateStrategy:
|
||||||
|
f:rollingUpdate:
|
||||||
|
".": {}
|
||||||
|
f:maxSurge: {}
|
||||||
|
f:maxUnavailable: {}
|
||||||
|
f:type: {}
|
||||||
|
- manager: "kube-controller-manager"
|
||||||
|
operation: "Update"
|
||||||
|
apiVersion: "apps/v1"
|
||||||
|
time: "2025-07-14T09:16:51Z"
|
||||||
|
fieldsType: "FieldsV1"
|
||||||
|
fieldsV1:
|
||||||
|
f:status:
|
||||||
|
f:currentNumberScheduled: {}
|
||||||
|
f:desiredNumberScheduled: {}
|
||||||
|
f:numberAvailable: {}
|
||||||
|
f:numberReady: {}
|
||||||
|
f:observedGeneration: {}
|
||||||
|
f:updatedNumberScheduled: {}
|
||||||
|
subresource: "status"
|
||||||
|
- manager: "rancher"
|
||||||
|
operation: "Update"
|
||||||
|
apiVersion: "apps/v1"
|
||||||
|
time: "2025-07-14T09:16:52Z"
|
||||||
|
fieldsType: "FieldsV1"
|
||||||
|
fieldsV1:
|
||||||
|
f:metadata:
|
||||||
|
f:annotations:
|
||||||
|
f:field.cattle.io/publicEndpoints: {}
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: "cadvisor"
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: null
|
||||||
|
labels:
|
||||||
|
app: "cadvisor"
|
||||||
|
spec:
|
||||||
|
volumes:
|
||||||
|
- name: "rootfs"
|
||||||
|
hostPath:
|
||||||
|
path: "/"
|
||||||
|
type: ""
|
||||||
|
- name: "var-run"
|
||||||
|
hostPath:
|
||||||
|
path: "/var/run"
|
||||||
|
type: ""
|
||||||
|
- name: "sys"
|
||||||
|
hostPath:
|
||||||
|
path: "/sys"
|
||||||
|
type: ""
|
||||||
|
- name: "docker"
|
||||||
|
hostPath:
|
||||||
|
path: "/var/lib/docker"
|
||||||
|
type: ""
|
||||||
|
containers:
|
||||||
|
- name: "cadvisor"
|
||||||
|
image: "google/cadvisor:v0.31.0"
|
||||||
|
ports:
|
||||||
|
- hostPort: 8080
|
||||||
|
containerPort: 8080
|
||||||
|
protocol: "TCP"
|
||||||
|
resources: {}
|
||||||
|
volumeMounts:
|
||||||
|
- name: "rootfs"
|
||||||
|
readOnly: true
|
||||||
|
mountPath: "/rootfs"
|
||||||
|
- name: "var-run"
|
||||||
|
readOnly: true
|
||||||
|
mountPath: "/var/run"
|
||||||
|
- name: "sys"
|
||||||
|
readOnly: true
|
||||||
|
mountPath: "/sys"
|
||||||
|
- name: "docker"
|
||||||
|
readOnly: true
|
||||||
|
mountPath: "/var/lib/docker"
|
||||||
|
terminationMessagePath: "/dev/termination-log"
|
||||||
|
terminationMessagePolicy: "File"
|
||||||
|
imagePullPolicy: "IfNotPresent"
|
||||||
|
restartPolicy: "Always"
|
||||||
|
terminationGracePeriodSeconds: 30
|
||||||
|
dnsPolicy: "ClusterFirst"
|
||||||
|
hostNetwork: true
|
||||||
|
hostPID: true
|
||||||
|
securityContext: {}
|
||||||
|
schedulerName: "default-scheduler"
|
||||||
|
tolerations:
|
||||||
|
- key: "node-role.kubernetes.io/master"
|
||||||
|
effect: "NoSchedule"
|
||||||
|
updateStrategy:
|
||||||
|
type: "RollingUpdate"
|
||||||
|
rollingUpdate:
|
||||||
|
maxUnavailable: 1
|
||||||
|
maxSurge: 0
|
||||||
|
revisionHistoryLimit: 10
|
||||||
|
status:
|
||||||
|
currentNumberScheduled: 1
|
||||||
|
numberMisscheduled: 0
|
||||||
|
desiredNumberScheduled: 1
|
||||||
|
numberReady: 1
|
||||||
|
observedGeneration: 1
|
||||||
|
updatedNumberScheduled: 1
|
||||||
|
numberAvailable: 1
|
||||||
BIN
需求拆解模板.doc
Normal file
BIN
需求拆解模板.doc
Normal file
Binary file not shown.
Reference in New Issue
Block a user