Compare commits

..

No commits in common. "master" and "v1.0" have entirely different histories.
master ... v1.0

105 changed files with 515 additions and 3475 deletions

View File

@ -1,58 +0,0 @@
version: 2
name: develop流水线
description: ""
global:
concurrent: 1
workflow:
- ref: start
name: 开始
task: start
- ref: end
name: 结束
task: end
needs:
- ssh_cmd_0
- ref: git_clone_0
name: git clone
task: git_clone@1.2.9
input:
username: ((wangjing.git_username))
password: ((wangjing.git_password))
remote_url: '"https://gitlink.org.cn/wangjing22e/gitlink_help_center.git"'
ref: '"refs/heads/develop"'
commit_id: '""'
depth: 1
needs:
- start
- ref: docker_image_build_0
name: docker镜像构建
task: docker_image_build@1.6.0
input:
docker_username: ((wangjing.docker_username))
docker_password: ((wangjing.docker_password))
image_name: '"crpi-8cna9ehjfmfkjsuv.cn-shanghai.personal.cr.aliyuncs.com/software_devops/gitlink_help_center"'
image_tag: '"latest"'
registry_address: '"crpi-8cna9ehjfmfkjsuv.cn-shanghai.personal.cr.aliyuncs.com"'
docker_file: '"Dockerfile"'
docker_build_path: '"."'
workspace: git_clone_0.git_path
image_clean: true
image_push: true
build_args: '""'
needs:
- git_clone_0
- ref: ssh_cmd_0
name: ssh执行命令
task: ssh_cmd@1.1.1
input:
ssh_pass: ((wangjing.remote_password))
ssh_ip: '"47.96.249.60"'
ssh_port: '"22"'
ssh_user: '"root"'
ssh_cmd: '"docker stop group4 || true && docker rm group4 || true && docker pull
crpi-8cna9ehjfmfkjsuv.cn-shanghai.personal.cr.aliyuncs.com/software_devops/gitlink_help_center:latest &&
docker run -d -p 3000:3000 --name group4
crpi-8cna9ehjfmfkjsuv.cn-shanghai.personal.cr.aliyuncs.com/software_devops/gitlink_help_center:latest"'
needs:
- docker_image_build_0

View File

@ -0,0 +1,62 @@
version: 2
name: 未命名项目
description: ""
global:
concurrent: 1
trigger:
webhook: gitlink@1.0.0
event:
- ref: push
ruleset-operator: AND
workflow:
- ref: start
name: 开始
task: start
- ref: git_clone_0
name: git clone
task: git_clone@1.2.9
input:
username: ((ganshihao21.ganshihao21_user))
password: ((ganshihao21.ganshihao21))
remote_url: '"https://gitlink.org.cn/ganshihao21/reposync.git"'
ref: '"refs/heads/master"'
commit_id: '""'
depth: 1
needs:
- start
- ref: docker_image_build_0
name: docker镜像构建
task: docker_image_build@1.6.0
input:
docker_username: ((nudt_devops.nudt_devops))
docker_password: ((nudt_devops.nudt_devops))
image_name: '"registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5"'
image_tag: '"latest"'
registry_address: '"registry.cn-guangzhou.aliyuncs.com"'
docker_file: '"Dockerfile"'
docker_build_path: '"."'
workspace: git_clone_0.git_path
image_push: true
build_args: '""'
needs:
- git_clone_0
- ref: ssh_cmd_0
name: ssh执行命令
task: ssh_cmd@1.1.1
input:
ssh_pass: ((ssh_key.ssh_key))
ssh_ip: '"47.96.164.145"'
ssh_port: '"22"'
ssh_user: '"root"'
ssh_cmd: '"docker stop abc_group5 && docker rm abc_group5 && docker pull
registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5:latest &&
docker run -d -p 3000:3000 --name abc_group5
registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5:latest"'
needs:
- docker_image_build_0
- ref: end
name: 结束
task: end
needs:
- ssh_cmd_0

View File

@ -1,7 +1,7 @@
---
sidebar_label: "介绍"
label: "介绍"
sidebar_position: 0
sidebar_position: 1
slug: /
---
@ -32,7 +32,7 @@ GitLink确实开源是CCF官方指定的开源创新服务平台旨在
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/代码库管理/仓库创建">
<h2 class="text--truncate cardTitle" title="代码库管理">代码库管理</h2>
<p>代码库使用及设置[9个文档]</p>
<p>代码库使用及设置[8个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/组织管理/组织简介">
@ -90,4 +90,4 @@ GitLink确实开源是CCF官方指定的开源创新服务平台旨在
</a></article>
</section>
</div>
</div>
</div>

View File

@ -7,11 +7,9 @@ sidebar_position: 2
1. 进入需要发起合并请求的项目的“**合并请求(PR)**”界面,点击上方的“**新建合并请求**”按钮后,进入合并请求发布界面,如下所示:
![合并请求模块](/img/PR/imagePR2.png)
![合并请求模块](../../static/img/PR/imagePR2.png)<br/>
![合并请求发布界面](../../static/img/PR/imagePR3.png)<br/>
![合并请求发布界面](/img/PR/imagePR3.png)
2. 选择需要合并的**源分支**和**目标分支**其中源分支为已完成代码开发、需要合并其代码变更的分支目标分支为要并入代码变更的分支既可以是同一仓库下的其他分支branch也可以是被复刻的源仓库下的分支
@ -21,5 +19,4 @@ sidebar_position: 2
5. 最后信息填写完毕后,点击底部的“**创建**”按钮即可提交您的第一个合并请求了🎉🎉🎉!
![创建合并请求](../../static/img/PR/imagePR4.png)<br/>
![创建合并请求](/img/PR/imagePR4.png)

View File

@ -9,8 +9,7 @@ sidebar_position: 4
然而对于不同分支间的提交合并存在多种合并模式下图为GitLink中支持的合并模式包括**合并请求**、**变基并合并**、**变基合并 --no-ff**以及**压缩提交并合并**四种。
![](../../static/img/PR/imagePR5.png)<br/>
![合并模式](/img/PR/imagePR5.png)
1. **合并请求**
@ -18,13 +17,11 @@ sidebar_position: 4
快进合并前:
![](../../static/img/PR/imagePR6.png)<br/>
![快进合并前](/img/PR/imagePR6.png)
快进合并后:
![](../../static/img/PR/imagePR7.png)<br/>
![快进合并后](/img/PR/imagePR7.png)
**注意**:可以看到,合并的过程就是直接把`master`指针移动到了`dev`指针处,这种合并被称为**快进fast-forward**之所以出现这种情形是因为在提交3之后`master`分支上没有新的提交,所以通过直接快进`master`指针就可以完成合并;但如果在`master`分支上也有新的提交,就需要进行实质性的合并了,如下面两幅图所示:
@ -32,21 +29,18 @@ sidebar_position: 4
非快进合并前:
![](../../static/img/PR/imagePR8.png)<br/>
![非快进合并前](/img/PR/imagePR8.png)
合并之后提交A、B、C都会按时间线加入`master`的提交记录中并且会生成一个新的提交D用于记录合并这件事情此外如果合并过程中发生了冲突即两个分支对同一个文件进行了修改则需要手动处理冲突这种合并方式就是**非快进no fast-forward**,这也是**合并请求**模式下的默认方式!
非快进合并后:
![](../../static/img/PR/imagePR9.png))<br/>
![非快进合并后](/img/PR/imagePR9.png)
为了方便理解,可以以线性方式查看合并后的`master`分支上的提交记录
![](../../static/img/PR/imagePR10.png)<br/>
![线性的提交记录](/img/PR/imagePR10.png)
**总结**:在**合并请求**模式下,默认采用**非快进**合并开发分支到`master`分支上,而**非快进**方式会生成一个特殊的提交用于记录此次合并事件!
@ -58,21 +52,18 @@ sidebar_position: 4
变基前:
![](../../static/img/PR/imagePR8.png)<br/>
![变基前](/img/PR/imagePR8.png)
变基后、合并前:
![](../../static/img/PR/imagePR11.png)<br/>
![变基后_合并前](/img/PR/imagePR11.png)
`dev`分支变基之后,`master`分支就没有“更新”的提交了,所以此时进行合并,就得到了如下的结果
合并后:
![](../../static/img/PR/imagePR12.png)<br/>
![合并后](/img/PR/imagePR12.png)
**总结**:在**变基并合并**模式下,开发分支`dev`可以先进行变基操作,使其上的提交看起来都是在`master`分支最新的提交基础上进行的,然后再通过**快进**方式合并回`master`分支,从而起到整理提交记录的作用!
@ -82,13 +73,11 @@ sidebar_position: 4
`--no-ff`合并前:
![](../../static/img/PR/imagePR11.png)<br/>
![--no-ff合并前](/img/PR/imagePR11.png)
`--no-ff`合并后:
![](../../static/img/PR/imagePR13.png)<br/>
![--no-ff合并后](/img/PR/imagePR13.png)
**总结**:通过`--no-ff`选项,可以显式声明在合并时采用**非快进**方式,这样就可以在`master`分支中添加一个记录合并事件的提交!
@ -98,17 +87,14 @@ sidebar_position: 4
压缩前:
![](../../static/img/PR/imagePR8.png)<br/>
![压缩前](/img/PR/imagePR8.png)
压缩后、提交前:
![](../../static/img/PR/imagePR14.png)<br/>
![压缩后_提交前](/img/PR/imagePR14.png)
提交后:
![](../../static/img/PR/imagePR15.png)<br/>
![提交后](/img/PR/imagePR15.png)
**总结**:在合并前,先对开发分支上的琐碎提交进行压缩,可以使`master`分支上的提交信息更简洁,但是要注意,这种合并模式本质上是`master`分支一次性保存`dev`上的变更,并创建新的提交记录这些变更,所以提交者发生了变化!

View File

@ -3,15 +3,4 @@ sidebar_label: '合并请求关联疑修'
sidebar_position: 5
---
# 合并请求关联疑修
#(开发中预告)
📌 **当前状态**该功能预计于202X年发布正在[GitLink Engine X.X](https://roadmap.gitlink.org)进行集成测试。
🔗 **进度追踪**:关注疑修 [#462347](https://issues.gitlink.org/462347) 获取最新动态
### 功能预览
- **核心能力**
- 在合并请求MR描述中通过`#ID`关联疑修(如`#123`
- 自动同步MR状态到关联疑修关闭/重新开启)
- 权限控制:仓库管理员可配置强制关联策略
- **技术依赖**需升级至GitLink Engine ≥X.X
# 合并请求关联疑修

View File

@ -15,5 +15,4 @@ GitLink中的 **合并请求(PR)** 模块提供合并请求创建和管理两方
如下图所示为合并请求(PR)管理模块:
![合并请求管理模块](../../static/img/PR/imagePR1.png)<br/>
![合并请求管理模块](/img/PR/imagePR1.png)

View File

@ -1,75 +1,4 @@
---
sidebar_label: '平台公告'
sidebar_position: 1
---
GitLink 平台公告
发布日期2024年X月X日
公告类型:版本更新与维护通知
影响范围所有GitLink用户
📢 最新动态
1. 版本升级至 vX.X.X
更新概要:
DevOps引擎增强支持自定义流水线模板新增10种预置任务节点含SonarQube代码扫描、Kubernetes部署
安全升级修复CVE-2024-1234漏洞强制启用双因素认证2FA选项。
性能优化仓库克隆速度提升40%,大型文件(>1GB传输稳定性增强。
升级指南:
服务端升级命令:
gitlinkctl upgrade --version 2.3.0
客户端兼容性需更新至vX.X.X及以上版本下载地址
🛠️ 维护计划
1. 系统维护窗口
时间202X年X月X日 02:00 - 05:00 (UTC+8)
影响:
期间代码推送、流水线触发功能暂停(仓库只读访问正常)。
建议用户提前完成关键操作。
2. 数据迁移通知
对象使用旧版存储引擎vX.X的用户
截止日期202X年X月X日
操作步骤:
进入「控制台 -> 存储管理」发起迁移任务。
验证数据完整性支持SHA-256校验
删除旧存储卷释放资源。
⚠️ 重要提示
1. 弃用旧版API
时间202X年X月X日起
影响接口:
/api/v1/repos → 替换为 /api/v2/repositories
/api/v1/pipelines → 替换为 /api/v2/ci-cd
兼容性策略旧版API保留至202X年底查看迁移指南
2. 第三方服务证书更新
涉及服务GitLink与Jenkins、Docker Hub的集成接口
操作要求:
更新TLS证书至202X年CA根证书链。
测试流水线中第三方服务调用。
🆕 新功能速递
1. 智能代码评审助手
功能亮点:
AI自动分析代码风格违规PEP8/ESLint规则
支持自定义评审规则模板。
使用路径:仓库设置 -> 代码评审 -> 启用AI助手
2. 资源配额可视化
监控指标:
实时显示仓库存储用量、流水线执行时长配额。
预警阈值设置(邮件/钉钉通知)。
访问路径:控制台 -> 资源监控
📞 支持与反馈
文档中心:访问帮助中心获取最新指南。
社区支持:
论坛提问GitLink开发者社区
紧急工单:登录后提交「在线支持」工单(响应时间<1小时
漏洞报告security@gitlink.org遵循漏洞披露政策
GitLink 团队
持续为开发者提供高效、安全的协作体验 🌟
本公告最终解释权归GitLink开源社区所有
---

View File

@ -9,19 +9,16 @@ sidebar_position: 2
平台提供了“新建”按钮,用户可以通过点击快速从零开始创建新的公开或者私有项目。
![创建首页](../../static/img/quickstart/create_homepage.png)<br/>
![创建首页](/img/quickstart/create_homepage.png)
## 2. 填写项目信息
填写项目基本信息。
![](/img/quickstart/create_info.png)
![](../../static/img/quickstart/create_info.png)<br/>
## 3. 创建成功
点击创建项目,创建成功后进入项目主页。
![](../../static/img/quickstart/create_success.png)<br/>
![](/img/quickstart/create_success.png)

View File

@ -9,22 +9,19 @@ sidebar_position: 5
在首页选择**导入项目**
![](../../static/img/quickstart/create_homepage.png)<br/>
![](/img/quickstart/import_homepage.png)
## 2. 填写信息
填写需要导入的第三方Git项目地址和项目信息如果导入项目为私有仓库则需输入目标平台用户token进行授权。
![](/img/quickstart/import_info.png)
![](../../static/img/quickstart/import_info.png)<br/>
## 3. 授权验证
在使用GitLink平台导入其他平台如GitHub、Gitee的开源项目时如果项目为私有则无法通过正常途径导入需要输入对应平台有权限的token值进行校验。
![](../../static/img/quickstart/import_verify.png)<br/>
![](/img/quickstart/import_verify.png)
下面将列举一些典型开源平台的token获取方式。
@ -35,7 +32,6 @@ sidebar_position: 5
2. 访问用户头像下的settings菜单
![img](https://forum.gitlink.org.cn/api/attachments/422328)
3. 访问最下方的Developer settings
@ -89,10 +85,8 @@ sidebar_position: 5
提示正在从第三方Git项目地址迁移
![](../../static/img/quickstart/import_wait.png)<br/>
![](/img/quickstart/import_wait.png)
迁移成功则导入项目成功
![](../../static/img/quickstart/import_success.png)<br/>
![](/img/quickstart/import_success.png)

View File

@ -5,21 +5,18 @@ sidebar_position: 3
# 提交第一行代码
## 1. 编辑代码
# 1. 编辑代码
点击编辑按钮,开始编辑代码。
![](/img/quickstart/first_edit.png)
![](../../static/img/quickstart/first_edit.png)<br/>
## 2. 提交代码
# 2. 提交代码
在编辑框中编写代码,编写完成后填写变更信息后提交变更。
![](../../static/img/quickstart/first_commit.png)<br/>
![](/img/quickstart/first_commit.png)
## 3. 代码更新成功
提交成功后代码更新成功。
![](../../static/img/quickstart/first_success.png)<br/>
提交成功后代码代码更新成功。![](/img/quickstart/first_success.png)

View File

@ -0,0 +1,44 @@
---
sidebar_label: '搜索开源项目'
sidebar_position: 4
---
# 搜索开源项目
## 1. 开源项目页面介绍
项目”模块汇聚和管理了所有 GitLink 平台上的托管项目和镜像项目,用户可以输入项目名称关键字进行搜索,也可以根据项目类别对项目进行筛选。
进入“项目”模块,左侧列出了项目类型和项目类别。其中,项目类型主要包括开源托管项目和开源镜像项目两类。项目类别主要包括:云计算、大数据、区块链、物联网、机器学习、人工智能、智慧医疗、其他。
![](/img/quickstart/search_homepage.png)
右侧展示了所有项目的基本信息包括创建者、项目名、项目简介、浏览量、项目类别、更新时间、点赞数量、Fork 数量等信息用户可以通过关键字搜索查找特定的项目也可以按照更新时间、创建时间、Fork 数量、点赞数量等对项目进行排序。
![](/img/quickstart/search_list.png)
用户点击项目名称,即可进入到项目详情,查看和参与开源项目开发。
## 2. 搜索开源项目
有两处搜索框可以搜索
### 开源项目搜索框
搜索项目:
![](/img/quickstart/search_method1.png)
搜索结果:
![](/img/quickstart/search_result1.png)
### 菜单栏搜索框
搜索项目:
![](/img/quickstart/search_method2.png)
搜索结果:
![](/img/quickstart/search_result2.png)

View File

@ -18,9 +18,7 @@ GitLink默认疑修共有缺陷、功能、疑问、支持、任务、协助、
- **文档:** 表示文档材料补充;
- **测试:** 表示需要测试的需求;
- **重复:** 表示已存在类似的疑修。
![](/img/Issue/imageIssue14.png)
![](../../static/img/Issue/imageIssue14.png)<br/>
另外,**项目成员**可以根据需求或习惯,进行标记含义或颜色标志的修改、新建标记和删除标记操作。
![](../../static/img/Issue/imageIssue15.png)<br/>
![](/img/Issue/imageIssue15.png)

View File

@ -6,8 +6,8 @@ sidebar_position: 4
对于项目开发过程中创建的所有疑修,可以在**疑修(Issue)** 界面统一查看,如下图所示为[确实开源](https://www.gitlink.org.cn/Gitlink/forgeplus)项目下的疑修列表。
![](/img/Issue/imageIssue5.png)
![](../../static/img/Issue/imageIssue5.png)<br/>
+ **创建疑修**:在疑修列表界面下,点击“**创建疑修**”按钮,同样可以创建疑修,具体见 ***疑修创建*** 一节;
+ **筛选疑修**:疑修列表支持不同条件筛选,包括发布人、标记(见 ***标记管理*** 一节)、里程碑(见 ***里程碑管理*** 一节),负责人、状态和开始/结束日期等;同时支持关键字搜索,以及按多种排序规则对疑修进行排序。

View File

@ -6,19 +6,16 @@ sidebar_position: 2
1. 进入需要发布疑修的项目的“**代码库**”界面,点击上方的“**+疑修**”按钮即可进入疑修发布界面,如下图所示:
![](../../static/img/Issue/imageIssue2.png)<br/>
![](/img/Issue/imageIssue2.png)
2. 开始创建疑修,包括疑修标题、内容,输入疑修内容时既可以采用简单灵活的[Markdown语法](https://markdown.com.cn/),同时可以点击上方的功能按钮;然后上传需要的附件内容;最后点击“**创建**”按钮提交你的第一个疑修🎉🎉🎉
![](/img/Issue/imageIssue3.png)
![](../../static/img/Issue/imageIssue3.png)<br/>
3. 此外,在创建疑修时,可以通过符号 **`#`** 快速添加需要引用的疑修,进而为当前疑修提供辅助的信息;如下图所示,键入 **`#`** 后会弹出可引用的疑修列表,通过鼠标下滑或者键盘输入疑修编号选择需要引用的疑修后,会自动添加引用疑修的链接🔗
![](/img/Issue/imageIssue6.png)
![](../../static/img/Issue/imageIssue6.png)<br/>
![](/img/Issue/imageIssue7.png)
![](../../static/img/Issue/imageIssue7.png)<br/>

View File

@ -6,8 +6,7 @@ sidebar_position: 3
**疑修**本质上是开发任务,而开发任务随着开发活动的进行,其状态也会发生改变,而“**状态**”便是用于跟踪记录开发活动的变更。如图所示GitLink中疑修的**状态**包括“新增”、“正在解决”、“已解决”、“关闭”和“拒绝“五类,用于表示开发任务的处理进度。
![](../../static/img/Issue/imageIssue4.png)<br/>
![](/img/Issue/imageIssue4.png)
+ **新增**:新创建的疑修默认状态为“新增”;

View File

@ -6,8 +6,7 @@ sidebar_position: 1
**疑修Issue** 管理模块主要为项目组成员提供**开发任务**发布、指派、跟踪等功能服务。
![](../../static/img/Issue/imageIssue1.png)<br/>
![](/img/Issue/imageIssue1.png)
**说明事项**

View File

@ -6,16 +6,13 @@ sidebar_position: 5
# 评论及操作记录
### 评论
每个疑修都相当于一个可以进度追踪的帖子,因此支持评论和回复,不仅仅是项目成员,所有人都可以在某个疑修下进行评论和回复,发表疑问或是见解,进行交流。
![](../../static/img/Issue/imageIssue11.png)<br/>
![](/img/Issue/imageIssue11.png)
### 疑修声明
用户可以对任意疑修发布“疑修声明”,留言自己对于该疑修的解决思路。点击疑修详情右侧的“声明”后,可以编辑留言,编辑完成后点击“确认”即可发布声明,如下图所示:
![](/img/Issue/imageIssue12.png)
![](../../static/img/Issue/imageIssue12.png)<br/>
### 操作记录
所有人都可以创建疑修,但是要注意,非项目成员仅可以修改自己创建的疑修,而项目成员有权限修改所有的疑修。
对于某个疑修的所有编辑操作,包括**创建疑修、添加负责人、移除负责人、更改状态、更改优先级、添加标记、移除标记、添加里程碑、移除里程碑、设置关联分支、移除关联分支、设置开始日期和设置结束日期**,均被记录在操作记录中。
![](../../static/img/Issue/imageIssue13.png)<br/>
![](/img/Issue/imageIssue13.png)

View File

@ -12,19 +12,16 @@ sidebar_position: 7
项目成员可以基于以下步骤创建里程碑:
1. 进入目标项目的 **“里程碑”** 界面,此时界面所示为已创建的里程碑的列表,所有已创建里程碑分为 **“已关闭”** 和 **“开启中”** 两类;
2. 点击上方的 **“+创建里程碑”** 按钮即可进入里程碑创建界面;
![](../../static/img/Issue/imageIssue16.png)<br/>
![](/img/Issue/imageIssue16.png)
3. 填写标题(必填)、描述(必填)、截止日期(选填)后,点击右下角的 **“创建里程碑”** 即可以完成一个新的里程碑的创建。
![](/img/Issue/imageIssue17.png)
![](../../static/img/Issue/imageIssue17.png)<br/>
### 关联里程碑
项目成员可以将疑修关联到里程碑,从而使里程碑包含明确的疑修列表,主要步骤如下:
1. 在疑修列表中点击目标疑修;
2. 编辑“里程碑”属性,选择需要关联的里程碑。
![](../../static/img/Issue/imageIssue18.png)<br/>
![](/img/Issue/imageIssue18.png)
### 其他操作
- **开启里程碑**
@ -33,8 +30,5 @@ sidebar_position: 7
- **删除里程碑**
上述操作均可以在里程碑列表中,对目标里程碑进行处理实现,如下图所示:
![](../../static/img/Issue/imageIssue19.png)<br/>
![](../../static/img/Issue/imageIssue20.png)<br/>
![](/img/Issue/imageIssue19.png)
![](/img/Issue/imageIssue20.png)

View File

@ -3,9 +3,6 @@ sidebar_label: 'WebIDE'
sidebar_position: 9
---
import VideoDemo from '../../src/components/VideoDemo';
## WebIDE背景
传统的代码托管平台提供了代码仓库的 Git/SVN 的管理可以在平台上做代码浏览、代码评审、缺陷管理、CI 流水线等和代码相关的活动。其中代码浏览、代码评审所用的编辑器组件一般为 CodeMirror代码高亮使用 highlight.js常常只提供了读代码的场景。蚂蚁研发效能部门云研发团队通过自研的 OpenSumi 框架及基于 OpenSumi 框架做的专门针对于 Web IDE无远程容器场景的极速版 Web IDE 框架与内部代码托管平台碰撞出了创新型的、只依赖浏览器的、IDE 风格的代码阅读、代码编写、代码提交、代码运行、代码评审等场景,极大的提高了用户在代码托管平台阅读代码、代码评审、轻研发等场景的效率。本次蚂蚁研发效能云研发团队和 CCF中国计算机学会GitLink 代码托管平台合作,将内部极速版 Web IDE 应用到了 Gitlink 代码托管平台上,解决了长久以来的用户反馈的很多体验问题。
@ -32,14 +29,12 @@ import VideoDemo from '../../src/components/VideoDemo';
## 代码阅读
在代码托管平台上进行代码阅读时经常需要查看当前方法在哪里被引用、当前接口在哪里被实现,极速版 Web IDE 提供编辑器 + 插件的能力,解决了上述用户需求:
![](../../static/img/di_san_fang/WebIDE/代码引用.png)<br/>
![](/img/di_san_fang/WebIDE/代码引用.png)
<center>代码引用查看</center>
Gitlink 通过实现 Blame 插件,完成了编辑器 Blame 查看的能力:
![](../../static/img/di_san_fang/WebIDE/当前代码.png)<br/>
![](/img/di_san_fang/WebIDE/当前代码.png)
<center>当前代码行作者、修改日期查看</center>
@ -49,50 +44,24 @@ Gitlink 通过实现 Blame 插件,完成了编辑器 Blame 查看的能力:
- 1.语言服务缺失,阅读效率低:缺少代码高亮、提示、跳转、查看引用及大纲功能
- 2.大 PR 浏览体验不佳:统计显示 Gitlink PR 平均有 14-17 个变更文件,传统代码评审交互一般为代码 Diff 组件流式展示,对于一些变更文件多、文件内部较大的场景 Review 体验不佳,常常要等待很久。
- 3.代码修改流程重,耗时久:代码 Diff 组件只有读能力,无法快速修改一些拼写或 lint 错误,需要在本地找到对应文件后修改提交 针对于上述需求,蚂蚁云研发团队和 Gitlink 打造了 IDE 风格的代码评审场景:
![](/img/di_san_fang/WebIDE/IDE模式的代码评审.png)
![](../../static/img/di_san_fang/WebIDE/IDE模式的代码评审.png)<br/>
<center>IDE模式的代码评审</center>
- 1.变更树 a. 提供平铺和树状两种浏览方式 b. 变更树使用 OpenSumi Recycle 组件,对于大 PR 也能通过虚拟滚动高性能的查看变更文件
- 2.工具栏 a. 提供 IDE 编辑器基础设置,如字体大小、编码、忽略收尾空格等 b. 快速切换当前分支历史版本与基线的对比 c. 变更文件快速定位、设置已查看,并支持快捷键快速执行
- 3.编辑器 a. 通过 monaco fold 能力完成非变更内容的折叠 b. 自定义评论组件嵌入编辑器
- 4.插件 a. 复用代码浏览 Blame 插件能力进行代码行 Git 信息查看 除了上述能力Gitlink 还支持了在代码评审时快速修改代码:
![](../../static/img/di_san_fang/WebIDE/代码评审.png)<br/>
![](/img/di_san_fang/WebIDE/代码评审.png)
<center>代码评审时可修改代码</center>
## WebIDE 功能演示
下面是 GitLink WebIDE 的功能演示视频,通过观看视频,您可以直观地了解如何使用 WebIDE 进行代码浏览、编辑和提交等操作。
<VideoDemo
title="GitLink WebIDE 使用教程"
platform="local"
videoId="/mp4/example.mp4"
options={{
showTips: false
}}
/>
### 在线运行演示
<VideoDemo
title="WebIDE 在线运行演示"
platform="bilibili"
videoId="BV15a411o72i"
options={{ showTips: true }}
/>
## Gitlink Web IDE
Gitlink 代码阅读场景虽然接入极速版 IDE 编辑器但文件树、代码搜索、快捷键、IDE 皮肤、等均和平时开发时使用习惯的 IDE 差异较大,更有大部分用户仅仅是为了代码阅读将代码克隆到本地,尽管保证了一致的体验,但整个链路繁琐费时。
基于这个洞察,蚂蚁云研发团队和 Gitlink 推出 Gitlink Web IDE可以一键快速打开 Web IDE 访问阅读项目仓库代码,实现项目与 IDE 的无缝衔接,保持研发同学的日常偏好习惯,同时完美兼容 Gitlink 代码托管平台。更重要的是,通过无容器在浏览器上直接运行一个极速版 IDE确保「秒开」的即时体验。
#### **1. 快速体验**
从 Gitlink 仓库首页 Web IDE 入口即可体验
![](../../static/img/di_san_fang/WebIDE/WebIDE入口.png)<br/>
![](/img/di_san_fang/WebIDE/WebIDE入口.png)
<center>Gitlink WebIDE 入口</center>
#### **2. 代码浏览体验**
@ -100,64 +69,54 @@ Gitlink 代码阅读场景虽然接入极速版 IDE 编辑器,但文件树、
#### **3. 语言功能**
- 1.支持近 40 种语言的语法高亮
- 2.支持 JavaScript/TypeScript、HTML、CSS、JSON、Markdown 的基于 LSP (Language Server Protocol) 语言特性功能,具备智能提示和大纲信息以及单文件内跳转。
![](../../static/img/di_san_fang/WebIDE/JS语言服务提示.png)<br/>
![](/img/di_san_fang/WebIDE/JS语言服务提示.png)
<center>JS语言服务提示</center>
- 3.提供了 Java、Go、Python、C++、Php 的在线语言服务能力,支持简单的定义跳转、查找引用等功能,让大家更加方便的阅读代码
![](../../static/img/di_san_fang/WebIDE/python查看引用.png)<br/>
![](/img/di_san_fang/WebIDE/python查看引用.png)
<center>Python 查看引用</center>
#### **4. 分支新建与切换**
点击左下角分支名即可新建/切换分支。
![](../../static/img/di_san_fang/WebIDE/分支新建.png)<br/>
![](/img/di_san_fang/WebIDE/分支新建.png)
<center>分支新建与切换</center>
#### **5. 文件搜索**
使用 CMD/Ctrl + P 唤起文件搜索面板
![](../../static/img/di_san_fang/WebIDE/文件搜索.png)<br/>
![](/img/di_san_fang/WebIDE/文件搜索.png)
<center>文件搜索面板</center>
#### **6. 行高亮**
持单行或多行高亮,点击行号即可高亮行,按住 Shift 可选中连续多行。
![](../../static/img/di_san_fang/WebIDE/多选行高亮.png)<br/>
![](/img/di_san_fang/WebIDE/多选行高亮.png)
<center>多选行高亮</center>
#### **7. Blame**
支持查看单行 blame 信息hover 后可展示详细信息。
![](../../static/img/di_san_fang/WebIDE/Blame详细信息.png)<br/>
![](/img/di_san_fang/WebIDE/Blame详细信息.png)
<center>Blame详细信息</center>
#### **8. Graph**
支持 graph 视图,可查看分支 commits 历史以及每个 commit 详细文件变更,并支持文件 diff 查看。底部状态栏左下角点击 Git Graph 或在命令面板输入 View Git Graph即可打开 Git Graph 视图。
![](../../static/img/di_san_fang/WebIDE/Graph.png)<br/>
![](/img/di_san_fang/WebIDE/Graph.png)
<center>Graph 详细信息</center>
#### **9.WebSCM**
对于开发来说日常多个需求并行开发是非常常见的事,经常修改一些很小但必要的逻辑,而也许你本地环境已经在开发下一个需求,频繁的分支切换并行修改又容易出错。通过 Gitlink Web IDE 极速切换分支修改提交一气呵成,无需打断本地开发流程。
![](../../static/img/di_san_fang/WebIDE/WebSCM.png)<br/>
![](/img/di_san_fang/WebIDE/WebSCM.png)
<center>WebSCM</center>
#### **10.代码在线运行**
目前如果在没有容器的情况下大部分应用只能运行前端代码。Gitlink Web IDE 集成了基于 skypack 的更加轻量的 CodeSwing 插件,可以在极速版去运行前端代码,并且代码版本是使用 Gitlink 来管理。结合上述 WebSCM 能力,甚至能在一分钟完成前端代码初始化、编写、预览和代码提交。
![](../../static/img/di_san_fang/WebIDE/前端代码.png)<br/>
![](/img/di_san_fang/WebIDE/前端代码.png)
<center>前端代码运行</center>
随着 Webassembly 技术的发展,一些后端语言也可以运行在浏览器里,在 2021 年 Google IO 大会上StackBlitz 展示了他们最近做的技术WebContainer该能力可以将语言运行时编译为 Webassembly 从而运行在浏览器上。Code-Runner-For-Web 插件结合 Pyodide已经将 Python 的运行搬到了浏览器上,新版极速版也默认集成了该插件。
![](../../static/img/di_san_fang/WebIDE/Python代码运行.png)<br/>
![](/img/di_san_fang/WebIDE/Python代码运行.png)
<center>Python代码运行</center>

View File

@ -6,27 +6,26 @@ sidebar_position: 2
*https://www.gitlink.org.cn* 页面点击顶部导航栏的“+”符号可以进行组织新建操作。
![](../../static/img/Org/imageOrg1.png)<br/>
![](/img/Org/imageOrg1.png)
在新建页面中输入**组织账号**、**组织名称**、**组织描述**、**所在地区**、**可见性**以及**组织头像**等信息后,点击“**创建组织**”按钮完成组织的创建。
![](/img/Org/imageOrg2.png)
![](../../static/img/Org/imageOrg2.png)<br/>
## 组织账号
![](/img/Org/imageOrg4.png)
![](../../static/img/Org/imageOrg4.png)<br/>
**注**只能使用以字母、数字开头包含字母、数字、下划线、横杠等长度4到20个字符
## 组织名称与组织描述
![](../../static/img/Org/imageOrg5.png)<br/>
![](/img/Org/imageOrg5.png)
**注**:此处为必填项,不得为空
## 可见性
![](../../static/img/Org/imageOrg3.png)<br/>
![](/img/Org/imageOrg3.png)
**注**:可见性预设三类组织:公开、受限(仅对登录用户可见)、私有(仅对组织成员可见)。

View File

@ -9,26 +9,26 @@ sidebar_position: 3
在团队新建页面,输入团队标识、团队名称、团队描述、项目权限以及版本库权限等信息后,点击“新建团队”完成团队的创建。
![](/img/Org/imageOrg9.png)
![](../../static/img/Org/imageOrg9.png)<br/>
## 查看组织团队
点击组织信息页面中的某个团队名称可以查看该团队的详细信息,该页面包括团队的名称、描述等信息,此外还会列出该团队关联的成员以及项目。
![](/img/Org/imageOrg8.png)
![](../../static/img/Org/imageOrg8.png)<br/>
## 管理组织团队
点击团队信息页面中的“团队设置”按钮可以对团队进行管理
- 基本设置:修改项目的基本信息,如名称和描述等。
![](/img/Org/imageOrg10.png)
![](../../static/img/Org/imageOrg10.png)<br/>
- 团队成员管理:为该团队添加新成员或者移除已有成员。
![](/img/Org/imageOrg11.png)
![](../../static/img/Org/imageOrg11.png)<br/>
- 团队项目管理:为该团队关联新项目(该组织已经创建的项目)或者移除已关联项目。
![](../../static/img/Org/imageOrg12.png)<br/>
![](/img/Org/imageOrg12.png)

View File

@ -6,17 +6,16 @@ sidebar_position: 4
在 个人所管理的项目当中的**仓库设置**当中的**成员管理**可以进入成员管理界面
![](/img/Org/imageOrg14.png)
![](../../static/img/Org/imageOrg13.png)<br/>
## 成员查询和添加
在成员管理界面当中,可以进行组织成员的查询和添加
![](/img/Org/imageOrg14.png)
![](../../static/img/Org/imageOrg14.png)<br/>
## 成员邀请权限设置
管理员可以对邀请成员的权限进行设置
![](../../static/img/Org/imageOrg15.png)<br/>
![](/img/Org/imageOrg15.png)
此外,也可以复制邀请链接的方式来更方便地邀请成员加入到项目当中来
**注**:此项功能仅对管理员可见

View File

@ -3,14 +3,14 @@ sidebar_label: '组织简介'
sidebar_position: 1
---
## 组织简介
# 组织简介
组织是共享帐户,其中业务和开源项目可同时跨多个项目进行协作,具有复杂的安全性和管理功能。多个个人帐户可以通过加入同一组织帐户来协作处理共享项目。
您的团队可以通过使用组织帐户在 GitLink 上进行协作,组织帐户充当共享工作的容器,并为工作赋予独特的名称和品牌。同时,平台支持组织在“组织详情”页面发布新闻动态,显示项目概览和仓库详情等内容
![](/img/Org/imageOrg6.png)
![](../../static/img/Org/imageOrg6.png)<br/>
## 作为组织拥有者
有效管理组织,是您的使命。
@ -19,8 +19,8 @@ sidebar_position: 1
为了简化访问管理并增强协作,您可以创建能体现组结构的嵌套团队。您可以根据他们的角色或项目将人员分组,并分配任务。
![](/img/Org/imageOrg7.png)
![](../../static/img/Org/imageOrg7.png)<br/>
平台同时支持组织拥有者管理对数据访问的自定义设置。
## 作为组织成员

View File

@ -6,6 +6,7 @@ sidebar_position: 5
点击组织信息页面中的“新建项目”按钮可以创建属于该组织的托管项目或者镜像项目。
![](/img/Org/imageOrg13.png)
![](../../static/img/Org/imageOrg13.png)<br/>
**注**:在“拥有者”一栏的下拉选项中,可以选择:个人、组织、团队

View File

@ -8,8 +8,7 @@ sidebar_position: 2
## 模板的导入及导出管理
#### 1.模板导入
通过点击wiki界面的**导入模板**按钮即可导入本地的txtmarkdown等格式文件进行Wiki文档的创建当前平台此项功能尚在开发测试环节
![](../../static/img/wiki/img4.png)<br/>
[](/img/wiki/img4.png)
#### 2.模板导出
当前平台此项功能尚在开发测试环节
<br/>

View File

@ -9,17 +9,15 @@ sidebar_position: 1
## 维基界面管理
#### 1.维基界面
GitLink项目安排了专门的**维基(Wiki)界面**来展示项目的一些情况
[](/img/wiki/img1.png)
![](../../static/img/wiki/img1.png)<br/>
#### 2.创建维基内容
在初始化的维基界面当中点击**创建Wiki文档**或者**导入模板**即可进行Wiki文档的编辑
<br/>
#### 3.进行Wiki文档的编辑
点击**创建Wiki文档**后即跳转到编辑界面,初始内容为空白的文档
![](../../static/img/wiki/img3.png)<br/>
[](/img/wiki/img3.png)
也可以通过勾选*添加模板*来进行模板的导入,平台提供的模板包括*周报*和*月报*的格式
![](../../static/img/wiki/img2.png)<br/>
[](/img/wiki/img2.png)
完成编辑后点击左下角的的保存即可

View File

@ -1,69 +0,0 @@
---
sidebar_label: "视频介绍"
label: "视频介绍"
sidebar_position: 0.5
---
# GitLink 视频教程
在本页面,您可以找到各种 GitLink 功能的视频教程演示。这些视频将帮助您更直观地了解 GitLink 的使用方法。
import VideoDemo from '../src/components/VideoDemo';
## 快速入门
<VideoDemo
title="GitLink 平台介绍"
description="快速了解 GitLink 平台的主要功能和使用场景"
platform="bilibili"
videoId="BV1Gx411w7vd"
options={{ showTips: true }}
/>
## 代码库管理
<VideoDemo
title="如何创建和管理代码仓库"
description="学习创建代码仓库、管理分支、设置权限等基本操作"
platform="bilibili"
videoId="BV1Gx411w7vd"
options={{ showTips: true }}
/>
## WebIDE 功能
<VideoDemo
title="WebIDE 使用指南"
description="学习如何使用 GitLink 的 WebIDE 进行在线编码和调试"
platform="bilibili"
videoId="BV1Gx411w7vd"
options={{ showTips: true, tips: "WebIDE 支持多种编程语言和开发环境" }}
/>
## DevOps 引擎
<VideoDemo
title="DevOps 引擎配置与使用"
description="了解如何配置和使用 GitLink 的 DevOps 引擎进行持续集成和部署"
platform="bilibili"
videoId="BV1Gx411w7vd"
options={{ showTips: true }}
/>
## 团队协作
<VideoDemo
title="团队协作最佳实践"
description="学习在 GitLink 上进行团队协作的最佳实践和工作流程"
platform="bilibili"
videoId="BV1Gx411w7vd"
options={{ showTips: true }}
/>
:::tip 提示
视频中使用的是最新版 GitLink 界面,如果您使用的版本界面略有不同,功能和操作方式基本一致。
:::
:::info 问题反馈
如果您对视频内容有任何疑问,或者希望我们提供更多特定主题的视频教程,请通过 [GitLink 社区](https://www.gitlink.org.cn) 或邮箱 gitlink@ccf.org.cn 联系我们。
:::

View File

@ -17,15 +17,13 @@ GitLink将通知分为“系统通知”和“@我”的两种类型:
| 我管理的仓库 | 有新的疑修;有新的合并请求;有成员变动;仓库设置被更改;|
* “@我”的通知目前支持在用户首页、课程首页、项目首页的动态列表中使用@功能对用户进行通知:
例,在项目首页提交疑修时,输入@后可以通过下拉列表选择@其他用户。
![](../../static/img/notice/@notice.png)<br/>
![](/img/notice/@notice.png)
#### 2.查看通知
登录后在平台右上角个人头像旁即可查看收到的通知数量;移动光标至通知按钮出现下拉列表可以分别查看“系统通知”和“@我”的通知;下拉列表右下角可以对所有消息进行一键已读;点击通知即可跳转至通知详情界面。
![](../../static/img/notice/home_notice2.png)<br/>
![](/img/notice/home_notice2.png)
<br/>
点击通知按钮可以进入消息通知界面,“我的通知”界面可以进行“进查看未读消息”和“所有消息一键已读”的选择。
![](../../static/img/notice/my_notice2.png)<br/>
![](/img/notice/my_notice2.png)

View File

@ -10,12 +10,13 @@ sidebar_position: 2
#### 1.进入通知设置界面
通过点击首页的通知按钮进入通知设置界面;
![](../../static/img/notice/home_notice.png)<br/>
<!--![](/img/notice/home_notice.png)-->
或在头像下拉列表中选择设置可以进入消息通知设置界面;
![](../../static/img/notice/into_notice.png)<br/>
<!--![](/img/notice/into_notice.png)-->
#### 2.进行通知设置
通过“通知管理”可以对接受通知的方式进行设置,默认所有通知都是通过站内信的方式接受,可以通过勾选为重要的通知类型增加邮件接受方式。
![](../../static/img/notice/notice_set.png)<br/>
<!--![](/img/notice/notice_set.png)-->

View File

@ -8,25 +8,15 @@ module.exports = {
tagline:'gitlink帮助中心',
url: 'https://help.gitlink.org.cn/',
baseUrl: '/',
onBrokenLinks: 'warn',
onBrokenMarkdownLinks: 'warn',
onBrokenLinks: 'ignore',
onBrokenMarkdownLinks: 'ignore',
favicon: 'img/icon.ico',
organizationName: 'luffyZh', // Usually your GitHub org/user name.
projectName: 'docusaurus-luffyzh-website', // Usually your repo name.
scripts: [],
// stylesheets: ['styles/dark-mode.css'],
plugins: [
function (context, options) {
return {
name: 'custom-docusaurus-plugin',
injectHtmlTags() {
return {};
},
};
},
],
themeConfig: {
docs:{
sidebar:{
hideable:true,
@ -69,7 +59,7 @@ module.exports = {
// srcDark: 'img/logo-dark.png',
},
items: [
{
{
type: 'doc',
docId: 'intro',
position: 'left',
@ -85,26 +75,6 @@ module.exports = {
// position: 'right',
// className: 'header-github-link',
// },
{
type: 'custom-table-of-contents',
position: 'right'
},
{
type: 'custom-pdf-export',
position: 'right'
},
{
type: 'custom-back-to-top',
position: 'right'
},
{
type: 'custom-back-to-bottom',
position: 'right'
},
{
type: 'custom-qa-button',
position: 'right'
}
],
},
footer: {
@ -201,7 +171,7 @@ module.exports = {
hashed: true,
language: ["en", "zh"],
highlightSearchTermsOnTargetPage: true,
blogRouteBasePath: "/",
blogRouteBasePath: "/",
explicitSearchResultPath: true,
// For Docs using Chinese, The `language` is recommended to set to:
// ```

381
package-lock.json generated
View File

@ -18,10 +18,12 @@
"clsx": "1.2.1",
"docusaurus-gtm-plugin": "0.0.2",
"docusaurus-plugin-image-zoom": "1.0.1",
"html2pdf.js": "^0.10.3",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-modal": "3.16.1"
},
"engines": {
"node": ">=14.18.1 <=18.x"
}
},
"node_modules/@algolia/autocomplete-core": {
@ -1904,10 +1906,12 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.1.tgz",
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"license": "MIT",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"dependencies": {
"regenerator-runtime": "^0.13.11"
},
"engines": {
"node": ">=6.9.0"
}
@ -3641,13 +3645,6 @@
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"node_modules/@types/raf": {
"version": "3.4.3",
"resolved": "https://registry.npmmirror.com/@types/raf/-/raf-3.4.3.tgz",
"integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
"license": "MIT",
"optional": true
},
"node_modules/@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
@ -3735,13 +3732,6 @@
"@types/node": "*"
}
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT",
"optional": true
},
"node_modules/@types/unist": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
@ -4185,18 +4175,6 @@
"node": ">= 4.0.0"
}
},
"node_modules/atob": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"license": "(MIT OR Apache-2.0)",
"bin": {
"atob": "bin/atob.js"
},
"engines": {
"node": ">= 4.5.0"
}
},
"node_modules/autoprefixer": {
"version": "10.4.14",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
@ -4364,15 +4342,6 @@
"resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz",
"integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ=="
},
"node_modules/base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
@ -4522,18 +4491,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/btoa": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz",
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
"license": "(MIT OR Apache-2.0)",
"bin": {
"btoa": "bin/btoa.js"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@ -4668,26 +4625,6 @@
}
]
},
"node_modules/canvg": {
"version": "3.0.11",
"resolved": "https://registry.npmmirror.com/canvg/-/canvg-3.0.11.tgz",
"integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==",
"license": "MIT",
"optional": true,
"dependencies": {
"@babel/runtime": "^7.12.5",
"@types/raf": "^3.4.0",
"core-js": "^3.8.3",
"raf": "^3.4.1",
"regenerator-runtime": "^0.13.7",
"rgbcolor": "^1.0.1",
"stackblur-canvas": "^2.0.0",
"svg-pathdata": "^6.0.3"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/ccount": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
@ -5313,15 +5250,6 @@
"postcss": "^8.0.9"
}
},
"node_modules/css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
"license": "MIT",
"dependencies": {
"utrie": "^1.0.2"
}
},
"node_modules/css-loader": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz",
@ -5865,16 +5793,6 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/dompurify": {
"version": "3.2.6",
"resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.6.tgz",
"integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optional": true,
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
}
},
"node_modules/domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@ -6015,12 +5933,6 @@
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
"node_modules/es6-promise": {
"version": "4.2.8",
"resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz",
"integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
"license": "MIT"
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@ -6383,12 +6295,6 @@
"node": ">=0.4.0"
}
},
"node_modules/fflate": {
"version": "0.8.2",
"resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz",
"integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
"license": "MIT"
},
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
@ -7237,30 +7143,6 @@
"webpack": "^5.20.0"
}
},
"node_modules/html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
"license": "MIT",
"dependencies": {
"css-line-break": "^2.1.0",
"text-segmentation": "^1.0.3"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/html2pdf.js": {
"version": "0.10.3",
"resolved": "https://registry.npmmirror.com/html2pdf.js/-/html2pdf.js-0.10.3.tgz",
"integrity": "sha512-RcB1sh8rs5NT3jgbN5zvvTmkmZrsUrxpZ/RI8TMbvuReNZAdJZG5TMfA2TBP6ZXxpXlWf9NB/ciLXVb6W2LbRQ==",
"license": "MIT",
"dependencies": {
"es6-promise": "^4.2.5",
"html2canvas": "^1.0.0",
"jspdf": "^3.0.0"
}
},
"node_modules/htmlparser2": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
@ -7952,24 +7834,6 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/jspdf": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/jspdf/-/jspdf-3.0.1.tgz",
"integrity": "sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.7",
"atob": "^2.1.2",
"btoa": "^1.2.1",
"fflate": "^0.8.1"
},
"optionalDependencies": {
"canvg": "^3.0.11",
"core-js": "^3.6.0",
"dompurify": "^3.2.4",
"html2canvas": "^1.0.0-rc.5"
}
},
"node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@ -8969,13 +8833,6 @@
"node": ">=8"
}
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"license": "MIT",
"optional": true
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -9806,16 +9663,6 @@
}
]
},
"node_modules/raf": {
"version": "3.4.1",
"resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
"license": "MIT",
"optional": true,
"dependencies": {
"performance-now": "^2.1.0"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@ -10678,16 +10525,6 @@
"node": ">=0.10.0"
}
},
"node_modules/rgbcolor": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz",
"integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
"license": "MIT OR SEE LICENSE IN FEEL-FREE.md",
"optional": true,
"engines": {
"node": ">= 0.8.15"
}
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@ -11312,16 +11149,6 @@
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility"
},
"node_modules/stackblur-canvas": {
"version": "2.7.0",
"resolved": "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
"integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.1.14"
}
},
"node_modules/state-toggle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
@ -11494,16 +11321,6 @@
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
},
"node_modules/svg-pathdata": {
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
"integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/svgo": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
@ -11702,15 +11519,6 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
"license": "MIT",
"dependencies": {
"utrie": "^1.0.2"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -12381,15 +12189,6 @@
"node": ">= 0.4.0"
}
},
"node_modules/utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
"license": "MIT",
"dependencies": {
"base64-arraybuffer": "^1.0.2"
}
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@ -14415,9 +14214,12 @@
}
},
"@babel/runtime": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.1.tgz",
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog=="
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"requires": {
"regenerator-runtime": "^0.13.11"
}
},
"@babel/runtime-corejs3": {
"version": "7.20.6",
@ -15635,12 +15437,6 @@
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"@types/raf": {
"version": "3.4.3",
"resolved": "https://registry.npmmirror.com/@types/raf/-/raf-3.4.3.tgz",
"integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
"optional": true
},
"@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
@ -15728,12 +15524,6 @@
"@types/node": "*"
}
},
"@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"optional": true
},
"@types/unist": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
@ -16109,11 +15899,6 @@
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
},
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
"autoprefixer": {
"version": "10.4.14",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
@ -16234,11 +16019,6 @@
"resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz",
"integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ=="
},
"base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
},
"batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
@ -16352,11 +16132,6 @@
"update-browserslist-db": "^1.0.10"
}
},
"btoa": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz",
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@ -16450,22 +16225,6 @@
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz",
"integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g=="
},
"canvg": {
"version": "3.0.11",
"resolved": "https://registry.npmmirror.com/canvg/-/canvg-3.0.11.tgz",
"integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==",
"optional": true,
"requires": {
"@babel/runtime": "^7.12.5",
"@types/raf": "^3.4.0",
"core-js": "^3.8.3",
"raf": "^3.4.1",
"regenerator-runtime": "^0.13.7",
"rgbcolor": "^1.0.1",
"stackblur-canvas": "^2.0.0",
"svg-pathdata": "^6.0.3"
}
},
"ccount": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
@ -16908,14 +16667,6 @@
"integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==",
"requires": {}
},
"css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
"requires": {
"utrie": "^1.0.2"
}
},
"css-loader": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz",
@ -17280,15 +17031,6 @@
"domelementtype": "^2.3.0"
}
},
"dompurify": {
"version": "3.2.6",
"resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.6.tgz",
"integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
"optional": true,
"requires": {
"@types/trusted-types": "^2.0.7"
}
},
"domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@ -17403,11 +17145,6 @@
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
"es6-promise": {
"version": "4.2.8",
"resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz",
"integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@ -17694,11 +17431,6 @@
"xml-js": "^1.6.11"
}
},
"fflate": {
"version": "0.8.2",
"resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz",
"integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="
},
"file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
@ -18322,25 +18054,6 @@
"tapable": "^2.0.0"
}
},
"html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
"requires": {
"css-line-break": "^2.1.0",
"text-segmentation": "^1.0.3"
}
},
"html2pdf.js": {
"version": "0.10.3",
"resolved": "https://registry.npmmirror.com/html2pdf.js/-/html2pdf.js-0.10.3.tgz",
"integrity": "sha512-RcB1sh8rs5NT3jgbN5zvvTmkmZrsUrxpZ/RI8TMbvuReNZAdJZG5TMfA2TBP6ZXxpXlWf9NB/ciLXVb6W2LbRQ==",
"requires": {
"es6-promise": "^4.2.5",
"html2canvas": "^1.0.0",
"jspdf": "^3.0.0"
}
},
"htmlparser2": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
@ -18812,21 +18525,6 @@
"universalify": "^2.0.0"
}
},
"jspdf": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/jspdf/-/jspdf-3.0.1.tgz",
"integrity": "sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg==",
"requires": {
"@babel/runtime": "^7.26.7",
"atob": "^2.1.2",
"btoa": "^1.2.1",
"canvg": "^3.0.11",
"core-js": "^3.6.0",
"dompurify": "^3.2.4",
"fflate": "^0.8.1",
"html2canvas": "^1.0.0-rc.5"
}
},
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@ -19551,12 +19249,6 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"optional": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -20083,15 +19775,6 @@
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
},
"raf": {
"version": "3.4.1",
"resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
"optional": true,
"requires": {
"performance-now": "^2.1.0"
}
},
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@ -20748,12 +20431,6 @@
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
"rgbcolor": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz",
"integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
"optional": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@ -21234,12 +20911,6 @@
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
},
"stackblur-canvas": {
"version": "2.7.0",
"resolved": "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
"integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
"optional": true
},
"state-toggle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
@ -21356,12 +21027,6 @@
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
},
"svg-pathdata": {
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
"integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
"optional": true
},
"svgo": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
@ -21493,14 +21158,6 @@
}
}
},
"text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
"requires": {
"utrie": "^1.0.2"
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -21943,14 +21600,6 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
},
"utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
"requires": {
"base64-arraybuffer": "^1.0.2"
}
},
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",

View File

@ -7,7 +7,7 @@
"dev": "docusaurus start --port 3000",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docsaurus deploy",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
@ -24,7 +24,6 @@
"clsx": "1.2.1",
"docusaurus-gtm-plugin": "0.0.2",
"docusaurus-plugin-image-zoom": "1.0.1",
"html2pdf.js": "^0.10.3",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-modal": "3.16.1"
@ -40,5 +39,8 @@
"last 1 firefox version",
"last 1 safari version"
]
},
"engines": {
"node": ">=14.18.1 <=18.x"
}
}

View File

@ -2,32 +2,8 @@ module.exports = {
DocsSidebar: [
{
type: 'doc',
id: 'intro',
label: '介绍',
},
{
type: 'doc',
id: '视频教程',
label: '视频教程',
},
{
type: 'category',
label: '快速开始',
collapsed: false,
items: ['快速开始/注册GitLink账号', '快速开始/登录GitLink账号'],
},
{
type: 'category',
label: '代码库管理',
collapsed: true,
items: ['代码库管理/仓库创建'],
},
{
type: 'category',
label: '第三方服务',
collapsed: true,
items: ['第三方服务/WebIDE', '第三方服务/跨平台代码同步'],
},
// 其他类别可以根据需要添加
id: 'index',
label: 'Docs',
}
],
};

View File

@ -1,39 +0,0 @@
import React from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
function BackToBottomButton() {
const handleBackToBottom = () => {
window.scrollTo({
top: document.documentElement.scrollHeight,
behavior: 'smooth'
});
};
return (
<button
onClick={handleBackToBottom}
style={{
fontSize: 14,
padding: '0 16px',
background: '#466aff',
color: '#fff',
borderRadius: 4,
height: 32,
lineHeight: '32px',
border: 'none',
cursor: 'pointer',
display: 'inline-block',
marginLeft: 12,
boxSizing: 'border-box',
}}
>
去到底部
</button>
);
}
export default function BackToBottomNavbarItem() {
return (
<BrowserOnly>{() => <BackToBottomButton />}</BrowserOnly>
);
}

View File

@ -1,36 +0,0 @@
import React from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
function BackToTopButton() {
const handleBackToTop = () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
};
return (
<button
onClick={handleBackToTop}
style={{
fontSize: 14,
padding: '0 16px',
background: '#466aff',
color: '#fff',
borderRadius: 4,
height: 32,
lineHeight: '32px',
border: 'none',
cursor: 'pointer',
display: 'inline-block',
marginLeft: 12,
boxSizing: 'border-box',
}}
>
返回顶部
</button>
);
}
export default function PdfBackToTopNavbarItem() {
return (
<BrowserOnly>{() => <BackToTopButton />}</BrowserOnly>
);
}

View File

@ -1,44 +0,0 @@
import React from 'react';
export default function PdfExportButton({ title }) {
const handleExport = async () => {
const element = document.getElementById('doc-markdown-content');
if (element) {
// 动态导入 html2pdf.js只在客户端执行
const html2pdf = (await import('html2pdf.js')).default;
html2pdf()
.set({
margin: 0.5,
filename: `${title}.pdf`,
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'a4', orientation: 'portrait' }
})
.from(element)
.save();
} else {
alert('未找到文档内容区域');
}
};
return (
<button
onClick={handleExport}
style={{
fontSize: 14,
padding: '0 16px',
background: '#466aff',
color: '#fff',
borderRadius: 4,
height: 32,
lineHeight: '32px',
border: 'none',
cursor: 'pointer',
display: 'inline-block',
marginLeft: 12,
boxSizing: 'border-box',
}}
>
导出PDF
</button>
);
}

View File

@ -1,32 +0,0 @@
import React, { useEffect } from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
import PdfExportButton from './PdfExportButton';
function PdfExportNavbarItemInner() {
useEffect(() => {
// 只在客户端执行,给文档内容区域加唯一 id
const el = document.querySelector('.markdown');
if (el && !el.id) {
el.id = 'doc-markdown-content';
}
}, []);
let title = document.title;
if (title.includes('|')) {
title = title.split('|')[0].trim();
}
return (
<div style={{ marginLeft: 12, display: 'flex', alignItems: 'center', height: '100%' }}>
<PdfExportButton title={title} />
</div>
);
}
export default function PdfExportNavbarItem() {
return (
<BrowserOnly>
{() => <PdfExportNavbarItemInner />}
</BrowserOnly>
);
}

View File

@ -1,35 +0,0 @@
import React from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
export default function QAButtonNavbarItem() {
return (
<BrowserOnly>
{() => {
const history = require('@docusaurus/router').useHistory();
return (
<div style={{ display: 'flex', alignItems: 'center', height: '100%' }}>
<button
onClick={() => history.push('/qa')}
style={{
fontSize: 14,
padding: '0 16px',
background: '#466aff',
color: '#fff',
borderRadius: 4,
height: 32,
lineHeight: '32px',
border: 'none',
cursor: 'pointer',
display: 'inline-block',
margin: '0 8px',
boxSizing: 'border-box',
}}
>
疑问解答
</button>
</div>
);
}}
</BrowserOnly>
);
}

View File

@ -1,50 +0,0 @@
import React from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
import { useLocation } from '@docusaurus/router';
import styles from './RatingStats.module.css';
function RatingStatsContent() {
const location = useLocation();
// 为了演示,这里使用一个简单的哈希函数生成伪随机数
const generatePseudoRandom = (str, min, max) => {
let hash = 0;
for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // 转换为32位整数
}
// 将哈希值转换为min和max之间的数
const normalizedHash = Math.abs(hash) / 2147483647; // 2147483647是2^31-1最大的32位有符号整数
return min + normalizedHash * (max - min);
};
// 基于当前路径生成伪随机的评分数据
const averageRating = generatePseudoRandom(location.pathname, 3.5, 5.0).toFixed(1);
const ratingCount = Math.floor(generatePseudoRandom(location.pathname, 10, 100));
// 计算星星的填充百分比
const fillPercentage = (averageRating / 5) * 100;
return (
<div className={styles.statsContainer}>
<div className={styles.ratingValue}>{averageRating}</div>
<div className={styles.starsOuter}>
<div
className={styles.starsInner}
style={{ width: `${fillPercentage}%` }}
></div>
</div>
<div className={styles.ratingCount}>{ratingCount} 人评分</div>
</div>
);
}
export default function RatingStats() {
return (
<BrowserOnly>
{() => <RatingStatsContent />}
</BrowserOnly>
);
}

View File

@ -1,43 +0,0 @@
.statsContainer {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1rem;
}
.ratingValue {
font-size: 1.5rem;
font-weight: bold;
color: var(--ifm-color-emphasis-900);
margin-right: 0.5rem;
}
.starsOuter {
display: inline-block;
position: relative;
font-size: 1.25rem;
color: var(--ifm-color-emphasis-300);
}
.starsOuter::before {
content: "★★★★★";
}
.starsInner {
position: absolute;
top: 0;
left: 0;
white-space: nowrap;
overflow: hidden;
color: #f8ce0b;
}
.starsInner::before {
content: "★★★★★";
}
.ratingCount {
font-size: 0.9rem;
color: var(--ifm-color-emphasis-600);
margin-left: 0.5rem;
}

View File

@ -1,141 +0,0 @@
import React, { useState, useEffect } from 'react';
import styles from './RatingSystem.module.css';
import BrowserOnly from '@docusaurus/BrowserOnly';
import { useLocation } from '@docusaurus/router';
function RatingSystemContent() {
const location = useLocation();
const [rating, setRating] = useState(0);
const [hover, setHover] = useState(0);
const [submitted, setSubmitted] = useState(false);
const [feedback, setFeedback] = useState('');
const [showFeedback, setShowFeedback] = useState(false);
const [alreadyRated, setAlreadyRated] = useState(false);
// 生成当前页面的唯一键
const pageKey = `rating_${location.pathname}`;
// 初始化时检查是否已经评分过
useEffect(() => {
if (typeof window !== 'undefined') {
const savedRating = localStorage.getItem(pageKey);
if (savedRating) {
setAlreadyRated(true);
setRating(parseInt(savedRating, 10));
}
}
}, [pageKey]);
const handleRatingClick = (selectedRating) => {
setRating(selectedRating);
setShowFeedback(true);
};
const handleSubmit = () => {
// 保存评分到本地存储
localStorage.setItem(pageKey, rating.toString());
// 这里只是前端交互,不进行实际的数据存储
console.log('提交的评分:', rating);
console.log('提交的反馈:', feedback);
console.log('页面路径:', location.pathname);
setSubmitted(true);
// 3秒后重置表单状态但保持已评分状态
setTimeout(() => {
setSubmitted(false);
setAlreadyRated(true);
setFeedback('');
setShowFeedback(false);
}, 3000);
};
if (submitted) {
return (
<div className={styles.ratingContainer}>
<div className={styles.thankYouMessage}>
<span role="img" aria-label="感谢">🙏</span>
</div>
</div>
);
}
if (alreadyRated) {
return (
<div className={styles.ratingContainer}>
<h3 className={styles.ratingTitle}>您已经为此页面评分</h3>
<div className={styles.starsContainer}>
{[...Array(5)].map((_, index) => {
const ratingValue = index + 1;
return (
<span
key={index}
className={`${styles.star} ${ratingValue <= rating ? styles.filled : ''}`}
>
</span>
);
})}
</div>
<button
className={styles.resetButton}
onClick={() => {
localStorage.removeItem(pageKey);
setAlreadyRated(false);
setRating(0);
}}
>
重新评分
</button>
</div>
);
}
return (
<div className={styles.ratingContainer}>
<h3 className={styles.ratingTitle}>这篇文档对您有帮助吗</h3>
<div className={styles.starsContainer}>
{[...Array(5)].map((_, index) => {
const ratingValue = index + 1;
return (
<span
key={index}
className={`${styles.star} ${ratingValue <= (hover || rating) ? styles.filled : ''}`}
onClick={() => handleRatingClick(ratingValue)}
onMouseEnter={() => setHover(ratingValue)}
onMouseLeave={() => setHover(0)}
>
</span>
);
})}
</div>
{showFeedback && (
<div className={styles.feedbackContainer}>
<textarea
className={styles.feedbackInput}
placeholder="您有什么建议可以帮助我们改进?(可选)"
value={feedback}
onChange={(e) => setFeedback(e.target.value)}
/>
<button
className={styles.submitButton}
onClick={handleSubmit}
>
提交反馈
</button>
</div>
)}
</div>
);
}
export default function RatingSystem() {
return (
<BrowserOnly>
{() => <RatingSystemContent />}
</BrowserOnly>
);
}

View File

@ -1,129 +0,0 @@
.ratingContainer {
margin: 2rem 0;
padding: 1.5rem;
border-radius: 8px;
background-color: var(--ifm-color-emphasis-100);
text-align: center;
}
.ratingTitle {
margin-top: 0;
margin-bottom: 1rem;
font-size: 1.2rem;
color: var(--ifm-color-emphasis-800);
}
.starsContainer {
display: flex;
justify-content: center;
margin-bottom: 1rem;
}
.star {
font-size: 2rem;
color: var(--ifm-color-emphasis-300);
cursor: pointer;
margin: 0 0.25rem;
transition: color 0.2s ease;
}
.star:hover {
color: #f8ce0b;
}
.star.filled {
color: #f8ce0b;
}
.feedbackContainer {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.feedbackInput {
width: 100%;
max-width: 500px;
height: 100px;
padding: 0.75rem;
margin-bottom: 1rem;
border: 1px solid var(--ifm-color-emphasis-300);
border-radius: 4px;
resize: vertical;
font-family: inherit;
background-color: var(--ifm-background-color);
color: var(--ifm-font-color-base);
}
.feedbackInput:focus {
outline: none;
border-color: var(--ifm-color-primary);
box-shadow: 0 0 0 2px rgba(var(--ifm-color-primary-rgb), 0.25);
}
.submitButton {
padding: 0.5rem 1.5rem;
background-color: var(--ifm-color-primary);
color: white;
border: none;
border-radius: 4px;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s ease;
}
.submitButton:hover {
background-color: var(--ifm-color-primary-dark);
}
.resetButton {
padding: 0.5rem 1.5rem;
background-color: transparent;
color: var(--ifm-color-primary);
border: 1px solid var(--ifm-color-primary);
border-radius: 4px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
margin-top: 0.5rem;
}
.resetButton:hover {
background-color: var(--ifm-color-primary-lightest);
}
.thankYouMessage {
font-size: 1.2rem;
color: var(--ifm-color-success);
font-weight: 500;
animation: fadeIn 0.3s ease;
}
/* 暗色模式适配 */
html[data-theme='dark'] .ratingContainer {
background-color: var(--ifm-color-emphasis-200);
}
html[data-theme='dark'] .feedbackInput {
background-color: var(--ifm-background-surface-color);
border-color: var(--ifm-color-emphasis-300);
}
@media (max-width: 768px) {
.star {
font-size: 1.75rem;
}
}

View File

@ -1,464 +0,0 @@
import React, { useState, useRef, useEffect } from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
import styles from './TableOfContentsButton.module.css';
export default function TableOfContentsButton() {
return (
<BrowserOnly>
{() => {
const [isOpen, setIsOpen] = useState(false);
const [searchQuery, setSearchQuery] = useState('');
const dropdownRef = useRef(null);
const searchInputRef = useRef(null);
const useHistory = require('@docusaurus/router').useHistory;
const history = useHistory();
// 路径前缀
const pathPrefix = '/next';
// 硬编码的目录结构基于实际docs文件夹结构
// 带有子目录支持
const directories = [
{
name: '首页',
path: `${pathPrefix}/`,
column: 1,
isMainCategory: true
},
{
name: '视频教程',
path: `${pathPrefix}/视频教程`,
column: 1,
isMainCategory: true
},
{
name: '快速开始',
path: `${pathPrefix}/快速开始`,
column: 1,
isMainCategory: true,
subItems: [
{ name: '注册GitLink账号', path: `${pathPrefix}/快速开始/注册GitLink账号` },
{ name: '创建第一个开源项目', path: `${pathPrefix}/快速开始/创建第一个开源项目` },
{ name: '提交第一行代码', path: `${pathPrefix}/快速开始/提交第一行代码` },
{ name: '导入GitHub等第三方Git项目', path: `${pathPrefix}/快速开始/导入GitHub等第三方Git项目` }
]
},
{
name: '代码库管理',
path: `${pathPrefix}/代码库管理`,
column: 1,
isMainCategory: true,
subItems: [
{ name: '仓库创建', path: `${pathPrefix}/代码库管理/仓库创建` },
{ name: '仓库设置', path: `${pathPrefix}/代码库管理/仓库设置` },
{ name: '代码提交', path: `${pathPrefix}/代码库管理/代码提交` },
{ name: '分支管理', path: `${pathPrefix}/代码库管理/分支管理` },
{ name: '文件管理', path: `${pathPrefix}/代码库管理/文件管理` },
{ name: '成员管理', path: `${pathPrefix}/代码库管理/成员管理` },
{ name: 'Webhook', path: `${pathPrefix}/代码库管理/Webhook` },
{ name: 'WebIDE', path: `${pathPrefix}/代码库管理/WebIDE` },
{ name: '标签和发行版管理', path: `${pathPrefix}/代码库管理/标签和发行版管理` }
]
},
{
name: '合并请求(PR)',
path: `${pathPrefix}/合并请求`,
column: 2,
isMainCategory: true,
subItems: [
{ name: '合并请求简介', path: `${pathPrefix}/合并请求/合并请求简介` },
{ name: '创建合并请求', path: `${pathPrefix}/合并请求/创建合并请求` },
{ name: '代码评审', path: `${pathPrefix}/合并请求/代码评审` },
{ name: '合并模式简介', path: `${pathPrefix}/合并请求/合并模式简介` },
{ name: '合并请求关联疑修', path: `${pathPrefix}/合并请求/合并请求关联疑修` }
]
},
{
name: '疑修(Issue)',
path: `${pathPrefix}/疑修`,
column: 3,
isMainCategory: true,
subItems: [
{ name: '疑修简介', path: `${pathPrefix}/疑修/疑修简介` },
{ name: '疑修创建', path: `${pathPrefix}/疑修/疑修创建` },
{ name: '疑修状态变更', path: `${pathPrefix}/疑修/疑修状态变更` },
{ name: '疑修列表', path: `${pathPrefix}/疑修/疑修列表` },
{ name: '评论及操作记录', path: `${pathPrefix}/疑修/评论及操作记录` },
{ name: '标记管理', path: `${pathPrefix}/疑修/标记管理` },
{ name: '里程碑管理', path: `${pathPrefix}/疑修/里程碑管理` }
]
},
{
name: '机器人(Bot)',
path: `${pathPrefix}/Bot市场/Bot简介`,
column: 2,
isMainCategory: true,
subItems: [
{ name: 'bot安装', path: `${pathPrefix}/Bot市场/bot安装` },
{ name: 'bot配置', path: `${pathPrefix}/Bot市场/bot配置` },
{ name: 'bot开发', path: `${pathPrefix}/Bot市场/bot开发` }
]
},
{
name: '第三方服务',
path: `${pathPrefix}/第三方服务`,
column: 2,
isMainCategory: true,
subItems: [
{ name: 'WebIDE', path: `${pathPrefix}/第三方服务/WebIDE` },
{ name: '重睛鸟代码溯源', path: `${pathPrefix}/第三方服务/重睛鸟代码溯源` },
{ name: '跨平台代码同步服务', path: `${pathPrefix}/第三方服务/跨平台代码同步` }
]
},
{
name: '组织管理',
path: `${pathPrefix}/组织管理`,
column: 2,
isMainCategory: true,
subItems: [
{ name: '组织简介', path: `${pathPrefix}/组织管理/组织简介` },
{ name: '组织创建及设置', path: `${pathPrefix}/组织管理/组织创建及设置` },
{ name: '组织团队管理', path: `${pathPrefix}/组织管理/组织团队管理` },
{ name: '组织成员管理', path: `${pathPrefix}/组织管理/组织成员管理` },
{ name: '组织项目管理', path: `${pathPrefix}/组织管理/组织项目管理` }
]
},
{
name: '维基',
path: `${pathPrefix}/维基`,
column: 2,
isMainCategory: true,
subItems: [
{ name: '维基页面管理', path: `${pathPrefix}/维基/维基页面管理` },
{ name: '模板导入及导出', path: `${pathPrefix}/维基/模板导入及导出` }
]
},
{
name: 'DevOps引擎',
path: `${pathPrefix}/DevOps引擎`,
column: 3,
isMainCategory: true,
subItems: [
{ name: '引擎简介', path: `${pathPrefix}/DevOps引擎/引擎简介` },
{ name: '代码流水线', path: `${pathPrefix}/DevOps引擎/代码流水线` },
{ name: '图形流水线', path: `${pathPrefix}/DevOps引擎/图形流水线` },
{ name: '参数配置', path: `${pathPrefix}/DevOps引擎/参数配置` },
{ name: '密钥设置', path: `${pathPrefix}/DevOps引擎/密钥设置` },
{ name: '执行记录查询', path: `${pathPrefix}/DevOps引擎/执行记录查询` }
]
},
{
name: '通知',
path: `${pathPrefix}/通知`,
column: 3,
isMainCategory: true,
subItems: [
{ name: '通知简介', path: `${pathPrefix}/通知/通知简介` },
{ name: '通知设置', path: `${pathPrefix}/通知/通知设置` }
]
},
{
name: '个人主页建站',
path: `${pathPrefix}/个人主页建站`,
column: 3,
isMainCategory: true,
subItems: [
{ name: '建站流程', path: `${pathPrefix}/个人主页建站/站点创建流程` },
{ name: '建站工具', path: `${pathPrefix}/个人主页建站/建站工具` }
]
},
{
name: '平台公告',
path: `${pathPrefix}/平台公告`,
column: 3,
isMainCategory: true
},
{
name: '服务协议',
path: `${pathPrefix}/服务协议`,
column: 3,
isMainCategory: true,
subItems: [
{ name: 'GitLink服务协议', path: `${pathPrefix}/服务协议/GitLink服务协议` }
]
}
];
// 按列分组目录
// 重新分配各目录到三列,确保各列内容均衡
const column1 = directories.filter(dir =>
dir.name === '首页' ||
dir.name === '视频教程' ||
dir.name === '快速开始' ||
dir.name === '代码库管理' ||
dir.name === '合并请求(PR)'
);
const column2 = directories.filter(dir =>
dir.name === '疑修(Issue)' ||
dir.name === '机器人(Bot)' ||
dir.name === '维基' ||
dir.name === '第三方服务' ||
dir.name === '组织管理'
);
const column3 = directories.filter(dir =>
dir.name === 'DevOps引擎' ||
dir.name === '通知' ||
dir.name === '个人主页建站' ||
dir.name === '平台公告' ||
dir.name === '服务协议'
);
// 移除列4改为三列布局
const column4 = [];
// 搜索功能
// 过滤目录项
const filterDirectories = (query) => {
if (!query) return directories;
const normalizedQuery = query.toLowerCase().trim();
return directories.filter(dir => {
// 检查主目录名称是否匹配
const dirNameMatch = dir.name.toLowerCase().includes(normalizedQuery);
// 如果主目录匹配,直接返回
if (dirNameMatch) return true;
// 检查子目录是否有匹配
if (dir.subItems && dir.subItems.length > 0) {
const hasMatchingSubItem = dir.subItems.some(
subItem => subItem.name.toLowerCase().includes(normalizedQuery)
);
return hasMatchingSubItem;
}
return false;
});
};
// 获取经过搜索过滤的目录列表
const filteredDirectories = filterDirectories(searchQuery);
// 过滤后的目录分组
const filteredColumn1 = filteredDirectories.filter(dir => column1.some(c => c.name === dir.name));
const filteredColumn2 = filteredDirectories.filter(dir => column2.some(c => c.name === dir.name));
const filteredColumn3 = filteredDirectories.filter(dir => column3.some(c => c.name === dir.name));
// 将搜索结果重新分配到各列,实现更均衡的布局
const distributeSearchResults = (results) => {
if (!searchQuery) {
// 不搜索时使用原始布局
return {
col1: filteredColumn1,
col2: filteredColumn2,
col3: filteredColumn3,
col4: []
};
}
// 搜索时根据数量动态分配
const totalCount = results.length;
if (totalCount <= 3) {
// 结果很少时,全部放在第一列
return {
col1: results,
col2: [],
col3: [],
col4: []
};
} else if (totalCount <= 6) {
// 结果较少时,放在两列
const midPoint = Math.ceil(totalCount / 2);
return {
col1: results.slice(0, midPoint),
col2: results.slice(midPoint),
col3: [],
col4: []
};
} else {
// 结果较多时,放在三列
const colSize = Math.ceil(totalCount / 3);
return {
col1: results.slice(0, colSize),
col2: results.slice(colSize, colSize * 2),
col3: results.slice(colSize * 2),
col4: []
};
}
};
// 获取重新分配后的各列内容
const {
col1: displayColumn1,
col2: displayColumn2,
col3: displayColumn3,
col4: displayColumn4
} = distributeSearchResults(filteredDirectories);
// 处理搜索框变化
const handleSearchChange = (e) => {
setSearchQuery(e.target.value);
};
// 清除搜索
const clearSearch = () => {
setSearchQuery('');
if (searchInputRef.current) {
searchInputRef.current.focus();
}
};
// 处理点击目录链接
const handleDirectoryClick = (dir) => {
// 如果有子目录,则跳转到第一个子目录
if (dir.subItems && dir.subItems.length > 0) {
history.push(dir.subItems[0].path);
} else {
history.push(dir.path);
}
setIsOpen(false);
};
// 点击外部关闭下拉菜单
useEffect(() => {
function handleClickOutside(event) {
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
setIsOpen(false);
}
}
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
// 当目录打开时聚焦到搜索框
useEffect(() => {
if (isOpen && searchInputRef.current) {
setTimeout(() => {
searchInputRef.current.focus();
}, 100);
} else {
setSearchQuery(''); // 关闭目录时清空搜索
}
}, [isOpen]);
// 渲染目录项
const renderDirectoryItem = (dir) => {
// 当有搜索词时,只显示匹配的子项
let subItems = dir.subItems;
if (searchQuery && dir.subItems) {
const normalizedQuery = searchQuery.toLowerCase().trim();
subItems = dir.subItems.filter(item =>
item.name.toLowerCase().includes(normalizedQuery)
);
}
return (
<div key={dir.name} className={styles.directoryItem}>
<a
onClick={() => handleDirectoryClick(dir)}
className={`${styles.docLink} ${styles.mainCategory}`}
>
{dir.name}
</a>
{subItems && subItems.length > 0 && (
<div className={styles.subItemsContainer}>
{subItems.map(subItem => (
<a
key={subItem.name}
onClick={() => {
history.push(subItem.path);
setIsOpen(false);
}}
className={`${styles.docLink} ${styles.subCategory}`}
>
{subItem.name}
</a>
))}
</div>
)}
</div>
);
};
return (
<div className={styles.tocButtonContainer} ref={dropdownRef}>
<button
className={styles.tocButton}
onClick={() => setIsOpen(!isOpen)}
aria-label="文档目录"
title="浏览文档目录"
>
<span className={styles.tocIcon}>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 5H21" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/>
<path d="M3 12H21" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/>
<path d="M3 19H21" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/>
</svg>
</span>
</button>
{isOpen && (
<div className={styles.tocDropdown}>
<h2 className={styles.tocTitle}>文档目录</h2>
<div className={styles.searchContainer}>
<input
ref={searchInputRef}
type="text"
value={searchQuery}
onChange={handleSearchChange}
placeholder="搜索文档..."
className={styles.searchInput}
aria-label="搜索文档"
/>
{searchQuery && (
<button
className={styles.clearSearchButton}
onClick={clearSearch}
aria-label="清除搜索"
>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6L6 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
<path d="M6 6L18 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
</button>
)}
</div>
<div className={styles.tocContent}>
{filteredDirectories.length === 0 ? (
<div className={styles.emptyMessage}>未找到匹配的文档</div>
) : (
<div className={styles.multiColumnLayout}>
<div className={styles.column}>
{displayColumn1.map(renderDirectoryItem)}
</div>
{displayColumn2.length > 0 && (
<div className={styles.column}>
{displayColumn2.map(renderDirectoryItem)}
</div>
)}
{displayColumn3.length > 0 && (
<div className={styles.column}>
{displayColumn3.map(renderDirectoryItem)}
</div>
)}
</div>
)}
</div>
</div>
)}
</div>
);
}}
</BrowserOnly>
);
}

View File

@ -1,245 +0,0 @@
.tocButtonContainer {
position: relative;
display: inline-block;
}
/* 搜索框样式 */
.searchContainer {
position: relative;
margin-bottom: 1rem;
width: 100%;
}
.searchInput {
width: 100%;
padding: 0.75rem 2.5rem 0.75rem 1rem;
border-radius: 6px;
border: 1px solid var(--ifm-color-emphasis-300);
background-color: var(--ifm-background-color);
color: var(--ifm-font-color-base);
font-size: 0.95rem;
outline: none;
transition: all 0.2s;
}
.searchInput:focus {
border-color: var(--ifm-color-primary);
box-shadow: 0 0 0 2px rgba(var(--ifm-color-primary-rgb), 0.25);
}
.clearSearchButton {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
padding: 4px;
cursor: pointer;
color: var(--ifm-color-emphasis-500);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.clearSearchButton:hover {
background-color: var(--ifm-color-emphasis-200);
color: var(--ifm-color-emphasis-700);
}
/* 暗色模式搜索框适配 */
html[data-theme='dark'] .searchInput {
background-color: var(--ifm-background-surface-color);
border-color: var(--ifm-color-emphasis-300);
}
html[data-theme='dark'] .searchInput:focus {
border-color: var(--ifm-color-primary);
}
.tocButton {
display: flex;
align-items: center;
justify-content: center;
background-color: transparent;
border: none;
color: var(--ifm-navbar-link-color);
cursor: pointer;
padding: 0.5rem;
border-radius: 50%;
transition: all 0.2s;
}
.tocButton:hover {
background-color: var(--ifm-color-emphasis-200);
color: var(--ifm-navbar-link-hover-color);
}
.tocIcon {
display: flex;
align-items: center;
}
.tocDropdown {
position: absolute;
top: calc(100% + 5px);
right: 0;
width: 800px;
max-width: 98vw;
max-height: 90vh;
overflow-y: auto;
background-color: var(--ifm-background-surface-color);
border-radius: 8px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.16);
z-index: 1000;
padding: 1.5rem;
border: 1px solid var(--ifm-color-emphasis-200);
}
.tocTitle {
font-size: 1.25rem;
margin-top: 0;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--ifm-color-emphasis-200);
}
.tocContent {
display: flex;
flex-direction: column;
}
.multiColumnLayout {
display: flex;
flex-direction: row;
gap: 1.5rem;
width: 100%;
align-items: flex-start;
}
.column {
display: flex;
flex-direction: column;
gap: 0.85rem;
flex: 1;
min-width: 160px;
}
.column:nth-child(1),
.column:nth-child(2),
.column:nth-child(3) {
align-self: stretch;
height: 100%;
justify-content: space-between;
}
.column:nth-child(4) {
align-self: flex-start;
}
.directoryItem {
display: flex;
flex-direction: column;
margin-bottom: 0.2rem;
}
.mainCategory {
font-weight: 600;
color: var(--ifm-color-primary);
padding: 0.5rem 0.75rem;
font-size: 1rem;
border-radius: 4px;
}
.subItemsContainer {
display: flex;
flex-direction: column;
padding-left: 1.25rem;
margin-top: 0.15rem;
margin-bottom: 0.25rem;
gap: 0.25rem;
}
.subCategory {
font-weight: normal;
color: var(--ifm-font-color-base);
padding: 0.3rem 0.5rem;
font-size: 0.92rem;
position: relative;
}
.subCategory:before {
content: '';
position: absolute;
left: -8px;
top: 50%;
width: 4px;
height: 4px;
border-radius: 50%;
background-color: var(--ifm-color-emphasis-400);
transform: translateY(-50%);
}
.docLink {
display: block;
text-decoration: none;
cursor: pointer;
transition: all 0.2s;
}
.docLink:hover {
background-color: var(--ifm-color-emphasis-100);
color: var(--ifm-color-primary);
}
.activeDoc .docLink {
background-color: var(--ifm-color-emphasis-100);
color: var(--ifm-color-primary);
font-weight: 500;
}
/* 响应式样式 */
@media (max-width: 768px) {
.tocDropdown {
width: 640px;
right: -8px;
}
}
/* 暗色模式适配 */
html[data-theme='dark'] .tocDropdown {
background-color: var(--ifm-background-surface-color);
border-color: var(--ifm-color-emphasis-300);
}
/* 滚动条样式 */
.tocDropdown::-webkit-scrollbar {
width: 6px;
}
.tocDropdown::-webkit-scrollbar-track {
background: transparent;
}
.tocDropdown::-webkit-scrollbar-thumb {
background-color: var(--ifm-color-emphasis-300);
border-radius: 3px;
}
.tocDropdown::-webkit-scrollbar-thumb:hover {
background-color: var(--ifm-color-emphasis-400);
}
.loadingMessage,
.errorMessage,
.emptyMessage {
padding: 1rem;
text-align: center;
color: var(--ifm-color-emphasis-600);
font-style: italic;
}
.errorMessage {
color: #ff4d4f;
}

View File

@ -1,6 +0,0 @@
import React from 'react';
import TableOfContentsButton from './TableOfContentsButton';
export default function TableOfContentsNavbarItem() {
return <TableOfContentsButton />;
}

View File

@ -1,99 +0,0 @@
import React, { useState } from 'react';
import styles from './styles.module.css';
/**
* 视频演示组件
* @param {Object} props
* @param {string} props.title - 视频标题
* @param {string} props.description - 视频描述
* @param {string} props.platform - 视频平台 (bilibili, youku, youtube, local)
* @param {string} props.videoId - 视频ID或本地视频路径
* @param {Object} props.options - 其他选项
*/
function VideoDemo({
title,
description,
platform = 'bilibili',
videoId,
options = {}
}) {
const [isLoaded, setIsLoaded] = useState(false);
// 构建视频 URL
const getVideoSrc = () => {
switch (platform.toLowerCase()) {
case 'bilibili':
return `//player.bilibili.com/player.html?bvid=${videoId}&page=1&high_quality=1&danmaku=0${options.autoplay ? '&autoplay=1' : ''}`;
case 'youku':
return `//player.youku.com/embed/${videoId}${options.autoplay ? '?autoplay=1' : ''}`;
case 'youtube':
return `//www.youtube.com/embed/${videoId}${options.autoplay ? '?autoplay=1' : ''}`;
case 'local':
return videoId; // 本地视频路径
default:
return '';
}
};
const handleIframeLoad = () => {
setIsLoaded(true);
};
const handleVideoLoad = () => {
setIsLoaded(true);
};
// 渲染本地视频播放器
const renderLocalVideo = () => {
return (
<video
className={styles.videoFrame}
controls
preload="metadata"
onLoadedData={handleVideoLoad}
autoPlay={options.autoplay}
muted={options.muted}
>
<source src={getVideoSrc()} type="video/mp4" />
您的浏览器不支持 HTML5 视频播放
</video>
);
};
// 渲染在线视频播放器
const renderOnlineVideo = () => {
return (
<iframe
src={getVideoSrc()}
className={styles.videoFrame}
frameBorder="0"
allowFullScreen
onLoad={handleIframeLoad}
title={title}
></iframe>
);
};
return (
<div className={styles.videoDemo}>
<h3 className={styles.videoTitle}>{title}</h3>
{description && <p className={styles.videoDescription}>{description}</p>}
<div className={styles.videoWrapper}>
{!isLoaded && <div className={styles.loadingIndicator}>加载中...</div>}
{platform.toLowerCase() === 'local'
? renderLocalVideo()
: renderOnlineVideo()
}
</div>
{options.showTips && (
<div className={styles.videoTips}>
<p>提示: {options.tips || "可以使用播放器控制栏调整播放速度和画质"}</p>
</div>
)}
</div>
);
}
export default VideoDemo;

View File

@ -1,114 +0,0 @@
.videoDemo {
margin: 2rem 0;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
background-color: var(--ifm-color-emphasis-0);
}
.videoTitle {
font-size: 1.5rem;
margin-bottom: 0.5rem;
padding: 1rem;
background-color: var(--ifm-color-emphasis-200);
color: var(--ifm-color-emphasis-800);
border-bottom: 1px solid var(--ifm-color-emphasis-300);
}
.videoDescription {
padding: 0 1rem 1rem;
font-size: 1rem;
color: var(--ifm-color-emphasis-700);
}
.videoWrapper {
position: relative;
padding-top: 56.25%; /* 16:9 宽高比 */
width: 100%;
background-color: #000;
}
.videoFrame {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
.loadingIndicator {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: #000;
color: white;
font-size: 1.2rem;
z-index: 1;
}
.videoTips {
padding: 0.75rem 1rem;
background-color: var(--ifm-color-emphasis-100);
border-top: 1px solid var(--ifm-color-emphasis-200);
color: var(--ifm-color-emphasis-700);
font-size: 0.9rem;
}
/* 深色模式调整 */
html[data-theme='dark'] .videoDemo {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
html[data-theme='dark'] .videoTitle {
background-color: var(--ifm-color-emphasis-300);
color: var(--ifm-color-emphasis-900);
}
html[data-theme='dark'] .videoTips {
background-color: var(--ifm-color-emphasis-200);
}
/* 响应式样式 */
@media (max-width: 768px) {
.videoTitle {
font-size: 1.25rem;
padding: 0.75rem;
}
.videoDescription {
font-size: 0.9rem;
padding: 0 0.75rem 0.75rem;
}
.videoTips {
font-size: 0.8rem;
padding: 0.5rem 0.75rem;
}
.videoDemo {
margin: 1.5rem 0;
border-radius: 6px;
}
}
@media (max-width: 480px) {
.videoTitle {
font-size: 1.1rem;
padding: 0.5rem;
}
.loadingIndicator {
font-size: 1rem;
}
.videoDemo {
margin: 1rem 0;
border-radius: 4px;
}
}

View File

@ -18,131 +18,131 @@ const description = 'Security Building Blocks for Developers';
const IndexPage = () => {
return (
<Layout title={title} description={description}>
<HeroSection
title="Security Building Blocks for Developers"
description="Reduce Time to Market without sacrificing your security posture! BoxyHQ's suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster."
image="/img/home-hero.svg"
buttons={[
{
title: 'Get Started',
href: 'https://boxyhq.com/docs',
className: 'button--primary',
},
{
title: 'Book a demo',
href: 'https://meetings.hubspot.com/deepakprab/demo?__hstc=213510283.9a563789bb583fca1e9fb20a629c5c94.1651597904536.1664893584285.1664895920328.169&__hssc=213510283.1.1664895920328&__hsfp=498882655',
className: 'button--primary button--outline',
},
]}
/>
<Layout title={title} description={description}>
<HeroSection
title="Security Building Blocks for Developers"
description="Reduce Time to Market without sacrificing your security posture! BoxyHQs suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster."
image="/img/home-hero.svg"
buttons={[
{
title: 'Get Started',
href: 'https://boxyhq.com/docs',
className: 'button--primary',
},
{
title: 'Book a demo',
href: 'https://meetings.hubspot.com/deepakprab/demo?__hstc=213510283.9a563789bb583fca1e9fb20a629c5c94.1651597904536.1664893584285.1664895920328.169&__hssc=213510283.1.1664895920328&__hsfp=498882655',
className: 'button--primary button--outline',
},
]}
/>
{/* <CustomersSection />
{/* <CustomersSection />
<ProductsSection /> */}
<section className="page__section">
<div className="container">
<div className="row" style={{ gap: '10px', marginTop: '20px' }}>
<div className="col col--5 col--offset-1">
<div className="col-demo">
<div className="card-demo" style={{}}>
<div className="card">
<div className="card__header">
<h3
className="text--center"
style={{ whiteSpace: 'pre-line' }}
>
The Importance of Developer Security
</h3>
</div>
<div className="card__body">
<p className="text--center">
Cyber crimes are predicted to cost $10.5 trillion
annually by 2025, but time pressures often cause 70% of
development teams to skip crucial security steps.
</p>
<p>
In today's world, it is no longer sufficient to
prioritize productivity alone. The faster a developer
moves, the more potential security holes will be left
unaddressed.{' '}
</p>
</div>
<div className="card__footer">
<Link
className={clsx('button button--primary button--block')}
href="https://meetings.hubspot.com/deepakprab/demo?__hstc=213510283.9a563789bb583fca1e9fb20a629c5c94.1651597904536.1664893584285.1664895920328.169&__hssc=213510283.1.1664895920328&__hsfp=498882655"
>
Book a free developer-security session
</Link>
</div>
<section className="page__section">
<div className="container">
<div className="row" style={{ gap: '10px', marginTop: '20px' }}>
<div className="col col--5 col--offset-1">
<div className="col-demo">
<div className="card-demo" style={{}}>
<div className="card">
<div className="card__header">
<h3
className="text--center"
style={{ whiteSpace: 'pre-line' }}
>
The Importance of Developer Security
</h3>
</div>
<div className="card__body">
<p className="text--center">
Cyber crimes are predicted to cost $10.5 trillion
annually by 2025, but time pressures often cause 70% of
development teams to skip crucial security steps.
</p>
<p>
In today's world, it is no longer sufficient to
prioritize productivity alone. The faster a developer
moves, the more potential security holes will be left
unaddressed.{' '}
</p>
</div>
<div className="card__footer">
<Link
className={clsx('button button--primary button--block')}
href="https://meetings.hubspot.com/deepakprab/demo?__hstc=213510283.9a563789bb583fca1e9fb20a629c5c94.1651597904536.1664893584285.1664895920328.169&__hssc=213510283.1.1664895920328&__hsfp=498882655"
>
Book a free developer-security session
</Link>
</div>
</div>
</div>
</div>
<div className="col col--5">
<div className="col-demo">
<div className="card-demo">
<div className="card">
<div className="card__header">
<h3
className="text--center"
style={{ whiteSpace: 'pre-line' }}
>
Build or buy?
</h3>
</div>
<div className="card__body">
<p className="text--center">
Save time and money with BoxyHQ's free open-source
solution. Available under an Apache 2.0 license, our
solutions make it easy for developers to collaborate and
innovate, without the need for custom building or
expensive fees.
</p>
<p className="text--center">
Our solutions run in your environment, giving you full
control. We simply provide the building blocks to help
you succeed.
</p>
</div>
<div className="card__footer">
<Link
className={clsx('button button--primary button--block')}
href="mailto:hello@boxyhq.com"
>
Contact Us
</Link>
</div>
</div>
<div className="col col--5">
<div className="col-demo">
<div className="card-demo">
<div className="card">
<div className="card__header">
<h3
className="text--center"
style={{ whiteSpace: 'pre-line' }}
>
Build or buy?
</h3>
</div>
<div className="card__body">
<p className="text--center">
Save time and money with BoxyHQ's free open-source
solution. Available under an Apache 2.0 license, our
solutions make it easy for developers to collaborate and
innovate, without the need for custom building or
expensive fees.
</p>
<p className="text--center">
Our solutions run in your environment, giving you full
control. We simply provide the building blocks to help
you succeed.
</p>
</div>
<div className="card__footer">
<Link
className={clsx('button button--primary button--block')}
href="mailto:hello@boxyhq.com"
>
Contact Us
</Link>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</section>
<FeatureSection
title="Developer Security Tools"
btnLink="https://awesome-oss-devsec.boxyhq.com/"
btnText="Read More"
image={Icon3}
direction="right"
>
<p>
We have curated a list of awesome open-source developer security
tools.
</p>
<p>
It includes security principles and controls relevant to popular
compliance certifications (like ISO27001, SOC2, MVSP, etc.)
</p>
</FeatureSection>
<FeatureSection
title="Developer Security Tools"
btnLink="https://awesome-oss-devsec.boxyhq.com/"
btnText="Read More"
image={Icon3}
direction="right"
>
<p>
We have curated a list of awesome open-source developer security
tools.
</p>
<p>
It includes security principles and controls relevant to popular
compliance certifications (like ISO27001, SOC2, MVSP, etc.)
</p>
</FeatureSection>
{/* <NewsSection />
{/* <NewsSection />
<InvestorsSection />
<DeveloperCommunitySection /> */}
</Layout>
</Layout>
);
};

View File

@ -1,86 +0,0 @@
import React from 'react';
const wechatGroups = [
{ img: '/img/question/wechat1.png', label: '微信技术交流答疑群1' },
{ img: '/img/question/wechat2.png', label: '微信技术交流答疑群2' },
];
const qqGroups = [
{ img: '/img/question/qq1.png', label: 'QQ技术交流答疑群1' },
{ img: '/img/question/qq2.png', label: 'QQ技术交流答疑群2' },
];
export default function QA() {
return (
<div style={{
minHeight: '100vh',
background: 'linear-gradient(135deg, #e0e7ff 0%, #f8fafc 100%)',
padding: '0 0 48px 0',
}}>
<div style={{
maxWidth: 1000,
margin: '0 auto',
padding: '40px 24px 24px 24px',
}}>
<h1 style={{ textAlign: 'center', fontSize: 32, fontWeight: 700, marginBottom: 40, color: '#2d3a4b', letterSpacing: 2 }}>疑问解答与交流群</h1>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 32, justifyContent: 'center', marginBottom: 48 }}>
<div style={{ flex: '1 1 320px', background: '#fff', borderRadius: 16, boxShadow: '0 4px 24px rgba(70,106,255,0.08)', padding: 32, minWidth: 320 }}>
<h2 style={{ textAlign: 'center', color: '#466aff', fontSize: 22, marginBottom: 24 }}>微信交流群</h2>
<div style={{ display: 'flex', justifyContent: 'center', gap: 24 }}>
{wechatGroups.map((g, i) => (
<div key={i} style={{ textAlign: 'center' }}>
<img src={g.img} alt={g.label} style={{ width: 120, height: 120, borderRadius: 12, marginBottom: 8, boxShadow: '0 2px 8px rgba(70,106,255,0.10)' }} />
<div style={{ fontSize: 15, color: '#2d3a4b' }}>{g.label}</div>
</div>
))}
</div>
</div>
<div style={{ flex: '1 1 320px', background: '#fff', borderRadius: 16, boxShadow: '0 4px 24px rgba(70,106,255,0.08)', padding: 32, minWidth: 320 }}>
<h2 style={{ textAlign: 'center', color: '#466aff', fontSize: 22, marginBottom: 24 }}>QQ交流群</h2>
<div style={{ display: 'flex', justifyContent: 'center', gap: 24 }}>
{qqGroups.map((g, i) => (
<div key={i} style={{ textAlign: 'center' }}>
<img src={g.img} alt={g.label} style={{ width: 120, height: 120, borderRadius: 12, marginBottom: 8, boxShadow: '0 2px 8px rgba(70,106,255,0.10)' }} />
<div style={{ fontSize: 15, color: '#2d3a4b' }}>{g.label}</div>
</div>
))}
</div>
</div>
</div>
<div style={{
background: '#fff',
borderRadius: 16,
boxShadow: '0 4px 24px rgba(70,106,255,0.08)',
padding: 32,
maxWidth: 600,
margin: '0 auto',
textAlign: 'center',
}}>
<h2 style={{ color: '#466aff', fontSize: 22, marginBottom: 24 }}>官网论坛</h2>
<a
href="https://forum.gitlink.org.cn/forums"
target="_blank"
rel="noopener noreferrer"
style={{
display: 'inline-block',
background: '#466aff',
color: '#fff',
borderRadius: 6,
padding: '12px 40px',
fontSize: 18,
textDecoration: 'none',
fontWeight: 600,
boxShadow: '0 2px 8px rgba(70,106,255,0.10)',
letterSpacing: 1,
}}
>
访问官网论坛
</a>
</div>
<div style={{ textAlign: 'center', marginTop: 56 }}>
<img src="/img/gitlink.png" alt="GitLink Logo" style={{ width: 80, opacity: 0.12 }} />
</div>
</div>
</div>
);
}

View File

@ -1,17 +0,0 @@
import React from 'react';
import Footer from '@theme-original/DocItem/Footer';
import RatingSystem from '../../../components/RatingSystem';
import RatingStats from '../../../components/RatingStats';
import styles from './styles.module.css';
export default function FooterWrapper(props) {
return (
<>
<Footer {...props} />
<div className={styles.ratingWrapper}>
<RatingStats />
<RatingSystem />
</div>
</>
);
}

View File

@ -1,5 +0,0 @@
.ratingWrapper {
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid var(--ifm-color-emphasis-200);
}

View File

@ -1,28 +0,0 @@
import React, { useEffect } from 'react';
import DocItem from '@theme-original/DocItem';
export default function DocItemWrapper(props) {
useEffect(() => {
if (typeof window === 'undefined') return;
const key = 'scroll-pos:' + window.location.pathname;
// 恢复滚动位置
const saved = localStorage.getItem(key);
if (saved) {
window.scrollTo(0, parseInt(saved, 10));
}
// 保存滚动位置
const handler = () => {
localStorage.setItem(key, window.scrollY);
};
window.addEventListener('scroll', handler);
// 卸载时清理
return () => {
window.removeEventListener('scroll', handler);
};
}, []);
return <DocItem {...props} />;
}

View File

@ -1,32 +0,0 @@
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
import DocNavbarItem from '@theme/NavbarItem/DocNavbarItem';
import DocSidebarNavbarItem from '@theme/NavbarItem/DocSidebarNavbarItem';
import DocsVersionNavbarItem from '@theme/NavbarItem/DocsVersionNavbarItem';
import DocsVersionDropdownNavbarItem from '@theme/NavbarItem/DocsVersionDropdownNavbarItem';
import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem';
import SearchNavbarItem from '@theme/NavbarItem/SearchNavbarItem';
import PdfExportNavbarItem from '../../components/PdfExportNavbarItem';
import PdfBackToTopNavbarItem from '../../components/PdfBackToTopNavbarItem';
import BackToBottomNavbarItem from '../../components/BackToBottomNavbarItem';
import QAButtonNavbarItem from '../../components/QAButtonNavbarItem';
import TableOfContentsNavbarItem from '../../components/TableOfContentsNavbarItem';
const ComponentTypes = {
default: DefaultNavbarItem,
localeDropdown: LocaleDropdownNavbarItem,
search: SearchNavbarItem,
dropdown: DropdownNavbarItem,
docsVersionDropdown: DocsVersionDropdownNavbarItem,
docsVersion: DocsVersionNavbarItem,
doc: DocNavbarItem,
docSidebar: DocSidebarNavbarItem,
'custom-pdf-export': PdfExportNavbarItem,
'custom-back-to-top': PdfBackToTopNavbarItem,
'custom-back-to-bottom': BackToBottomNavbarItem,
'custom-qa-button': QAButtonNavbarItem,
'custom-table-of-contents': TableOfContentsNavbarItem,
};
export default ComponentTypes;

View File

@ -1,22 +0,0 @@
import React from 'react';
import NavbarItem from '@theme-original/NavbarItem';
import PdfExportNavbarItem from '../../components/PdfExportNavbarItem';
import PdfBackToTopNavbarItem from '../../components/PdfBackToTopNavbarItem';
import BackToBottomNavbarItem from '../../components/BackToBottomNavbarItem';
import QAButtonNavbarItem from '../../components/QAButtonNavbarItem';
export default function NavbarItemWrapper(props) {
if (props.type === 'custom-pdf-export') {
return <PdfExportNavbarItem />;
}
if (props.type === 'custom-back-to-top') {
return <PdfBackToTopNavbarItem />;
}
if (props.type === 'custom-back-to-bottom') {
return <BackToBottomNavbarItem />;
}
if (props.type === 'custom-qa-button') {
return <QAButtonNavbarItem />;
}
return <NavbarItem {...props} />;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

View File

@ -1 +0,0 @@
ceshi

View File

@ -1 +0,0 @@
这是用于测试流水线的文档

View File

@ -2,74 +2,6 @@
sidebar_label: 'bot安装'
sidebar_position: 1
---
import MyButton from './mybutton';
<MyButton onClick={() => {
var pElements = document.getElementsByTagName('p');
var hElements = document.getElementsByTagName('h1');
var aElements = document.getElementsByTagName('a');
var hzh = ['bot安装','bot安装'];
var hen = ['Bot Installation','Bot Installation'];
var azh = ['跳到主要内容','','帮助中心','','','','','','','','','','','','','','','','','','','','','机器人(Bot)','编辑此页','上一页 bot市场','下一页bot 配置','网站首页','关于我们','教学实践','合作伙伴','API文档','Git常用命令','引擎使用手册','服务协议','官网邮箱gitlink@ccf.org.cn','QQ群','公众号'];
var aen = ['Jump to main content','','Help Center','','','','','','','','','','','','','','','','','','','','','Robot (Bot)','Edit this page','last page Bot market','next page Bot configuration','Website homepage','About Us','Teaching practice','Partners','API documentation','Common Git commands','Engine User Manual','Service Agreement','Official website email: gitlink@ccf.org.cn','QQ group','Official Account'];
var zhtranalate = ['Bot安装是进行bot安装和管理控制的重要模块主要包括bot安装、安装查询、安装管理等功能。','在bot详情页用户点击“安装此Bot”按钮后可以看到该bot工作所需的各项权限信息。若用户同意授予bot所需的相关权限即可进行安装。用户可选择将bot安装到所有仓库用户拥有的所有仓库也可以选择指定的仓库进行安装。','','在个人“设置”或者“仓库设置”中用户可以看到目前已经安装的Bot情况点击“配置”按钮可以对bot安装情况进行配置点击“卸载”按钮可以进行卸载。','','在bot安装配置页中用户可以掌握该bot的安装位置和工作状态。若用户需要更改bot的工作仓库时可以进行更改安装位置。bot的工作状态包括激活和挂起用户可根据需要对bot的状态进行调整将其挂起或者激活会影响到bot对仓库数据的访问权限。','','©Copyright 2024 CCF 开源发展委员会','Powered by Trustie& IntelliDE 京ICP备13000930号'];
var entranslate = ['Bot installation is an important module for bot installation and management control, which mainly includes functions such as bot installation, installation queries, and installation management.','On the bot details page, after clicking the "Install this bot" button, users can see the necessary permission information for the bot to work. If the user agrees to grant the necessary permissions to the bot, installation can proceed. Users can choose to install the bot in all warehouses (all warehouses owned by the user) or select a specified warehouse for installation.','','In personal "settings" or "warehouse settings", users can see the current installation status of bots. Click the "configure" button to configure the bot installation status, and click the "uninstall" button to uninstall.','','In the bot installation configuration page, users can grasp the installation location and working status of the bot. If the user needs to change the workspace of the bot, they can change the installation location. The working status of bots includes activation and suspension. Users can adjust the status of bots as needed. Suspending or activating bots can affect their access to warehouse data.','','© Copyright 2024 CCF Open Source Development Committee','Powered by Trust&IntelliDE Beijing ICP Preparation No. 13000930'];
if (pElements[0].innerText == zhtranalate[0]){
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = entranslate[i];
}
}
}
}
else{
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = zhtranalate[i];
}
}
}
}
if (hElements[0].innerText == hzh[0]){
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hen[i];
}
}
}
}
else{
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hzh[i];
}
}
}
}
if (aElements[0].innerText == azh[0]){
for (var i = 0; i < aElements.length; i++) {
if (aElements[i].innerText != ''){
if (i < aElements.length){
aElements[i].innerText = aen[i];
}
}
}
}
else{
for (var i = 0; i < aElements.length; i++) {
if (aElements[i].innerText != ''){
if (i < aElements.length){
aElements[i].innerText = azh[i];
}
}
}
}
}}>中/英</MyButton>
# bot安装

View File

@ -2,52 +2,6 @@
sidebar_label: 'bot市场'
sidebar_position: 4
---
import MyButton from './mybutton';
<MyButton onClick={() => {
var pElements = document.getElementsByTagName('p');
var hElements = document.getElementsByTagName('h1');
var hzh = ['bot市场','bot市场'];
var hen = ['Bot Market','Bot Market'];
var zhtranalate = ['Bot市场是进行Bot分享与复用的重要模块主要包括bot的搜索发现详情查看等功能。','Bot市场主页中展示了目前所有已经上架市场的bot简要信息包括bot的头像名称开发者简介和安装次数等信息用户可根据这些基本信息初步判断该bot是否符合自己的项目需求。','在bot市场主页中用户可以选择指定的bot种类筛选出特定分类的bot在这个种类范围内进行搜索与选择。','此外用户通过在搜索栏中输入关键字进行搜索可检索出内容包含指定关键字的相关bot。','用户可结合种类筛选和关键字搜索缩小范围在市场中快速找到符合项目相关需求的bot。','','在bot市场页中用户点击指定的bot卡片即可进入该bot的详情页。Bot的详情页包含bot的头像名称开发者种类和详细介绍等信息用户可在此掌握该bot的各项介绍进一步判断是否将其安装到指定仓库中。','','在bot详情页中若用户认为该bot满足自己的项目需求可点击“安装此Bot”按钮了解该bot的权限信息将其安装到指定的仓库中关于安装的更多介绍可见“Bot安装”部分。','去市场看看吧!','©Copyright 2024 CCF 开源发展委员会','Powered by Trustie& IntelliDE 京ICP备13000930号'];
var entranslate = ['The bot market is an important module for sharing and reusing bots, mainly including functions such as searching, discovering, and viewing details of bots.' , 'The Bot Market homepage displays brief information about all bots that have been put on the market, including their avatars, names, developers, introductions, and installation times. Users can use this basic information to preliminarily determine whether the bot meets their project requirements.' , 'On the bot market homepage, users can select a specific type of bot, filter out specific categories of bots, and search and select within this category range.' , 'In addition, users can search for relevant bots containing specified keywords by entering keywords in the search bar.' , 'Users can combine category filtering and keyword search to narrow down the scope and quickly find bots that meet project related needs in the market.' , '' , 'In the bot market page, users can click on the specified bot card to enter the details page of the bot. The details page of the bot includes information such as the bot avatar, name, developer, type, and detailed introduction. Users can grasp the various introductions of the bot here and further determine whether to install it in the designated warehouse.' , '' , 'In the bot details page, if users believe that the bot meets their project requirements, they can click the "Install this bot" button to learn about the bots permission information and install it in the designated warehouse. For more information on installation, please refer to the "Bot Installation" section' , 'Go take a look at the market!' , '©Copyright 2024 CCF Open Source Development Committee' , 'Powered by Trustie& IntelliDE 京ICP备13000930号'];
if (pElements[0].innerText == zhtranalate[0]){
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = entranslate[i];
}
}
}
}
else{
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = zhtranalate[i];
}
}
}
}
if (hElements[0].innerText == hzh[0]){
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hen[i];
}
}
}
}
else{
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hzh[i];
}
}
}
}
}}>中/英</MyButton>
# Bot市场
@ -67,16 +21,4 @@ Bot市场主页中展示了目前所有已经上架市场的bot简要信息
![botmarket2](../../../static/img/bot/botmarket2.png)
在bot详情页中若用户认为该bot满足自己的项目需求可点击“安装此Bot”按钮了解该bot的权限信息将其安装到指定的仓库中关于安装的更多介绍可见“Bot安装”部分。
去市场看看吧!
<MyButton onClick={() => {
location.href = "https://www.gitlink.org.cn/softbot";
}}>Bot市场</MyButton>
在bot详情页中若用户认为该bot满足自己的项目需求可点击“安装此Bot”按钮了解该bot的权限信息将其安装到指定的仓库中关于安装的更多介绍可见“Bot安装”部分。

View File

@ -2,52 +2,6 @@
sidebar_label: 'bot开发'
sidebar_position: 3
---
import MyButton from './mybutton';
<MyButton onClick={() => {
var pElements = document.getElementsByTagName('p');
var hElements = document.getElementsByTagName('h1');
var hzh = ['bot开发','bot开发'];
var hen = ['Bot Development','Bot Development'];
var zhtranalate = ['Bot开发是开发者进行bot注册的重要模块。' , '在个人“设置”中用户可以看到目前已经注册的bot列表点击对应bot的“编辑”按钮可以对已注册的bot进行配置点击“Bot注册”按钮开始注册新的bot。' , '' , '在注册页中开发者需要填写bot注册的相关信息包括bot的名称、Webhook 地址详细介绍等系统将对开发者输入的信息进行合法性校验确保bot各项信息的完整性和有效性。此外系统将自动生成bot的唯一标识同时调用 GitLink 平台的相关接口生成bot的身份凭证信息包括客户端密钥和私钥等。' , '开发者需通过这些身份信息结合平台接口进行bot身份认证后调用相关接口完成bot的相关功能。' , '平台开发API链接待完善https://www.gitlink.org.cn/docs/api#introduction' , '' , '' , '©Copyright 2024 CCF 开源发展委员会' , 'Powered by Trustie& IntelliDE 京ICP备13000930号'];
var entranslate = ['Bot development is an important module for developers to register their bots.' , 'In personal settings, users can see a list of registered bots and click the "Edit" button on the corresponding bot to configure the registered bots; Click the "Bot Registration" button to start registering a new bot.' , '' , 'In the registration page, developers need to fill in the relevant information for bot registration, including the name of the bot, Webhook address, detailed introduction, etc. The system will verify the legality of the information entered by the developer to ensure the completeness and validity of all bot information. In addition, the system will automatically generate a unique identifier for the bot, and call the relevant interfaces of the GitLink platform to generate the identity credential information of the bot, including the client key and private key.' , 'Developers need to use these identity information in combination with the platform interface for bot identity authentication, and then call the relevant interface to complete the relevant functions of the bot.' , 'Platform development API link (to be improved): https://www.gitlink.org.cn/docs/api#introduction' , '' , '' , '© Copyright 2024 CCF Open Source Development Committee' , 'Powered by Trust&IntelliDE Beijing ICP Preparation No. 13000930'];
if (pElements[0].innerText == zhtranalate[0]){
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = entranslate[i];
}
}
}
}
else{
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = zhtranalate[i];
}
}
}
}
if (hElements[0].innerText == hzh[0]){
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hen[i];
}
}
}
}
else{
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hzh[i];
}
}
}
}
}}>中/英</MyButton>
# Bot开发

View File

@ -2,52 +2,6 @@
sidebar_label: 'bot配置'
sidebar_position: 2
---
import MyButton from './mybutton';
<MyButton onClick={() => {
var pElements = document.getElementsByTagName('p');
var hElements = document.getElementsByTagName('h1');
var hzh = ['bot配置','bot配置'];
var hen = ['Bot Configure','Bot Configure'];
var zhtranalate = ['Bot配置是开发者进行bot维护和配置的重要模块主要包括bot基本信息维护、权限&订阅事件管理、高级选项配置等功能。','Bot的基本信息维护中开发者可以看到bot的各项基本信息并可以根据需要对bot的头像名称Webhook地址等进行修改。','','Bot的权限&订阅事件管理中开发者可根据对仓库资源的访问需要为bot分配不同的权限和等级比如增加代码库权限将拉取请求的写权限变为读权限等。开发者还能更改当前bot订阅的事件列表比如订阅代码库推送取消拉取请求分配订阅等以实现bot功能的更新与升级。','','Bot高级选项配置中开发者可以改变bot的公私有状态从而影响到bot的使用范围。需要注意的是公开状态下的bot在已有其他仓库安装的情况下不能变成私有。开发者可选择将bot上架到市场需要填写上架信息包括市场简介主要功能次要功能等各项信息。','开发者还能进行bot的删除和转让操作发起转让意味着更改bot的所有权需要输入接受者的用户名。在接受者确定接受后即可完成bot的所有权变更拒绝则会取消本次的转让操作。','','©Copyright 2024 CCF 开源发展委员会','Powered by Trustie& IntelliDE 京ICP备13000930号'];
var entranslate = ['Bot configuration is an important module for developers to maintain and configure bots, mainly including basic bot information maintenance, permission&subscription event management, advanced option configuration, and other functions.' , 'In the basic information maintenance of bots, developers can see various basic information of bots and modify their avatars, names, Webhook addresses, etc. as needed.' , '' , 'In the permission and subscription event management of bots, developers can assign different permissions and levels to bots based on their access needs to warehouse resources, such as adding code library permissions, changing write permissions for pull requests to read permissions, etc. Developers can also modify the event list of the current bot subscription, such as subscribing to code library push notifications, canceling pull request allocation subscriptions, etc., to achieve updates and upgrades of bot functionality.' , '' , 'In the advanced options configuration of bots, developers can change the public and private status of bots, thereby affecting their usage scope. It should be noted that bots in public status cannot become private when installed in other warehouses. Developers can choose to put their bots on the market and need to fill in the listing information, including market introduction, main functions, secondary functions, and other related information.' , 'Developers can also perform bot deletion and transfer operations, initiating transfer means changing the ownership of the bot, and the recipients username needs to be entered. After the recipient confirms acceptance, the ownership change of the bot can be completed. Refusal will cancel the transfer operation.' , '' , '© Copyright 2024 CCF Open Source Development Committee' , 'Powered by Trust&IntelliDE Beijing ICP Preparation No. 13000930'];
if (pElements[0].innerText == zhtranalate[0]){
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = entranslate[i];
}
}
}
}
else{
for (var i = 0; i < pElements.length; i++) {
if (pElements[i].innerText != ''){
if (i < pElements.length){
pElements[i].innerText = zhtranalate[i];
}
}
}
}
if (hElements[0].innerText == hzh[0]){
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hen[i];
}
}
}
}
else{
for (var i = 0; i < hElements.length; i++) {
if (hElements[i].innerText != ''){
if (i < hElements.length){
hElements[i].innerText = hzh[i];
}
}
}
}
}}>中/英</MyButton>
# Bot配置

View File

@ -1,13 +0,0 @@
import React from 'react';
import styles from './mybutton.module.css'; // 假设你有一个CSS模块文件来定义样式
const MyButton = ({ onClick, children, className = '' }) => (
<button
onClick={onClick}
className={`${styles.myButton} ${className}`} // 使用CSS模块样式
>
{children}
</button>
);
export default MyButton;

View File

@ -1,21 +0,0 @@
.myButton {
background-color: #30a834; /* Green */
border: none;
color: #fff; /* 改为白色或其他与绿色背景对比明显的颜色 */
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
position: absolute;
right: 0;
/* 还可以添加其他样式,比如过渡效果、阴影等 */
transition: background-color 0.3s ease; /* 背景色变化的过渡效果 */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* 简单的阴影效果 */
}
.myButton:hover {
background-color: #288f2c; /* 鼠标悬停时改变背景色 */
}

View File

@ -1,14 +1,14 @@
---
sidebar_label: "介绍"
label: "介绍"
sidebar_position: 0
sidebar_position: 1
slug: /
---
# 关于GitLink
GitLink确实开源是CCF官方指定的开源创新服务平台旨在以“为开源创新服务”为使命以“成为开源创新的汇聚地”为愿景秉承“创新、开放、协作、共享”的价值观致力于为大规模开源开放协同创新助力赋能打造创新成果孵化和新工科人才培养的开源创新生态
![](/img/ccf_gitlink.png)
![](/img/ccf_gitlink.png)
# 平台功能
@ -32,7 +32,7 @@ GitLink确实开源是CCF官方指定的开源创新服务平台旨在
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/代码库管理/仓库创建">
<h2 class="text--truncate cardTitle" title="代码库管理">代码库管理</h2>
<p>代码库使用及设置[9个文档]</p>
<p>代码库使用及设置[8个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/组织管理/组织简介">
@ -69,26 +69,6 @@ GitLink确实开源是CCF官方指定的开源创新服务平台旨在
<h2 class="text--truncate cardTitle" title="第三方服务">第三方服务</h2>
<p>第三方服务使用及设置[3个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/通知/通知简介">
<h2 class="text--truncate cardTitle" title="通知">通知</h2>
<p>通知简介及设置[2个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/个人主页建站/站点创建流程">
<h2 class="text--truncate cardTitle" title="个人主页建站">个人主页建站</h2>
<p>个人主页建站使用及设置[2个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/平台公告">
<h2 class="text--truncate cardTitle" title="平台公告">平台公告</h2>
<p>平台公告[1个文档]</p>
</a></article>
<article class="col col--6 margin-bottom--lg">
<a class="card padding--lg cardContainer" href="/服务协议/GitLink服务协议">
<h2 class="text--truncate cardTitle" title="服务协议">服务协议</h2>
<p>GitLink服务协议[1个文档]</p>
</a></article>
</section>
</div>
</div>
</div>

View File

@ -4,9 +4,9 @@ sidebar_position: 9
---
### **1. 语言服务**
● 支持近 40 种语言的语法高亮
● 支持 JavaScript/TypeScript、HTML、CSS、JSON、Markdown 的基于 LSP (Language Server Protocol) 语言特性功能,具备智能提示和大纲信息以及单文件内跳转。
● 支持 Java、Go、Python、C++、Php 的基于 Tree Sitter 的在线语言服务能力,提供查看引用、符号搜索等特性
● 支持近 40 种语言的语法高亮
● 支持 JavaScript/TypeScript、HTML、CSS、JSON、Markdown 的基于 LSP (Language Server Protocol) 语言特性功能,具备智能提示和大纲信息以及单文件内跳转。
● 支持 Java、Go、Python、C++、Php 的基于 Tree Sitter 的在线语言服务能力,提供查看引用、符号搜索等特性
### **2. WebIDE 入口**
从 Gitlink 仓库首页 点击Web IDE 按键即可进入
@ -36,6 +36,6 @@ sidebar_position: 9
可以在极速版新建分支,修改代码后在 SCM 面板看到变更文件列表,写完 commit message 后提交到 Gitlink 上。如果想快速修改一些文件可以不用在本地修改,直接通过极速版修改代码一次性提交。
### **9. 代码在线运行**
● 集成了基于 skypack 的更加轻量的 CodeSwing 插件,可以在极速版去运行前端代码。
● 集成了基于 Pyodide 的 Code-Runner-For-Web 插件,可以将 Python 的运行搬到浏览器上。
● 集成了基于 skypack 的更加轻量的 CodeSwing 插件,可以在极速版去运行前端代码。
● 集成了基于 Pyodide 的 Code-Runner-For-Web 插件,可以将 Python 的运行搬到浏览器上。
![](../../../static/img/代码库管理/WebIDE/WebIDE代码在线运行.png)<br/>

View File

@ -1,11 +1,4 @@
---
sidebar_label: '代码提交'
sidebar_position: 3
---
### **1. 代码提交入口**
用户可以通过项目代码库中间的文件下的“上传文件”按键来上传文件。
![](../../../static/img/代码库管理/代码提交/上传文件入口.png)<br/>
### **2. 上传文件**
进入上传文件页面后,如下图所示,拖动文件,选择提交变更的分支的单击”创建项目“按键即可完成创建。
![](../../../static/img/代码库管理/代码提交/上传文件.png)<br/>
---

View File

@ -1,13 +1,4 @@
---
sidebar_label: '分支管理'
sidebar_position: 5
---
### **1. 查看分支**
在代码库栏下,如下图所示,用户可以点击代码库分支从而查看当前项目的所有分支,并且选择对其进行操作。
![](../../../static/img/代码库管理/分支管理/分支管理方式1.jpg)<br/>
### **2. 合并分支**
在“和并请求PR”下点击“新建合并请求”后
![](../../../static/img/代码库管理/分支管理/分支管理方式3.png)<br/>
如下图所示,用户可以选择源分支与目标分支以及填写分支信息后提交分支合并请求。
![](../../../static/img/代码库管理/分支管理/分支管理方式2.png)<br/>
---

View File

@ -1,19 +1,4 @@
---
sidebar_label: '文件管理'
sidebar_position: 4
---
### **1. 文件管理位置**
在代码库界面,可直接对代码库中该分支下的文件进行操作,如下图所示。
![](../../../static/img/代码库管理/文件管理/文件管理入口.png)<br/>
### **2. 进入目录**
点击进入相关目录,找到要编辑的文件,如下图所示。
![](../../../static/img/代码库管理/文件管理/进入文件所在目录.png)<br/>
### **3. 进入文件编辑页面**
在线编辑文件,单击文件,即可进入编辑文件页面,如下图所示。
![](../../../static/img/代码库管理/文件管理/进入文件编辑界面.png)<br/>
### **4. 编辑文件**
编辑界面右侧有三个按钮,分别是“下载”、“编辑”和“删除”,点击下载即可将文件下载到本地,编辑则可在线编辑文档,删除则将文件从代码库中删除,按钮位置如下图所示。
![](../../../static/img/代码库管理/文件管理/文件编辑按钮.png)<br/>
---

View File

@ -3,11 +3,4 @@ sidebar_label: '代码评审'
sidebar_position: 3
---
# 代码评审
### **1. 进入代码评审**
如下图所示,点击“代码评审”按钮可以进入代码评审
![](../../../static/img/PR/进入代码评审.png)<br/>
### **2. 代码评审界面**
如下图所示用户可以在该界面下查看该PR操作要合并的新的代码并对其进行评审。
![](../../../static/img/PR/具体代码评审.png)<br/>
# 代码评审

View File

@ -7,11 +7,9 @@ sidebar_position: 2
1. 进入需要发起合并请求的项目的“**合并请求(PR)**”界面,点击上方的“**新建合并请求**”按钮后,进入合并请求发布界面,如下所示:
![合并请求模块](/img/PR/imagePR2.png)
![合并请求模块](../../../static/img/PR/imagePR2.png)<br/>
![合并请求发布界面](../../../static/img/PR/imagePR3.png)<br/>
![合并请求发布界面](/img/PR/imagePR3.png)
2. 选择需要合并的**源分支**和**目标分支**其中源分支为已完成代码开发、需要合并其代码变更的分支目标分支为要并入代码变更的分支既可以是同一仓库下的其他分支branch也可以是被复刻的源仓库下的分支
@ -21,5 +19,4 @@ sidebar_position: 2
5. 最后信息填写完毕后,点击底部的“**创建**”按钮即可提交您的第一个合并请求了🎉🎉🎉!
![创建合并请求](../../../static/img/PR/imagePR4.png)<br/>
![创建合并请求](/img/PR/imagePR4.png)

View File

@ -9,8 +9,7 @@ sidebar_position: 4
然而对于不同分支间的提交合并存在多种合并模式下图为GitLink中支持的合并模式包括**合并请求**、**变基并合并**、**变基合并 --no-ff**以及**压缩提交并合并**四种。
![](../../../static/img/PR/imagePR5.png)<br/>
![合并模式](/img/PR/imagePR5.png)
1. **合并请求**
@ -18,13 +17,11 @@ sidebar_position: 4
快进合并前:
![](../../../static/img/PR/imagePR6.png)<br/>
![快进合并前](/img/PR/imagePR6.png)
快进合并后:
![](../../../static/img/PR/imagePR7.png)<br/>
![快进合并后](/img/PR/imagePR7.png)
**注意**:可以看到,合并的过程就是直接把`master`指针移动到了`dev`指针处,这种合并被称为**快进fast-forward**之所以出现这种情形是因为在提交3之后`master`分支上没有新的提交,所以通过直接快进`master`指针就可以完成合并;但如果在`master`分支上也有新的提交,就需要进行实质性的合并了,如下面两幅图所示:
@ -32,21 +29,18 @@ sidebar_position: 4
非快进合并前:
![](../../../static/img/PR/imagePR8.png)<br/>
![非快进合并前](/img/PR/imagePR8.png)
合并之后提交A、B、C都会按时间线加入`master`的提交记录中并且会生成一个新的提交D用于记录合并这件事情此外如果合并过程中发生了冲突即两个分支对同一个文件进行了修改则需要手动处理冲突这种合并方式就是**非快进no fast-forward**,这也是**合并请求**模式下的默认方式!
非快进合并后:
![](../../../static/img/PR/imagePR9.png))<br/>
![非快进合并后](/img/PR/imagePR9.png)
为了方便理解,可以以线性方式查看合并后的`master`分支上的提交记录
![](../../../static/img/PR/imagePR10.png)<br/>
![线性的提交记录](/img/PR/imagePR10.png)
**总结**:在**合并请求**模式下,默认采用**非快进**合并开发分支到`master`分支上,而**非快进**方式会生成一个特殊的提交用于记录此次合并事件!
@ -58,21 +52,18 @@ sidebar_position: 4
变基前:
![](../../../static/img/PR/imagePR8.png)<br/>
![变基前](/img/PR/imagePR8.png)
变基后、合并前:
![](../../../static/img/PR/imagePR11.png)<br/>
![变基后_合并前](/img/PR/imagePR11.png)
`dev`分支变基之后,`master`分支就没有“更新”的提交了,所以此时进行合并,就得到了如下的结果
合并后:
![](../../../static/img/PR/imagePR12.png)<br/>
![合并后](/img/PR/imagePR12.png)
**总结**:在**变基并合并**模式下,开发分支`dev`可以先进行变基操作,使其上的提交看起来都是在`master`分支最新的提交基础上进行的,然后再通过**快进**方式合并回`master`分支,从而起到整理提交记录的作用!
@ -82,13 +73,11 @@ sidebar_position: 4
`--no-ff`合并前:
![](../../../static/img/PR/imagePR11.png)<br/>
![--no-ff合并前](/img/PR/imagePR11.png)
`--no-ff`合并后:
![](../../../static/img/PR/imagePR13.png)<br/>
![--no-ff合并后](/img/PR/imagePR13.png)
**总结**:通过`--no-ff`选项,可以显式声明在合并时采用**非快进**方式,这样就可以在`master`分支中添加一个记录合并事件的提交!
@ -98,17 +87,14 @@ sidebar_position: 4
压缩前:
![](../../../static/img/PR/imagePR8.png)<br/>
![压缩前](/img/PR/imagePR8.png)
压缩后、提交前:
![](../../../static/img/PR/imagePR14.png)<br/>
![压缩后_提交前](/img/PR/imagePR14.png)
提交后:
![](../../../static/img/PR/imagePR15.png)<br/>
![提交后](/img/PR/imagePR15.png)
**总结**:在合并前,先对开发分支上的琐碎提交进行压缩,可以使`master`分支上的提交信息更简洁,但是要注意,这种合并模式本质上是`master`分支一次性保存`dev`上的变更,并创建新的提交记录这些变更,所以提交者发生了变化!

View File

@ -3,15 +3,4 @@ sidebar_label: '合并请求关联疑修'
sidebar_position: 5
---
# 合并请求关联疑修
#(开发中预告)
📌 **当前状态**该功能预计于202X年发布正在[GitLink Engine X.X](https://roadmap.gitlink.org)进行集成测试。
🔗 **进度追踪**:关注疑修 [#462347](https://issues.gitlink.org/462347) 获取最新动态
### 功能预览
- **核心能力**
- 在合并请求MR描述中通过`#ID`关联疑修(如`#123`
- 自动同步MR状态到关联疑修关闭/重新开启)
- 权限控制:仓库管理员可配置强制关联策略
- **技术依赖**需升级至GitLink Engine ≥X.X
# 合并请求关联疑修

View File

@ -15,5 +15,4 @@ GitLink中的 **合并请求(PR)** 模块提供合并请求创建和管理两方
如下图所示为合并请求(PR)管理模块:
![合并请求管理模块](../../../static/img/PR/imagePR1.png)<br/>
![合并请求管理模块](/img/PR/imagePR1.png)

View File

@ -0,0 +1,4 @@
---
sidebar_label: '平台公告'
sidebar_position: 1
---

View File

@ -1,75 +0,0 @@
---
sidebar_label: '平台公告说明'
sidebar_position: 1
---
GitLink 平台公告
发布日期2024年X月X日
公告类型:版本更新与维护通知
影响范围所有GitLink用户
📢 最新动态
1. 版本升级至 vX.X.X
更新概要:
DevOps引擎增强支持自定义流水线模板新增10种预置任务节点含SonarQube代码扫描、Kubernetes部署
安全升级修复CVE-2024-1234漏洞强制启用双因素认证2FA选项。
性能优化仓库克隆速度提升40%,大型文件(>1GB传输稳定性增强。
升级指南:
服务端升级命令:
gitlinkctl upgrade --version 2.3.0
客户端兼容性需更新至vX.X.X及以上版本下载地址
🛠️ 维护计划
1. 系统维护窗口
时间202X年X月X日 02:00 - 05:00 (UTC+8)
影响:
期间代码推送、流水线触发功能暂停(仓库只读访问正常)。
建议用户提前完成关键操作。
2. 数据迁移通知
对象使用旧版存储引擎vX.X的用户
截止日期202X年X月X日
操作步骤:
进入「控制台 -> 存储管理」发起迁移任务。
验证数据完整性支持SHA-256校验
删除旧存储卷释放资源。
⚠️ 重要提示
1. 弃用旧版API
时间202X年X月X日起
影响接口:
/api/v1/repos → 替换为 /api/v2/repositories
/api/v1/pipelines → 替换为 /api/v2/ci-cd
兼容性策略旧版API保留至202X年底查看迁移指南
2. 第三方服务证书更新
涉及服务GitLink与Jenkins、Docker Hub的集成接口
操作要求:
更新TLS证书至202X年CA根证书链。
测试流水线中第三方服务调用。
🆕 新功能速递
1. 智能代码评审助手
功能亮点:
AI自动分析代码风格违规PEP8/ESLint规则
支持自定义评审规则模板。
使用路径:仓库设置 -> 代码评审 -> 启用AI助手
2. 资源配额可视化
监控指标:
实时显示仓库存储用量、流水线执行时长配额。
预警阈值设置(邮件/钉钉通知)。
访问路径:控制台 -> 资源监控
📞 支持与反馈
文档中心:访问帮助中心获取最新指南。
社区支持:
论坛提问GitLink开发者社区
紧急工单:登录后提交「在线支持」工单(响应时间<1小时
漏洞报告security@gitlink.org遵循漏洞披露政策
GitLink 团队
持续为开发者提供高效、安全的协作体验 🌟
本公告最终解释权归GitLink开源社区所有

View File

@ -9,19 +9,16 @@ sidebar_position: 2
平台提供了“新建”按钮,用户可以通过点击快速从零开始创建新的公开或者私有项目。
![创建首页](../../../static/img/quickstart/create_homepage.png)<br/>
![创建首页](/img/quickstart/create_homepage.png)
## 2. 填写项目信息
填写项目基本信息。
![](/img/quickstart/create_info.png)
![](../../../static/img/quickstart/create_info.png)<br/>
## 3. 创建成功
点击创建项目,创建成功后进入项目主页。
![](../../../static/img/quickstart/create_success.png)<br/>
![](/img/quickstart/create_success.png)

View File

@ -9,22 +9,19 @@ sidebar_position: 5
在首页选择**导入项目**
![](../../../static/img/quickstart/create_homepage.png)<br/>
![](/img/quickstart/import_homepage.png)
## 2. 填写信息
填写需要导入的第三方Git项目地址和项目信息如果导入项目为私有仓库则需输入目标平台用户token进行授权。
![](/img/quickstart/import_info.png)
![](../../../static/img/quickstart/import_info.png)<br/>
## 3. 授权验证
在使用GitLink平台导入其他平台如GitHub、Gitee的开源项目时如果项目为私有则无法通过正常途径导入需要输入对应平台有权限的token值进行校验。
![](../../../static/img/quickstart/import_verify.png)<br/>
![](/img/quickstart/import_verify.png)
下面将列举一些典型开源平台的token获取方式。
@ -35,7 +32,6 @@ sidebar_position: 5
2. 访问用户头像下的settings菜单
![img](https://forum.gitlink.org.cn/api/attachments/422328)
3. 访问最下方的Developer settings
@ -89,10 +85,8 @@ sidebar_position: 5
提示正在从第三方Git项目地址迁移
![](../../../static/img/quickstart/import_wait.png)<br/>
![](/img/quickstart/import_wait.png)
迁移成功则导入项目成功
![](../../../static/img/quickstart/import_success.png)<br/>
![](/img/quickstart/import_success.png)

View File

@ -5,21 +5,18 @@ sidebar_position: 3
# 提交第一行代码
## 1. 编辑代码
# 1. 编辑代码
点击编辑按钮,开始编辑代码。
![](/img/quickstart/first_edit.png)
![](../../../static/img/quickstart/first_edit.png)<br/>
## 2. 提交代码
# 2. 提交代码
在编辑框中编写代码,编写完成后填写变更信息后提交变更。
![](../../../static/img/quickstart/first_commit.png)<br/>
![](/img/quickstart/first_commit.png)
## 3. 代码更新成功
提交成功后代码更新成功。
![](../../../static/img/quickstart/first_success.png)<br/>
提交成功后代码代码更新成功。![](/img/quickstart/first_success.png)

View File

@ -0,0 +1,44 @@
---
sidebar_label: '搜索开源项目'
sidebar_position: 4
---
# 搜索开源项目
## 1. 开源项目页面介绍
项目”模块汇聚和管理了所有 GitLink 平台上的托管项目和镜像项目,用户可以输入项目名称关键字进行搜索,也可以根据项目类别对项目进行筛选。
进入“项目”模块,左侧列出了项目类型和项目类别。其中,项目类型主要包括开源托管项目和开源镜像项目两类。项目类别主要包括:云计算、大数据、区块链、物联网、机器学习、人工智能、智慧医疗、其他。
![](/img/quickstart/search_homepage.png)
右侧展示了所有项目的基本信息包括创建者、项目名、项目简介、浏览量、项目类别、更新时间、点赞数量、Fork 数量等信息用户可以通过关键字搜索查找特定的项目也可以按照更新时间、创建时间、Fork 数量、点赞数量等对项目进行排序。
![](/img/quickstart/search_list.png)
用户点击项目名称,即可进入到项目详情,查看和参与开源项目开发。
## 2. 搜索开源项目
有两处搜索框可以搜索
### 开源项目搜索框
搜索项目:
![](/img/quickstart/search_method1.png)
搜索结果:
![](/img/quickstart/search_result1.png)
### 菜单栏搜索框
搜索项目:
![](/img/quickstart/search_method2.png)
搜索结果:
![](/img/quickstart/search_result2.png)

View File

@ -18,9 +18,7 @@ GitLink默认疑修共有缺陷、功能、疑问、支持、任务、协助、
- **文档:** 表示文档材料补充;
- **测试:** 表示需要测试的需求;
- **重复:** 表示已存在类似的疑修。
![](/img/Issue/imageIssue14.png)
![](../../../static/img/Issue/imageIssue14.png)<br/>
另外,**项目成员**可以根据需求或习惯,进行标记含义或颜色标志的修改、新建标记和删除标记操作。
![](../../../static/img/Issue/imageIssue15.png)<br/>
![](/img/Issue/imageIssue15.png)

View File

@ -6,8 +6,8 @@ sidebar_position: 4
对于项目开发过程中创建的所有疑修,可以在**疑修(Issue)** 界面统一查看,如下图所示为[确实开源](https://www.gitlink.org.cn/Gitlink/forgeplus)项目下的疑修列表。
![](/img/Issue/imageIssue5.png)
![](../../../static/img/Issue/imageIssue5.png)<br/>
+ **创建疑修**:在疑修列表界面下,点击“**创建疑修**”按钮,同样可以创建疑修,具体见 ***疑修创建*** 一节;
+ **筛选疑修**:疑修列表支持不同条件筛选,包括发布人、标记(见 ***标记管理*** 一节)、里程碑(见 ***里程碑管理*** 一节),负责人、状态和开始/结束日期等;同时支持关键字搜索,以及按多种排序规则对疑修进行排序。

View File

@ -6,19 +6,16 @@ sidebar_position: 2
1. 进入需要发布疑修的项目的“**代码库**”界面,点击上方的“**+疑修**”按钮即可进入疑修发布界面,如下图所示:
![](../../../static/img/Issue/imageIssue2.png)<br/>
![](/img/Issue/imageIssue2.png)
2. 开始创建疑修,包括疑修标题、内容,输入疑修内容时既可以采用简单灵活的[Markdown语法](https://markdown.com.cn/),同时可以点击上方的功能按钮;然后上传需要的附件内容;最后点击“**创建**”按钮提交你的第一个疑修🎉🎉🎉
![](/img/Issue/imageIssue3.png)
![](../../../static/img/Issue/imageIssue3.png)<br/>
3. 此外,在创建疑修时,可以通过符号 **`#`** 快速添加需要引用的疑修,进而为当前疑修提供辅助的信息;如下图所示,键入 **`#`** 后会弹出可引用的疑修列表,通过鼠标下滑或者键盘输入疑修编号选择需要引用的疑修后,会自动添加引用疑修的链接🔗
![](/img/Issue/imageIssue6.png)
![](../../../static/img/Issue/imageIssue6.png)<br/>
![](/img/Issue/imageIssue7.png)
![](../../../static/img/Issue/imageIssue7.png)<br/>

View File

@ -6,8 +6,7 @@ sidebar_position: 3
**疑修**本质上是开发任务,而开发任务随着开发活动的进行,其状态也会发生改变,而“**状态**”便是用于跟踪记录开发活动的变更。如图所示GitLink中疑修的**状态**包括“新增”、“正在解决”、“已解决”、“关闭”和“拒绝“五类,用于表示开发任务的处理进度。
![](../../../static/img/Issue/imageIssue4.png)<br/>
![](/img/Issue/imageIssue4.png)
+ **新增**:新创建的疑修默认状态为“新增”;

View File

@ -6,8 +6,7 @@ sidebar_position: 1
**疑修Issue** 管理模块主要为项目组成员提供**开发任务**发布、指派、跟踪等功能服务。
![](../../../static/img/Issue/imageIssue1.png)<br/>
![](/img/Issue/imageIssue1.png)
**说明事项**

View File

@ -6,16 +6,13 @@ sidebar_position: 5
# 评论及操作记录
### 评论
每个疑修都相当于一个可以进度追踪的帖子,因此支持评论和回复,不仅仅是项目成员,所有人都可以在某个疑修下进行评论和回复,发表疑问或是见解,进行交流。
![](../../../static/img/Issue/imageIssue11.png)<br/>
![](/img/Issue/imageIssue11.png)
### 疑修声明
用户可以对任意疑修发布“疑修声明”,留言自己对于该疑修的解决思路。点击疑修详情右侧的“声明”后,可以编辑留言,编辑完成后点击“确认”即可发布声明,如下图所示:
![](/img/Issue/imageIssue12.png)
![](../../../static/img/Issue/imageIssue12.png)<br/>
### 操作记录
所有人都可以创建疑修,但是要注意,非项目成员仅可以修改自己创建的疑修,而项目成员有权限修改所有的疑修。
对于某个疑修的所有编辑操作,包括**创建疑修、添加负责人、移除负责人、更改状态、更改优先级、添加标记、移除标记、添加里程碑、移除里程碑、设置关联分支、移除关联分支、设置开始日期和设置结束日期**,均被记录在操作记录中。
![](../../../static/img/Issue/imageIssue13.png)<br/>
![](/img/Issue/imageIssue13.png)

View File

@ -12,19 +12,16 @@ sidebar_position: 7
项目成员可以基于以下步骤创建里程碑:
1. 进入目标项目的 **“里程碑”** 界面,此时界面所示为已创建的里程碑的列表,所有已创建里程碑分为 **“已关闭”** 和 **“开启中”** 两类;
2. 点击上方的 **“+创建里程碑”** 按钮即可进入里程碑创建界面;
![](../../../static/img/Issue/imageIssue16.png)<br/>
![](/img/Issue/imageIssue16.png)
3. 填写标题(必填)、描述(必填)、截止日期(选填)后,点击右下角的 **“创建里程碑”** 即可以完成一个新的里程碑的创建。
![](/img/Issue/imageIssue17.png)
![](../../../static/img/Issue/imageIssue17.png)<br/>
### 关联里程碑
项目成员可以将疑修关联到里程碑,从而使里程碑包含明确的疑修列表,主要步骤如下:
1. 在疑修列表中点击目标疑修;
2. 编辑“里程碑”属性,选择需要关联的里程碑。
![](../../../static/img/Issue/imageIssue18.png)<br/>
![](/img/Issue/imageIssue18.png)
### 其他操作
- **开启里程碑**
@ -33,8 +30,5 @@ sidebar_position: 7
- **删除里程碑**
上述操作均可以在里程碑列表中,对目标里程碑进行处理实现,如下图所示:
![](../../../static/img/Issue/imageIssue19.png)<br/>
![](../../../static/img/Issue/imageIssue20.png)<br/>
![](/img/Issue/imageIssue19.png)
![](/img/Issue/imageIssue20.png)

View File

@ -1,45 +1,40 @@
---
sidebar_label: 'WebIDE'
sidebar_position: 9
sidebar_label: 'WebIDE'
sidebar_position: 9
---
import VideoDemo from '../../../src/components/VideoDemo';
## WebIDE背景
传统的代码托管平台提供了代码仓库的 Git/SVN 的管理可以在平台上做代码浏览、代码评审、缺陷管理、CI 流水线等和代码相关的活动。其中代码浏览、代码评审所用的编辑器组件一般为 CodeMirror代码高亮使用 highlight.js常常只提供了读代码的场景。蚂蚁研发效能部门云研发团队通过自研的 OpenSumi 框架及基于 OpenSumi 框架做的专门针对于 Web IDE无远程容器场景的极速版 Web IDE 框架与内部代码托管平台碰撞出了创新型的、只依赖浏览器的、IDE 风格的代码阅读、代码编写、代码提交、代码运行、代码评审等场景,极大的提高了用户在代码托管平台阅读代码、代码评审、轻研发等场景的效率。本次蚂蚁研发效能云研发团队和 CCF中国计算机学会GitLink 代码托管平台合作,将内部极速版 Web IDE 应用到了 Gitlink 代码托管平台上,解决了长久以来的用户反馈的很多体验问题。
## Web IDE 核心能力
对标有容器的标准版,极速版 IDE 主要在读、写、运行、提交等方面进行了探索:
**1. 读:**
**1. 读:**
- a. 适配了多种代码托管平台,例如 Gitlink、Github、Gitlab 等代码托管平台,业务可以非常方便的使用代码服务的能力
- b. 内置了包括 Java、TS/JS、C++、Go、Python、Rust 等几十种常见语言的语法高亮支持
- c. 支持了如 Git Blame、GitGraph 等代码阅读辅助插件
**2. 写:**
**2. 写:**
- a. 支持 HTML/CSS/JS/Markdown 等在线语言服务能力,支持错误诊断能力
- b. 浏览器文件系统
**3. 运行:**
**3. 运行:**
- a. 支持基于 Skypack 的前端代码运行方案
- b. 支持基于 Pyodide 的 Python 运行
**4. 提交:**
**4. 提交:**
- a. 支持 WebSCM提供分支切换/新增、代码提交等能力
如果说以 CodeMirror、Monaco 为代表的浏览器 IDE 组件为 Web IDE 1.0,那拥有上述能力的极速版 Web IDE 就是 Web IDE 2.0。极速版 Web IDE 方案在蚂蚁内部与 2021 年 4 月上线,承接了代码阅读、代码评审、在线笔试、代码检查结果反馈、轻量在线研发等众多场景,同年 8 月 vscode.dev 和 github.dev 上线,与之相比,极速版 Web IDE 利用 OpenSumi 框架的高扩展性,业务可以更加深度的定制模块与插件,让业务有多的想象空间。
## 代码阅读
在代码托管平台上进行代码阅读时经常需要查看当前方法在哪里被引用、当前接口在哪里被实现,极速版 Web IDE 提供编辑器 + 插件的能力,解决了上述用户需求:
![](../../../static/img/di_san_fang/WebIDE/代码引用.png)<br/>
![](/img/di_san_fang/WebIDE/代码引用.png)
<center>代码引用查看</center>
Gitlink 通过实现 Blame 插件,完成了编辑器 Blame 查看的能力:
![](../../../static/img/di_san_fang/WebIDE/当前代码.png)<br/>
![](/img/di_san_fang/WebIDE/当前代码.png)
<center>当前代码行作者、修改日期查看</center>
@ -49,8 +44,7 @@ Gitlink 通过实现 Blame 插件,完成了编辑器 Blame 查看的能力:
- 1.语言服务缺失,阅读效率低:缺少代码高亮、提示、跳转、查看引用及大纲功能
- 2.大 PR 浏览体验不佳:统计显示 Gitlink PR 平均有 14-17 个变更文件,传统代码评审交互一般为代码 Diff 组件流式展示,对于一些变更文件多、文件内部较大的场景 Review 体验不佳,常常要等待很久。
- 3.代码修改流程重,耗时久:代码 Diff 组件只有读能力,无法快速修改一些拼写或 lint 错误,需要在本地找到对应文件后修改提交 针对于上述需求,蚂蚁云研发团队和 Gitlink 打造了 IDE 风格的代码评审场景:
![](../../../static/img/di_san_fang/WebIDE/IDE模式的代码评审.png)<br/>
![](/img/di_san_fang/WebIDE/IDE模式的代码评审.png)
<center>IDE模式的代码评审</center>
- 1.变更树 a. 提供平铺和树状两种浏览方式 b. 变更树使用 OpenSumi Recycle 组件,对于大 PR 也能通过虚拟滚动高性能的查看变更文件
@ -58,41 +52,16 @@ Gitlink 通过实现 Blame 插件,完成了编辑器 Blame 查看的能力:
- 3.编辑器 a. 通过 monaco fold 能力完成非变更内容的折叠 b. 自定义评论组件嵌入编辑器
- 4.插件 a. 复用代码浏览 Blame 插件能力进行代码行 Git 信息查看 除了上述能力Gitlink 还支持了在代码评审时快速修改代码:
![](../../../static/img/di_san_fang/WebIDE/代码评审.png)<br/>
![](/img/di_san_fang/WebIDE/代码评审.png)
<center>代码评审时可修改代码</center>
## WebIDE 功能演示
下面是 GitLink WebIDE 的功能演示视频,通过观看视频,您可以直观地了解如何使用 WebIDE 进行代码浏览、编辑和提交等操作。
<VideoDemo
title="GitLink WebIDE 使用教程"
platform="bilibili"
videoId="BV1Hkr7YYEh8"
options={{
showTips: false
}}
/>
### 在线运行演示
<VideoDemo
title="WebIDE 在线运行演示"
platform="bilibili"
videoId="BV15a411o72i"
options={{ showTips: true }}
/>
## Gitlink Web IDE
Gitlink 代码阅读场景虽然接入极速版 IDE 编辑器但文件树、代码搜索、快捷键、IDE 皮肤、等均和平时开发时使用习惯的 IDE 差异较大,更有大部分用户仅仅是为了代码阅读将代码克隆到本地,尽管保证了一致的体验,但整个链路繁琐费时。
基于这个洞察,蚂蚁云研发团队和 Gitlink 推出 Gitlink Web IDE可以一键快速打开 Web IDE 访问阅读项目仓库代码,实现项目与 IDE 的无缝衔接,保持研发同学的日常偏好习惯,同时完美兼容 Gitlink 代码托管平台。更重要的是,通过无容器在浏览器上直接运行一个极速版 IDE确保「秒开」的即时体验。
#### **1. 快速体验**
从 Gitlink 仓库首页 Web IDE 入口即可体验
![](../../../static/img/di_san_fang/WebIDE/WebIDE入口.png)<br/>
![](/img/di_san_fang/WebIDE/WebIDE入口.png)
<center>Gitlink WebIDE 入口</center>
#### **2. 代码浏览体验**
@ -100,64 +69,54 @@ Gitlink 代码阅读场景虽然接入极速版 IDE 编辑器,但文件树、
#### **3. 语言功能**
- 1.支持近 40 种语言的语法高亮
- 2.支持 JavaScript/TypeScript、HTML、CSS、JSON、Markdown 的基于 LSP (Language Server Protocol) 语言特性功能,具备智能提示和大纲信息以及单文件内跳转。
![](../../../static/img/di_san_fang/WebIDE/JS语言服务提示.png)<br/>
![](/img/di_san_fang/WebIDE/JS语言服务提示.png)
<center>JS语言服务提示</center>
- 3.提供了 Java、Go、Python、C++、Php 的在线语言服务能力,支持简单的定义跳转、查找引用等功能,让大家更加方便的阅读代码
- 3. 提供了 Java、Go、Python、C++、Php 的在线语言服务能力,支持简单的定义跳转、查找引用等功能,让大家更加方便的阅读代码
![](../../../static/img/di_san_fang/WebIDE/python查看引用.png)<br/>
![](/img/di_san_fang/WebIDE/python查看引用.png)
<center>Python 查看引用</center>
#### **4. 分支新建与切换**
点击左下角分支名即可新建/切换分支。
![](../../../static/img/di_san_fang/WebIDE/分支新建.png)<br/>
![](/img/di_san_fang/WebIDE/分支新建.png)
<center>分支新建与切换</center>
#### **5. 文件搜索**
使用 CMD/Ctrl + P 唤起文件搜索面板
![](../../../static/img/di_san_fang/WebIDE/文件搜索.png)<br/>
![](/img/di_san_fang/WebIDE/文件搜索.png)
<center>文件搜索面板</center>
#### **6. 行高亮**
持单行或多行高亮,点击行号即可高亮行,按住 Shift 可选中连续多行。
![](../../../static/img/di_san_fang/WebIDE/多选行高亮.png)<br/>
![](/img/di_san_fang/WebIDE/多选行高亮.png)
<center>多选行高亮</center>
#### **7. Blame**
支持查看单行 blame 信息hover 后可展示详细信息。
![](../../../static/img/di_san_fang/WebIDE/Blame详细信息.png)<br/>
![](/img/di_san_fang/WebIDE/Blame详细信息.png)
<center>Blame详细信息</center>
#### **8. Graph**
支持 graph 视图,可查看分支 commits 历史以及每个 commit 详细文件变更,并支持文件 diff 查看。底部状态栏左下角点击 Git Graph 或在命令面板输入 View Git Graph即可打开 Git Graph 视图。
![](../../../static/img/di_san_fang/WebIDE/Graph.png)<br/>
![](/img/di_san_fang/WebIDE/Graph.png)
<center>Graph 详细信息</center>
#### **9.WebSCM**
对于开发来说日常多个需求并行开发是非常常见的事,经常修改一些很小但必要的逻辑,而也许你本地环境已经在开发下一个需求,频繁的分支切换并行修改又容易出错。通过 Gitlink Web IDE 极速切换分支修改提交一气呵成,无需打断本地开发流程。
![](../../../static/img/di_san_fang/WebIDE/WebSCM.png)<br/>
![](/img/di_san_fang/WebIDE/WebSCM.png)
<center>WebSCM</center>
#### **10.代码在线运行**
目前如果在没有容器的情况下大部分应用只能运行前端代码。Gitlink Web IDE 集成了基于 skypack 的更加轻量的 CodeSwing 插件,可以在极速版去运行前端代码,并且代码版本是使用 Gitlink 来管理。结合上述 WebSCM 能力,甚至能在一分钟完成前端代码初始化、编写、预览和代码提交。
![](../../../static/img/di_san_fang/WebIDE/前端代码.png)<br/>
![](/img/di_san_fang/WebIDE/前端代码.png)
<center>前端代码运行</center>
随着 Webassembly 技术的发展,一些后端语言也可以运行在浏览器里,在 2021 年 Google IO 大会上StackBlitz 展示了他们最近做的技术WebContainer该能力可以将语言运行时编译为 Webassembly 从而运行在浏览器上。Code-Runner-For-Web 插件结合 Pyodide已经将 Python 的运行搬到了浏览器上,新版极速版也默认集成了该插件。
![](../../../static/img/di_san_fang/WebIDE/Python代码运行.png)<br/>
<center>Python代码运行</center>
![](/img/di_san_fang/WebIDE/Python代码运行.png)
<center>Python代码运行</center>

View File

@ -62,6 +62,6 @@ sidebar_position: 1
## 用户操作流程
![](../../../static/img/di_san_fang/重晴鸟代码溯源/用户操作流程(新).png)<br/>
![](../../../static/img/di_san_fang/重晴鸟代码溯源/用户操作流程.png)<br/>
<center>用户操作流程</center><br/>

View File

@ -6,27 +6,26 @@ sidebar_position: 2
*https://www.gitlink.org.cn* 页面点击顶部导航栏的“+”符号可以进行组织新建操作。
![](../../../static/img/Org/imageOrg1.png)<br/>
![](/img/Org/imageOrg1.png)
在新建页面中输入**组织账号**、**组织名称**、**组织描述**、**所在地区**、**可见性**以及**组织头像**等信息后,点击“**创建组织**”按钮完成组织的创建。
![](/img/Org/imageOrg2.png)
![](../../../static/img/Org/imageOrg2.png)<br/>
## 组织账号
![](/img/Org/imageOrg4.png)
![](../../../static/img/Org/imageOrg4.png)<br/>
**注**只能使用以字母、数字开头包含字母、数字、下划线、横杠等长度4到20个字符
## 组织名称与组织描述
![](../../../static/img/Org/imageOrg5.png)<br/>
![](/img/Org/imageOrg5.png)
**注**:此处为必填项,不得为空
## 可见性
![](../../../static/img/Org/imageOrg3.png)<br/>
![](/img/Org/imageOrg3.png)
**注**:可见性预设三类组织:公开、受限(仅对登录用户可见)、私有(仅对组织成员可见)。

View File

@ -9,26 +9,26 @@ sidebar_position: 3
在团队新建页面,输入团队标识、团队名称、团队描述、项目权限以及版本库权限等信息后,点击“新建团队”完成团队的创建。
![](/img/Org/imageOrg9.png)
![](../../../static/img/Org/imageOrg9.png)<br/>
## 查看组织团队
点击组织信息页面中的某个团队名称可以查看该团队的详细信息,该页面包括团队的名称、描述等信息,此外还会列出该团队关联的成员以及项目。
![](/img/Org/imageOrg8.png)
![](../../../static/img/Org/imageOrg8.png)<br/>
## 管理组织团队
点击团队信息页面中的“团队设置”按钮可以对团队进行管理
- 基本设置:修改项目的基本信息,如名称和描述等。
![](/img/Org/imageOrg10.png)
![](../../../static/img/Org/imageOrg10.png)<br/>
- 团队成员管理:为该团队添加新成员或者移除已有成员。
![](/img/Org/imageOrg11.png)
![](../../../static/img/Org/imageOrg11.png)<br/>
- 团队项目管理:为该团队关联新项目(该组织已经创建的项目)或者移除已关联项目。
![](../../../static/img/Org/imageOrg12.png)<br/>
![](/img/Org/imageOrg12.png)

View File

@ -1,22 +1,4 @@
---
sidebar_label: '组织成员管理'
sidebar_position: 4
---
# 成员管理Members Management
在 个人所管理的项目当中的**仓库设置**当中的**成员管理**可以进入成员管理界面
![](../../../static/img/Org/imageOrg13.png)<br/>
## 成员查询和添加
在成员管理界面当中,可以进行组织成员的查询和添加
![](../../../static/img/Org/imageOrg14.png)<br/>
## 成员邀请权限设置
管理员可以对邀请成员的权限进行设置
![](../../../static/img/Org/imageOrg15.png)<br/>
此外,也可以复制邀请链接的方式来更方便地邀请成员加入到项目当中来
**注**:此项功能仅对管理员可见
---

View File

@ -3,14 +3,14 @@ sidebar_label: '组织简介'
sidebar_position: 1
---
## 组织简介
# 组织简介
组织是共享帐户,其中业务和开源项目可同时跨多个项目进行协作,具有复杂的安全性和管理功能。多个个人帐户可以通过加入同一组织帐户来协作处理共享项目。
您的团队可以通过使用组织帐户在 GitLink 上进行协作,组织帐户充当共享工作的容器,并为工作赋予独特的名称和品牌。同时,平台支持组织在“组织详情”页面发布新闻动态,显示项目概览和仓库详情等内容
![](/img/Org/imageOrg6.png)
![](../../../static/img/Org/imageOrg6.png)<br/>
## 作为组织拥有者
有效管理组织,是您的使命。
@ -19,8 +19,8 @@ sidebar_position: 1
为了简化访问管理并增强协作,您可以创建能体现组结构的嵌套团队。您可以根据他们的角色或项目将人员分组,并分配任务。
![](/img/Org/imageOrg7.png)
![](../../../static/img/Org/imageOrg7.png)<br/>
平台同时支持组织拥有者管理对数据访问的自定义设置。
## 作为组织成员

View File

@ -6,6 +6,7 @@ sidebar_position: 5
点击组织信息页面中的“新建项目”按钮可以创建属于该组织的托管项目或者镜像项目。
![](/img/Org/imageOrg13.png)
![](../../../static/img/Org/imageOrg13.png)<br/>
**注**:在“拥有者”一栏的下拉选项中,可以选择:个人、组织、团队

View File

@ -1,16 +1,4 @@
---
sidebar_label: '模板导入及导出'
sidebar_position: 2
---
# 确实开源帮助中心
## 模板的导入及导出管理
#### 1.模板导入
通过点击wiki界面的**导入模板**按钮即可导入本地的txtmarkdown等格式文件进行Wiki文档的创建当前平台此项功能尚在开发测试环节
![](../../../static/img/wiki/img4.png)<br/>
#### 2.模板导出
当前平台此项功能尚在开发测试环节
<br/>
---

View File

@ -1,25 +1,4 @@
---
sidebar_label: '维基页面管理'
sidebar_position: 1
---
# 确实开源帮助中心
## 维基界面管理
#### 1.维基界面
GitLink项目安排了专门的**维基(Wiki)界面**来展示项目的一些情况
![](../../../static/img/wiki/img1.png)<br/>
#### 2.创建维基内容
在初始化的维基界面当中点击**创建Wiki文档**或者**导入模板**即可进行Wiki文档的编辑
<br/>
#### 3.进行Wiki文档的编辑
点击**创建Wiki文档**后即跳转到编辑界面,初始内容为空白的文档
![](../../../static/img/wiki/img3.png)<br/>
也可以通过勾选*添加模板*来进行模板的导入,平台提供的模板包括*周报*和*月报*的格式
![](../../../static/img/wiki/img2.png)<br/>
完成编辑后点击左下角的的保存即可
---

Some files were not shown because too many files have changed in this diff Show More