Compare commits

...

124 Commits
main ... king

Author SHA1 Message Date
fengyujue e85f29aeb4 feat: .devops/未命名项目.yml
1 month ago
feng fc02d3107e
update package.json.
2 months ago
fengyujue 27fac0685a Update package.json
2 months ago
feng 34e2a6f6d2
update package.json.
2 months ago
feng 949ac8c8eb
update package.json.
2 months ago
fengyujue a203ba9c1f Update package.json
2 months ago
feng fdf819757f
update package.json.
2 months ago
feng b3e3fabeb5
update package.json.
2 months ago
feng 9b66afe68a
update package.json.
2 months ago
feng 4c117beaab
update package.json.
2 months ago
zzzzzyh 856f81df29 Update package.json
2 months ago
fengyujue 656ba585f3 Update 注册GitLink账号.md
2 months ago
ReoSkadi 46205e3ab9 123
2 months ago
zhouzhejia 3490b7f029 Update 组织成员管理.md
2 months ago
pfqgauxfb c6b6b2a109 feng
2 months ago
pfqgauxfb 481100687b feng
2 months ago
pfqgauxfb be14099289 feng
2 months ago
pfqgauxfb a80b13901d feng
2 months ago
pfqgauxfb cb90fd41b0 feng
2 months ago
pfqgauxfb da271a45ae feng
2 months ago
pfqgauxfb 2f28719e38 feng
2 months ago
pfqgauxfb a49cdf682e feng
2 months ago
pfqgauxfb b98abe886f feng
2 months ago
pfqgauxfb faf4222020 feng
2 months ago
pfqgauxfb 76c106bf53 feng
2 months ago
pfqgauxfb 39deb5e072 feng
2 months ago
pfqgauxfb b86dda189d feng
2 months ago
pfqgauxfb 2f7e0439c9 feng
2 months ago
pfqgauxfb 69f1ebf775 feng
2 months ago
pfqgauxfb 14957d1ad4 feng
2 months ago
pfqgauxfb 3c6d3e943a feng
2 months ago
pfqgauxfb 7690adac20 feng
2 months ago
pfqgauxfb 87eeb1a7c0 feng
2 months ago
pfqgauxfb 7ed6d428d9 feng
2 months ago
pfqgauxfb ba0a06136e feng
2 months ago
pfqgauxfb 2f116c4b4f feng
2 months ago
pfqgauxfb 620ca67caa feng
2 months ago
pfqgauxfb dc94d43538 feng
2 months ago
pfqgauxfb a134f85b10 feng
2 months ago
pfqgauxfb 6d2cd1c295 feng
2 months ago
pfqgauxfb 5121b71bfc feng
2 months ago
pfqgauxfb baa6af0cc3 feng
2 months ago
pfqgauxfb 510e1e0b8f feng
2 months ago
pfqgauxfb 375e18b206 feng
2 months ago
pfqgauxfb 0c69f446f8 feng
2 months ago
pfqgauxfb d4a36b6b19 feng
2 months ago
pfqgauxfb e9ad55b137 feng
2 months ago
zhouzhejia 85023d6df3 Merge pull request '1' (#5) from zhouzhejia into master
2 months ago
zhouzhejia 6b970d4f3b Update 通知设置.md
2 months ago
zhouzhejia 8c1feb73f2 Update 通知设置.md
2 months ago
pfqgauxfb 7f1bf457e5 feng
2 months ago
pfqgauxfb 0f6559b8d7 feng
2 months ago
pfqgauxfb 775136ffa3 feng
2 months ago
pfqgauxfb d665adbe35 feng
2 months ago
pfqgauxfb c6b1177f72 feng
2 months ago
pfqgauxfb 8ea1899218 feng
2 months ago
pfqgauxfb f69f74f594 feng
2 months ago
pfqgauxfb 8847aa7198 feng
2 months ago
fengyujue f7181a9235 docker
2 months ago
fengyujue 7c79d9ffc0 refactor: .devops/feng.yml
2 months ago
fengyujue 09db624b06 Update Dockerfile
2 months ago
fengyujue 69847f82a0 Update Dockerfile
2 months ago
fengyujue edc2fb952f Update Dockerfile
2 months ago
fengyujue 3ed0e19f31 Update Dockerfile
2 months ago
fengyujue 48dc528398 Update Dockerfile
2 months ago
fengyujue cfb9c7c111 Update Dockerfile
2 months ago
fengyujue b1eeac0acf Update Dockerfile
2 months ago
fengyujue 877cde3f82 Update Dockerfile
2 months ago
fengyujue ce3c34556e Update Dockerfile
2 months ago
fengyujue 93e59a14b9 Update Dockerfile
2 months ago
ReoSkadi 4759fe4d28 Merge pull request '疑修修改' (#2) from ReoSkadi/gitlink_help_center:master into master
2 months ago
fengyujue 5403ecf2fd refactor: .devops/feng.yml
2 months ago
zzzzzyh 63f9a443dd 解决疑修问题
2 months ago
zzzzzyh bf4e36fd04 修改疑修
2 months ago
ReoSkadi 8bf72069f5 鸡哥太强了
2 months ago
ReoSkadi ce40ca84b8 鸡哥牛逼
2 months ago
fengyujue 7fb917e071 refactor: .devops/feng.yml
2 months ago
fengyujue 13f9e9a8bd refactor: .devops/feng.yml
2 months ago
fengyujue fdedb16346 refactor: .devops/feng.yml
2 months ago
fengyujue 99fee2d869 refactor: .devops/feng.yml
2 months ago
fengyujue 5784be40c5 refactor: .devops/feng.yml
2 months ago
fengyujue 0d79380794 refactor: .devops/feng.yml
2 months ago
fengyujue ceb5be3ea5 refactor: .devops/feng.yml
2 months ago
fengyujue 98cf4f6fa5 refactor: .devops/feng.yml
2 months ago
fengyujue 9b948cb095 refactor: .devops/feng.yml
2 months ago
fengyujue 3f1a95ac9a refactor: .devops/feng.yml
2 months ago
fengyujue 6a3a54f33a feat: .devops/feng.yml
2 months ago
fengyujue 5c93b16865 refactor: .devops/流水线.yml
2 months ago
fengyujue 677f6d76a3 refactor: .devops/流水线.yml
2 months ago
fengyujue 255555e5cd refactor: .devops/流水线.yml
2 months ago
fengyujue c925b89030 refactor: .devops/流水线.yml
2 months ago
fengyujue f2573a0f14 refactor: .devops/流水线.yml
2 months ago
fengyujue 48ab97b6ee refactor: .devops/流水线.yml
2 months ago
fengyujue 72dcad6c60 refactor: .devops/流水线.yml
2 months ago
fengyujue 184d493fd4 ADD file via upload
2 months ago
fengyujue c609fb8673 refactor: delete .devops/helper.yml
2 months ago
fengyujue 374e26eeac feat: .devops/流水线.yml
2 months ago
fengyujue 6067435fcf refactor: delete .devops/未命名项目.yml
2 months ago
fengyujue f8d14203c8 refactor: .devops/未命名项目.yml
2 months ago
fengyujue 6b72047c6c refactor: .devops/未命名项目.yml
2 months ago
fengyujue fbed280614 refactor: .devops/未命名项目.yml
2 months ago
fengyujue 5b6f75850d refactor: .devops/未命名项目.yml
2 months ago
fengyujue 32eb9fc0e4 refactor: .devops/未命名项目.yml
2 months ago
fengyujue ad342ff88c refactor: .devops/未命名项目.yml
2 months ago
fengyujue 8811c6be21 refactor: .devops/未命名项目.yml
2 months ago
fengyujue 1a0bc92051 refactor: .devops/未命名项目.yml
2 months ago
fengyujue d052f3ec3e refactor: .devops/未命名项目.yml
2 months ago
zhouzhejia 5aa7149805 Update 组织创建及设置.md
2 months ago
fengyujue 792009a3f7 refactor: .devops/未命名项目.yml
2 months ago
fengyujue 41a73aa2cc feat: .devops/未命名项目.yml
2 months ago
zzzzzyh 0dc560a630 Merge branch 'master' of https://gitlink.org.cn/fengyujue/gitlink_help_center
2 months ago
zzzzzyh 341c4db025 合并部分中图片路径问题
2 months ago
fengyujue fd47561fb5 refactor: .devops/helper.yml
2 months ago
fengyujue 0759b9c22e refactor: .devops/helper.yml
2 months ago
fengyujue 191e58d1ac refactor: .devops/helper.yml
2 months ago
fengyujue 4450695560 refactor: .devops/helper.yml
2 months ago
fengyujue ae4854bbd4 refactor: .devops/helper.yml
2 months ago
fengyujue c9457f7f68 feat: .devops/helper.yml
2 months ago
fengyujue 846783844c refactor: delete .devops/未命名项目.yml
2 months ago
fengyujue d239e4e8d0 refactor: .devops/未命名项目.yml
2 months ago
fengyujue 9835107084 refactor: delete .devops/helper.yml
2 months ago
fengyujue e7369befaa feat: .devops/helper.yml
2 months ago
fengyujue 3795352762 编辑功能
2 months ago
fengyujue 0575395cb1 Update README.md
2 months ago

@ -0,0 +1,62 @@
version: 2
name: feng
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: ((user.name))
password: ((mima.mima))
remote_url: '"https://gitlink.org.cn/fengyujue/gitlink_help_center.git"'
ref: '"refs/heads/master"'
commit_id: '""'
depth: 1
needs:
- start
- ref: end
name: 结束
task: end
needs:
- ssh_cmd_0
- ref: docker_image_build_0
name: docker镜像构建
task: docker_image_build@1.6.0
input:
docker_username: ((docker.name))
docker_password: ((docker.mima))
image_name: '"crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink"'
image_tag: '"latest"'
registry_address: '"crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.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.password))
ssh_ip: '"120.27.137.186"'
ssh_port: '"22"'
ssh_user: '"root"'
ssh_cmd: '"docker stop group8 || true && docker rm group8 || true && docker pull
crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink:latest
&& docker run -d -p 3000:3000 --name group8
crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink:latest"'
needs:
- docker_image_build_0

@ -16,47 +16,39 @@ workflow:
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"'
remote_url: '""'
ref: '"refs/heads/master"'
commit_id: '""'
depth: 1
needs:
- start
- ref: end
name: 结束
task: end
needs:
- ssh_cmd_0
- ref: ssh_cmd_0
name: ssh执行命令
task: ssh_cmd@1.1.1
input:
ssh_ip: '""'
ssh_port: '"22"'
ssh_user: '"root"'
ssh_cmd: '""'
needs:
- docker_image_build_0
- 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_name: '""'
image_tag: '"latest"'
registry_address: '"registry.cn-guangzhou.aliyuncs.com"'
registry_address: '""'
docker_file: '"Dockerfile"'
docker_build_path: '"."'
workspace: git_clone_0.git_path
workspace: '"."'
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

@ -0,0 +1,63 @@
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: ((user.name))
password: ((mima.mima))
remote_url: '"https://gitlink.org.cn/fengyujue/gitlink_help_center.git"'
ref: '"refs/heads/wangfengzhi"'
commit_id: '""'
depth: 1
needs:
- start
- ref: end
name: 结束
task: end
needs:
- ssh_cmd_0
- ref: docker_image_build_0
name: docker镜像构建
task: docker_image_build@1.6.0
input:
docker_username: ((docker.name))
docker_password: ((docker.mima))
image_name: '"crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink"'
image_tag: '"latest"'
registry_address: '"crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.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.password))
ssh_ip: '"120.27.137.186"'
ssh_port: '"22"'
ssh_user: '"root"'
ssh_cmd: docker stop gitlink_help_center || true && docker rm
gitlink_help_center || true && docker pull
crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink:latest;
docker run -d -p 3000:3000 --name gitlink_help_center
crpi-ybi767umyzh9owc0.cn-hangzhou.personal.cr.aliyuncs.com/help-center-gitlink/gitlink_help_gitlink:latest
needs:
- docker_image_build_0

@ -4,7 +4,7 @@
#### 1.复刻主仓库
![](https://gitlink.org.cn/api/attachments/412462)
<br/>
//编辑实验
#### 2.进入复刻仓库编辑文档
![](https://gitlink.org.cn/api/attachments/412465)

@ -6,17 +6,17 @@ slug: /
---
# 关于GitLink
GitLink确实开源是CCF官方指定的开源创新服务平台旨在以“为开源创新服务”为使命,以“成为开源创新的汇聚地”为愿景,秉承“创新、开放、协作、共享”的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!
GitLink确实开源是CCF官方指定的开源创新服务平台旨在以"为开源创新服务"为使命,以"成为开源创新的汇聚地"为愿景,秉承"创新、开放、协作、共享"的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!
![](/img/ccf_gitlink.png)
# 平台功能
- **分布式协作开发**:支持在线文件编辑、分支管理、贡献统计、仓库复刻、合并请求;
- **一站式过程管理**支持疑修、里程碑、通知提醒、标签归档、Wiki文档、组织管理
- **高效流水线运维**:提供轻量级工作流引擎,并支持自定义配置、静态扫描、制品构建;
- **多层次代码分析**:支持代码溯源分析、许可证风险分析、开源漏洞检测和加固建议;
- **多维度用户画像**:支持开发活动统计、贡献日历、能力建模、角色与专业定位分析。
- **分布式协作开发**:支持[在线文件编辑](/代码库管理/仓库创建)[分支管理](/代码库管理/分支管理)[贡献统计](/个人主页建站/建站流程)[仓库复刻](/代码库管理/仓库复刻)[合并请求](/合并请求/合并请求简介)
- **一站式过程管理**:支持[疑修](/疑修/疑修简介)[里程碑](/代码库管理/里程碑)[通知提醒](/通知/通知简介)[标签归档](/代码库管理/标签管理)[Wiki文档](/维基/模板导入及导出)[组织管理](/组织管理/组织简介)
- **高效流水线运维**:提供[轻量级工作流引擎](/DevOps引擎/引擎简介),并支持[自定义配置](/DevOps引擎/工作流配置)[静态扫描](/DevOps引擎/静态扫描)[制品构建](/DevOps引擎/制品构建)
- **多层次代码分析**:支持[代码溯源分析](/代码库管理/代码分析)[许可证风险分析](/代码库管理/许可证分析)[开源漏洞检测](/代码库管理/漏洞检测)[加固建议](/代码库管理/安全加固)
- **多维度用户画像**:支持[开发活动统计](/个人主页建站/建站流程)[贡献日历](/个人主页建站/建站流程)[能力建模](/个人主页建站/建站流程)[角色与专业定位分析](/个人主页建站/建站流程)
# 帮助文档
帮助文档有助于您全面了解GitLink平台让我们一起为开源创新贡献力量

@ -21,7 +21,7 @@ sidebar_position: 9
![](../../static/img/代码库管理/WebIDE/WebIDE搜索.png)<br/>
### **5. 行高亮**
支持单行或多行高亮,点击行号即可高亮行,按住 Shift 可选中连续多行。
支持单行或多行高亮,点击行号即可高亮行,按住 Shift 可选中连续多行,但只能从第一次选择的高亮行连续对前面或后面的行选中,无法间隔选中,同时在进行取消高亮时只能重新进行高亮行的选择,无法主动取消
![](../../static/img/代码库管理/WebIDE/WebIDE行高亮.png)<br/>
### **6. Blame**

@ -1,4 +1,5 @@
{
"label": "合并请求(PR)",
"position": 5
"label": "合并请求",
"position": 2,
"className": "merge-request"
}

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

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

@ -1,6 +1,67 @@
---
sidebar_label: '合并请求关联疑修'
sidebar_position: 5
id: merge-request-issue
title: 合并请求关联疑修
sidebar_label: '合并请求关联疑修'
sidebar_position: 5
---
# 合并请求关联疑修
# 合并请求关联疑修
## 功能介绍
合并请求关联疑修功能允许您在创建或编辑合并请求时,将相关的疑修与合并请求建立关联。这样可以帮助团队成员更好地追踪代码变更与疑修之间的关系,提高开发效率。
## 如何关联疑修
### 方法一:在合并请求描述中引用
1. 在创建或编辑合并请求时,在描述中使用 `#` 符号引用疑修编号
2. 例如:`修复 #123 中提到的登录问题`
3. 系统会自动识别并建立关联
### 方法二:在疑修详情页关联
1. 打开疑修详情页面
2. 点击"关联合并请求"按钮
3. 选择要关联的合并请求
4. 确认关联
## 关联后的效果
1. 在疑修详情页面可以看到关联的合并请求列表
2. 在合并请求详情页面可以看到关联的疑修信息
3. 当合并请求被合并时,系统会自动更新疑修状态
4. 可以通过关联关系快速追踪代码变更
## 管理关联关系
### 查看关联
1. 在疑修详情页面的"关联合并请求"部分查看
2. 在合并请求详情页面的"关联疑修"部分查看
### 解除关联
1. 在疑修详情页面:
- 找到要解除关联的合并请求
- 点击"解除关联"按钮
- 确认操作
2. 在合并请求详情页面:
- 找到要解除关联的疑修
- 点击"解除关联"按钮
- 确认操作
## 最佳实践
1. 在创建合并请求时,及时关联相关的疑修
2. 使用清晰的描述说明合并请求与疑修的关系
3. 定期检查关联关系,确保其准确性
4. 在合并请求被合并后,及时确认疑修状态
## 注意事项
1. 一个合并请求可以关联多个疑修
2. 一个疑修可以关联多个合并请求
3. 关联关系建立后可以随时修改
4. 解除关联不会影响已合并的代码变更

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

@ -1,4 +1,5 @@
{
"label": "平台公告",
"position": 99
"position": 1,
"className": "platform-announcement"
}

@ -1,4 +1,87 @@
---
sidebar_label: '平台公告'
sidebar_position: 1
---
id: platform-announcement
title: 平台公告
sidebar_label: '平台公告'
sidebar_position: 1
---
# 平台公告
## 功能介绍
平台公告功能允许管理员发布和管理平台相关的通知、更新和重要信息。通过平台公告,可以及时向用户传达重要信息,确保用户了解平台的最新动态。
## 创建平台公告
1. 进入平台公告管理页面
2. 点击"新建公告"按钮
3. 填写公告标题和内容
4. 设置公告类型和优先级
5. 选择发布范围
6. 点击"发布"按钮
## 公告类型
平台公告支持以下类型:
- 系统更新:平台功能更新和系统维护通知
- 功能发布:新功能发布和功能介绍
- 活动通知:平台活动、比赛和培训通知
- 重要提醒:安全提醒和重要政策变更
- 其他通知:其他类型的平台通知
## 公告管理
### 编辑公告
1. 在公告列表中找到要编辑的公告
2. 点击"编辑"按钮
3. 修改公告内容
4. 点击"保存"按钮
### 删除公告
1. 在公告列表中找到要删除的公告
2. 点击"删除"按钮
3. 确认删除操作
### 公告状态
公告可能处于以下状态:
- 草稿:未发布的公告
- 已发布:正在显示的公告
- 已过期:超过显示期限的公告
- 已归档:已归档的公告
## 公告显示
### 显示位置
1. 平台首页公告栏
2. 用户个人中心
3. 相关功能页面
### 显示规则
1. 按优先级排序显示
2. 按发布时间倒序排列
3. 支持置顶显示
4. 支持定时发布和自动过期
## 最佳实践
1. 公告标题要简洁明了
2. 内容要清晰易懂
3. 重要信息要突出显示
4. 及时更新和删除过期公告
5. 合理设置公告优先级
6. 注意公告的时效性
## 注意事项
1. 公告内容要符合平台规范
2. 避免发布重复或过时的信息
3. 重要公告要及时通知用户
4. 定期清理过期公告
5. 注意公告的权限管理

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

@ -7,7 +7,6 @@ sidebar_position: 1
## 1. 点击**立即注册**按钮
![](/img/quickstart/register_homepage.png)
## 2. 填写注册信息

@ -0,0 +1 @@
<center>该功能无法使用</center><br/>

@ -65,3 +65,8 @@ sidebar_position: 1
![](../../static/img/di_san_fang/重晴鸟代码溯源/用户操作流程(新).png)<br/>
<center>用户操作流程</center><br/>
## 实际使用
<center>实际使用中该功能并不能使用,点击同意后没有反应</center><br/>

@ -16,7 +16,7 @@ sidebar_position: 2
![](/img/Org/imageOrg4.png)
**注**只能使用以字母、数字开头包含字母、数字、下划线、横杠等长度4到20个字符
**注**只能使用以字母、数字开头包含字母、数字、下划线、横杠等长度4到40个字符
## 组织名称与组织描述

@ -18,4 +18,5 @@ sidebar_position: 4
![](/img/Org/imageOrg15.png)
此外,也可以复制邀请链接的方式来更方便地邀请成员加入到项目当中来
**注**:此项功能仅对管理员可见
**注**:此项功能仅对管理员可见
实际使用中该项功能无此文本

@ -3,7 +3,7 @@ sidebar_label: '组织简介'
sidebar_position: 1
---
# 组织简介
## 组织简介
组织是共享帐户,其中业务和开源项目可同时跨多个项目进行协作,具有复杂的安全性和管理功能。多个个人帐户可以通过加入同一组织帐户来协作处理共享项目。

@ -18,4 +18,18 @@ sidebar_position: 2
#### 2.进行通知设置
通过“通知管理”可以对接受通知的方式进行设置,默认所有通知都是通过站内信的方式接受,可以通过勾选为重要的通知类型增加邮件接受方式。
![](/img/notice/notice_set.png)
![](/img/notice/notice_set.png)
我创建的或我负责的
疑修状态变更 √站内信 邮件
合并请求状态变更 √站内信 邮件
疑修截止日期到达最后一天 √站内信 邮件
里程碑逾期提醒 √站内信 ×邮件
我管理的仓库
有新的疑修 √站内信 邮件
有新的合并请求 √站内信 邮件
有成员变动 √站内信 邮件
仓库设置被更改 √站内信 邮件
被点赞 √站内信 ×邮件
被fork √站内信 ×邮件
有新的里程碑 √站内信 邮件
有里程碑已完成 √站内信 邮件

@ -151,7 +151,7 @@ module.exports = {
'@docusaurus/preset-classic',
{
docs: {
// sidebarPath: require.resolve('./sidebars.js'),
sidebarPath: require.resolve('./sidebars.js'),
editUrl:'https://www.gitlink.org.cn/Gitlink/gitlink_help_center/tree/master/',
routeBasePath: "/",
},

@ -44,3 +44,8 @@
"node": ">=14.18.1 <=18.x"
}
}
//gitee
//gite454

@ -2,8 +2,346 @@ module.exports = {
DocsSidebar: [
{
type: 'doc',
id: 'index',
label: 'Docs',
}
id: 'intro',
label: '帮助中心',
},
{
type: 'category',
label: '平台公告',
items: [
{
type: 'doc',
id: '平台公告/platform-announcement',
label: '平台公告',
},
],
},
{
type: 'category',
label: '快速开始',
items: [
{
type: 'doc',
id: '快速开始/注册GitLink账号',
label: '注册GitLink账号',
},
{
type: 'doc',
id: '快速开始/创建第一个开源项目',
label: '创建第一个开源项目',
},
{
type: 'doc',
id: '快速开始/导入GitHub等第三方Git项目',
label: '导入GitHub等第三方Git项目',
},
{
type: 'doc',
id: '快速开始/提交第一行代码',
label: '提交第一行代码',
},
{
type: 'doc',
id: '快速开始/搜索开源项目',
label: '搜索开源项目',
},
],
},
{
type: 'category',
label: '代码库管理',
items: [
{
type: 'doc',
id: '代码库管理/仓库创建',
label: '仓库创建',
},
{
type: 'doc',
id: '代码库管理/仓库设置',
label: '仓库设置',
},
{
type: 'doc',
id: '代码库管理/成员管理',
label: '成员管理',
},
{
type: 'doc',
id: '代码库管理/分支管理',
label: '分支管理',
},
{
type: 'doc',
id: '代码库管理/文件管理',
label: '文件管理',
},
{
type: 'doc',
id: '代码库管理/代码提交',
label: '代码提交',
},
{
type: 'doc',
id: '代码库管理/WebIDE',
label: 'WebIDE',
},
{
type: 'doc',
id: '代码库管理/Webhook',
label: 'Webhook',
},
{
type: 'doc',
id: '代码库管理/标签和发行版管理',
label: '标签和发行版管理',
},
],
},
{
type: 'category',
label: '合并请求',
items: [
{
type: 'doc',
id: '合并请求/合并请求简介',
label: '合并请求简介',
},
{
type: 'doc',
id: '合并请求/创建合并请求',
label: '创建合并请求',
},
{
type: 'doc',
id: '合并请求/merge-request-issue',
label: '合并请求关联疑修',
},
{
type: 'doc',
id: '合并请求/代码评审',
label: '代码评审',
},
{
type: 'doc',
id: '合并请求/合并模式简介',
label: '合并模式简介',
},
],
},
{
type: 'category',
label: '疑修',
items: [
{
type: 'doc',
id: '疑修/疑修简介',
label: '疑修简介',
},
{
type: 'doc',
id: '疑修/疑修创建',
label: '疑修创建',
},
{
type: 'doc',
id: '疑修/疑修列表',
label: '疑修列表',
},
{
type: 'doc',
id: '疑修/疑修状态变更',
label: '疑修状态变更',
},
{
type: 'doc',
id: '疑修/评论及操作记录',
label: '评论及操作记录',
},
{
type: 'doc',
id: '疑修/标记管理',
label: '标记管理',
},
{
type: 'doc',
id: '疑修/里程碑管理',
label: '里程碑管理',
},
],
},
{
type: 'category',
label: '组织管理',
items: [
{
type: 'doc',
id: '组织管理/组织简介',
label: '组织简介',
},
{
type: 'doc',
id: '组织管理/组织创建及设置',
label: '组织创建及设置',
},
{
type: 'doc',
id: '组织管理/组织成员管理',
label: '组织成员管理',
},
{
type: 'doc',
id: '组织管理/组织团队管理',
label: '组织团队管理',
},
{
type: 'doc',
id: '组织管理/组织项目管理',
label: '组织项目管理',
},
],
},
{
type: 'category',
label: 'DevOps引擎',
items: [
{
type: 'doc',
id: 'DevOps引擎/引擎简介',
label: '引擎简介',
},
{
type: 'doc',
id: 'DevOps引擎/图形流水线',
label: '图形流水线',
},
{
type: 'doc',
id: 'DevOps引擎/代码流水线',
label: '代码流水线',
},
{
type: 'doc',
id: 'DevOps引擎/参数配置',
label: '参数配置',
},
{
type: 'doc',
id: 'DevOps引擎/密钥设置',
label: '密钥设置',
},
{
type: 'doc',
id: 'DevOps引擎/执行记录查询',
label: '执行记录查询',
},
],
},
{
type: 'category',
label: 'Bot市场',
items: [
{
type: 'doc',
id: 'Bot市场/bot市场',
label: 'bot市场',
},
{
type: 'doc',
id: 'Bot市场/bot安装',
label: 'bot安装',
},
{
type: 'doc',
id: 'Bot市场/bot配置',
label: 'bot配置',
},
{
type: 'doc',
id: 'Bot市场/bot开发',
label: 'bot开发',
},
],
},
{
type: 'category',
label: '维基',
items: [
{
type: 'doc',
id: '维基/维基页面管理',
label: '维基页面管理',
},
{
type: 'doc',
id: '维基/模板导入及导出',
label: '模板导入及导出',
},
],
},
{
type: 'category',
label: '通知',
items: [
{
type: 'doc',
id: '通知/通知简介',
label: '通知简介',
},
{
type: 'doc',
id: '通知/通知设置',
label: '通知设置',
},
],
},
{
type: 'category',
label: '个人主页建站',
items: [
{
type: 'doc',
id: '个人主页建站/站点创建流程',
label: '站点创建流程',
},
{
type: 'doc',
id: '个人主页建站/建站工具',
label: '建站工具',
},
],
},
{
type: 'category',
label: '第三方服务',
items: [
{
type: 'doc',
id: '第三方服务/WebIDE',
label: 'WebIDE',
},
{
type: 'doc',
id: '第三方服务/跨平台代码同步',
label: '跨平台代码同步',
},
{
type: 'doc',
id: '第三方服务/重睛鸟代码溯源',
label: '重睛鸟代码溯源',
},
],
},
{
type: 'category',
label: '服务协议',
items: [
{
type: 'doc',
id: '服务协议/GitLink服务协议',
label: 'GitLink服务协议',
},
],
},
],
};

@ -0,0 +1,56 @@
import React, { useState, useEffect } from 'react';
import styles from './styles.module.css';
export default function BackToTop() {
const [isVisible, setIsVisible] = useState(false);
// 监听滚动事件
useEffect(() => {
const toggleVisibility = () => {
if (window.pageYOffset > 300) {
setIsVisible(true);
} else {
setIsVisible(false);
}
};
window.addEventListener('scroll', toggleVisibility);
return () => {
window.removeEventListener('scroll', toggleVisibility);
};
}, []);
// 滚动到顶部
const scrollToTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth',
});
};
return (
<>
{isVisible && (
<button
onClick={scrollToTop}
className={styles.backToTop}
aria-label="返回顶部"
>
<svg
viewBox="0 0 24 24"
width="24"
height="24"
stroke="currentColor"
strokeWidth="2"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M12 19V5M5 12l7-7 7 7" />
</svg>
</button>
)}
</>
);
}

@ -0,0 +1,38 @@
.backToTop {
position: fixed;
bottom: 20px;
right: 20px;
width: 40px;
height: 40px;
border-radius: 50%;
background-color: var(--ifm-color-primary);
color: white;
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
z-index: 1000;
}
.backToTop:hover {
background-color: var(--ifm-color-primary-darker);
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.backToTop:active {
transform: translateY(0);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
@media (max-width: 996px) {
.backToTop {
bottom: 15px;
right: 15px;
width: 35px;
height: 35px;
}
}

@ -0,0 +1,43 @@
import React, { useState, useEffect } from 'react';
import styles from './styles.module.css';
export default function Bookmark({ docId }) {
const [isBookmarked, setIsBookmarked] = useState(false);
useEffect(() => {
// 从localStorage中读取标记状态
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
setIsBookmarked(bookmarks[docId] || false);
}, [docId]);
const toggleBookmark = (e) => {
e.stopPropagation(); // 阻止事件冒泡
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
const newState = !isBookmarked;
bookmarks[docId] = newState;
localStorage.setItem('docBookmarks', JSON.stringify(bookmarks));
setIsBookmarked(newState);
};
return (
<button
onClick={toggleBookmark}
className={`${styles.bookmarkButton} ${isBookmarked ? styles.bookmarked : ''}`}
aria-label={isBookmarked ? '取消标记' : '添加标记'}
type="button"
>
<svg
viewBox="0 0 24 24"
width="16"
height="16"
stroke="currentColor"
strokeWidth="2"
fill={isBookmarked ? 'currentColor' : 'none'}
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" />
</svg>
</button>
);
}

@ -0,0 +1,50 @@
.bookmarkButton {
position: absolute;
left: -20px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: var(--ifm-color-emphasis-600);
transition: all 0.2s ease;
opacity: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
}
.bookmarkButton:hover {
color: var(--ifm-color-primary);
transform: translateY(-50%) scale(1.1);
}
.bookmarked {
color: var(--ifm-color-primary);
opacity: 1;
}
/* 当鼠标悬停在侧边栏项目上时显示标记按钮 */
:global(.menu__link-wrapper:hover) .bookmarkButton {
opacity: 1;
}
/* 已标记的项目始终显示标记按钮 */
:global(.menu__link-wrapper) .bookmarked {
opacity: 1;
}
/* 确保侧边栏项目有足够的空间显示标记按钮 */
:global(.menu__link-wrapper) {
padding-left: 25px !important;
position: relative !important;
}
/* 调整列表项样式 */
:global(.menu__list-item) {
position: relative !important;
}

@ -0,0 +1,53 @@
import React, { useState, useEffect } from 'react';
import styles from './styles.module.css';
export default function DocBookmark({ docId }) {
const [isBookmarked, setIsBookmarked] = useState(false);
useEffect(() => {
// 从localStorage中读取标记状态
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
setIsBookmarked(bookmarks[docId] || false);
}, [docId]);
const toggleBookmark = () => {
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
const newState = !isBookmarked;
bookmarks[docId] = newState;
localStorage.setItem('docBookmarks', JSON.stringify(bookmarks));
setIsBookmarked(newState);
// 触发自定义事件,通知侧边栏更新
const event = new CustomEvent('bookmarkChanged', {
detail: { docId, isBookmarked: newState }
});
window.dispatchEvent(event);
};
return (
<div className={styles.bookmarkContainer}>
<button
onClick={toggleBookmark}
className={`${styles.bookmarkButton} ${isBookmarked ? styles.bookmarked : ''}`}
aria-label={isBookmarked ? '取消标记' : '添加标记'}
type="button"
>
<svg
viewBox="0 0 24 24"
width="20"
height="20"
stroke="currentColor"
strokeWidth="2"
fill={isBookmarked ? 'currentColor' : 'none'}
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" />
</svg>
<span className={styles.bookmarkText}>
{isBookmarked ? '取消标记' : '添加标记'}
</span>
</button>
</div>
);
}

@ -0,0 +1,42 @@
.bookmarkContainer {
display: flex;
justify-content: flex-end;
margin-bottom: 1rem;
padding: 0.5rem;
border-bottom: 1px solid var(--ifm-color-emphasis-200);
}
.bookmarkButton {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
border: 1px solid var(--ifm-color-emphasis-300);
border-radius: 4px;
background: var(--ifm-background-color);
color: var(--ifm-color-emphasis-700);
cursor: pointer;
transition: all 0.2s ease;
}
.bookmarkButton:hover {
background: var(--ifm-color-emphasis-100);
border-color: var(--ifm-color-primary);
color: var(--ifm-color-primary);
}
.bookmarked {
background: var(--ifm-color-primary);
color: white;
border-color: var(--ifm-color-primary);
}
.bookmarked:hover {
background: var(--ifm-color-primary-darker);
color: white;
}
.bookmarkText {
font-size: 0.9rem;
font-weight: 500;
}

@ -0,0 +1,69 @@
import React, { useState, useEffect } from 'react';
import styles from './styles.module.css';
export default function DocComment({ docId }) {
const [comments, setComments] = useState([]);
const [newComment, setNewComment] = useState('');
useEffect(() => {
// 从localStorage中读取评论
const savedComments = JSON.parse(localStorage.getItem(`docComments_${docId}`) || '[]');
setComments(savedComments);
}, [docId]);
const handleAddComment = () => {
if (!newComment.trim()) return;
const comment = {
id: Date.now(),
text: newComment,
timestamp: new Date().toLocaleString(),
author: '用户' // 这里可以替换为实际的用户名
};
const updatedComments = [...comments, comment];
setComments(updatedComments);
localStorage.setItem(`docComments_${docId}`, JSON.stringify(updatedComments));
setNewComment('');
};
const handleDeleteComment = (commentId) => {
const updatedComments = comments.filter(comment => comment.id !== commentId);
setComments(updatedComments);
localStorage.setItem(`docComments_${docId}`, JSON.stringify(updatedComments));
};
return (
<div className={styles.commentSection}>
<h2 className={styles.commentTitle}>评论</h2>
<div className={styles.commentList}>
{comments.map(comment => (
<div key={comment.id} className={styles.commentItem}>
<div className={styles.commentHeader}>
<span className={styles.commentAuthor}>{comment.author}</span>
<span className={styles.commentTime}>{comment.timestamp}</span>
<button
onClick={() => handleDeleteComment(comment.id)}
className={styles.deleteButton}
>
×
</button>
</div>
<div className={styles.commentText}>{comment.text}</div>
</div>
))}
</div>
<div className={styles.commentInput}>
<textarea
value={newComment}
onChange={(e) => setNewComment(e.target.value)}
placeholder="添加评论..."
rows={3}
/>
<button onClick={handleAddComment} className={styles.submitButton}>
发表评论
</button>
</div>
</div>
);
}

@ -0,0 +1,97 @@
.commentSection {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--ifm-color-emphasis-200);
}
.commentTitle {
font-size: 1.5rem;
margin-bottom: 1.5rem;
color: var(--ifm-color-emphasis-800);
}
.commentList {
margin-bottom: 2rem;
}
.commentItem {
padding: 1rem;
border: 1px solid var(--ifm-color-emphasis-200);
border-radius: 8px;
margin-bottom: 1rem;
background-color: var(--ifm-background-color);
}
.commentHeader {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.commentAuthor {
font-weight: 500;
color: var(--ifm-color-primary);
}
.commentTime {
font-size: 0.875rem;
color: var(--ifm-color-emphasis-600);
}
.deleteButton {
background: none;
border: none;
color: var(--ifm-color-emphasis-600);
cursor: pointer;
padding: 0 4px;
font-size: 1.25rem;
}
.deleteButton:hover {
color: var(--ifm-color-danger);
}
.commentText {
font-size: 1rem;
line-height: 1.5;
color: var(--ifm-color-emphasis-800);
}
.commentInput {
display: flex;
flex-direction: column;
gap: 1rem;
}
.commentInput textarea {
width: 100%;
padding: 0.75rem;
border: 1px solid var(--ifm-color-emphasis-200);
border-radius: 8px;
resize: vertical;
font-family: inherit;
font-size: 1rem;
min-height: 100px;
}
.commentInput textarea:focus {
outline: none;
border-color: var(--ifm-color-primary);
}
.submitButton {
align-self: flex-end;
padding: 0.5rem 1.5rem;
background-color: var(--ifm-color-primary);
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 1rem;
transition: background-color 0.2s ease;
}
.submitButton:hover {
background-color: var(--ifm-color-primary-darker);
}

@ -0,0 +1,62 @@
import React, { useState } from 'react';
import styles from './styles.module.css';
export default function DocRating({ docId }) {
const [hasRated, setHasRated] = useState(false);
const [showMessage, setShowMessage] = useState(false);
const [message, setMessage] = useState('');
const handleRating = (isPositive) => {
// 保存评级到localStorage
const ratings = JSON.parse(localStorage.getItem('docRatings') || '{}');
ratings[docId] = isPositive;
localStorage.setItem('docRatings', JSON.stringify(ratings));
// 显示相应的消息
setMessage(isPositive
? '感谢您的评价,祝您使用愉快'
: '不好意思,给您带来不好的体验,我们一定会积极改进'
);
setShowMessage(true);
setHasRated(true);
// 5秒后隐藏消息
setTimeout(() => {
setShowMessage(false);
}, 5000);
};
if (hasRated) {
return null;
}
return (
<>
<div className={styles.ratingSection}>
<p className={styles.ratingText}>请您对本文档做出评价</p>
<div className={styles.ratingButtons}>
<button
onClick={() => handleRating(true)}
className={`${styles.ratingButton} ${styles.positiveButton}`}
>
</button>
<button
onClick={() => handleRating(false)}
className={`${styles.ratingButton} ${styles.negativeButton}`}
>
不好
</button>
</div>
</div>
{showMessage && (
<>
<div className={styles.messageOverlay} />
<div className={styles.message}>
{message}
</div>
</>
)}
</>
);
}

@ -0,0 +1,89 @@
.ratingSection {
margin-top: 2rem;
padding: 1.5rem;
border: 1px solid var(--ifm-color-emphasis-200);
border-radius: 8px;
background-color: var(--ifm-background-color);
text-align: center;
}
.ratingText {
font-size: 1.1rem;
color: var(--ifm-color-emphasis-800);
margin-bottom: 1rem;
}
.ratingButtons {
display: flex;
justify-content: center;
gap: 1rem;
}
.ratingButton {
padding: 0.5rem 2rem;
border: none;
border-radius: 6px;
font-size: 1rem;
cursor: pointer;
transition: all 0.2s ease;
}
.positiveButton {
background-color: var(--ifm-color-success);
color: white;
}
.positiveButton:hover {
background-color: var(--ifm-color-success-darker);
transform: translateY(-1px);
}
.negativeButton {
background-color: var(--ifm-color-danger);
color: white;
}
.negativeButton:hover {
background-color: var(--ifm-color-danger-darker);
transform: translateY(-1px);
}
.messageOverlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 999;
animation: fadeIn 0.3s ease;
}
.message {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 1.5rem 2rem;
border-radius: 8px;
background-color: var(--ifm-background-color);
color: var(--ifm-color-emphasis-800);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 1000;
font-size: 1.1rem;
text-align: center;
min-width: 300px;
border: 1px solid var(--ifm-color-emphasis-200);
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translate(-50%, -40%);
}
to {
opacity: 1;
transform: translate(-50%, -50%);
}
}

@ -149,4 +149,82 @@ html[data-theme='dark'] .docusaurus-highlight-code-line {
.widget{
display: none!important;
opacity: 0;
}
/* 标记按钮的全局样式 */
.menu__link-wrapper {
position: relative !important;
padding-left: 25px !important;
}
/* 已标记项目的样式 */
.menu__link-wrapper--active {
font-weight: bold;
}
/* 标记按钮的动画效果 */
@keyframes bookmarkPulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
.bookmarkButton.bookmarked {
animation: bookmarkPulse 0.3s ease;
}
/* 确保侧边栏项目有正确的样式 */
.menu__link {
position: relative !important;
display: flex !important;
align-items: center !important;
}
/* 调整侧边栏的padding为标记按钮留出空间 */
.menu {
padding-left: 20px !important;
}
/* 调整列表项样式 */
.menu__list-item {
position: relative !important;
}
/* 确保标记按钮在正确的层级 */
.menu__link-wrapper {
z-index: 1;
}
.bookmarkButton {
z-index: 2;
}
/* 标记项目的样式 */
.menu__link--bookmarked {
color: var(--ifm-color-primary) !important;
font-weight: 500 !important;
background-color: var(--ifm-color-emphasis-100) !important;
}
/* 标记按钮的动画效果 */
@keyframes bookmarkPulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
.bookmarkButton.bookmarked {
animation: bookmarkPulse 0.3s ease;
}

@ -0,0 +1,14 @@
import React from 'react';
import DocItem from '@theme-original/DocItem';
import DocComment from '@site/src/components/DocComment';
import DocRating from '@site/src/components/DocRating';
export default function DocItemWrapper(props) {
return (
<>
<DocItem {...props} />
<DocRating docId={props.content.metadata.id} />
<DocComment docId={props.content.metadata.id} />
</>
);
}

@ -0,0 +1,17 @@
import React from 'react';
import DocPage from '@theme-original/DocPage';
import DocBookmark from '@site/src/components/DocBookmark';
import {useLocation} from '@docusaurus/router';
export default function DocPageWrapper(props) {
const {content} = props;
const location = useLocation();
const docId = location.pathname;
return (
<>
<DocBookmark docId={docId} />
<DocPage {...props} />
</>
);
}

@ -0,0 +1,70 @@
import React, { useEffect, useState } from 'react';
import DocSidebarItem from '@theme-original/DocSidebarItem';
import styles from './styles.module.css';
export default function DocSidebarItemWrapper(props) {
const { item } = props;
const [isBookmarked, setIsBookmarked] = useState(false);
useEffect(() => {
if (item.type === 'doc') {
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
setIsBookmarked(bookmarks[item.docId] || false);
// 监听标记变化事件
const handleBookmarkChange = (event) => {
const { docId, isBookmarked: newState } = event.detail;
if (docId === item.docId) {
setIsBookmarked(newState);
}
};
window.addEventListener('bookmarkChanged', handleBookmarkChange);
return () => {
window.removeEventListener('bookmarkChanged', handleBookmarkChange);
};
}
}, [item]);
if (item.type === 'doc') {
return (
<li className={`menu__list-item ${isBookmarked ? styles.bookmarkedItem : ''}`}>
<div className={styles.menuLinkWrapper}>
<DocSidebarItem {...props} />
<div className={styles.actionButtons}>
<button
onClick={() => {
const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}');
const newState = !isBookmarked;
bookmarks[item.docId] = newState;
localStorage.setItem('docBookmarks', JSON.stringify(bookmarks));
setIsBookmarked(newState);
window.dispatchEvent(new CustomEvent('bookmarkChanged', {
detail: { docId: item.docId, isBookmarked: newState }
}));
}}
className={`${styles.bookmarkButton} ${isBookmarked ? styles.bookmarked : ''}`}
aria-label={isBookmarked ? '取消标记' : '添加标记'}
type="button"
>
<svg
viewBox="0 0 24 24"
width="16"
height="16"
stroke="currentColor"
strokeWidth="2"
fill={isBookmarked ? 'currentColor' : 'none'}
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" />
</svg>
</button>
</div>
</div>
</li>
);
}
return <DocSidebarItem {...props} />;
}

@ -0,0 +1,71 @@
.menuLinkWrapper {
position: relative;
display: flex;
align-items: center;
width: 100%;
}
.actionButtons {
position: absolute;
right: 8px;
display: flex;
align-items: center;
gap: 4px;
z-index: 10;
}
.bookmarkButton {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: var(--ifm-color-emphasis-600);
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
}
.bookmarkButton:hover {
color: var(--ifm-color-primary);
transform: scale(1.1);
}
.bookmarked {
color: var(--ifm-color-primary);
}
.bookmarkedItem {
background-color: var(--ifm-color-emphasis-100);
}
.bookmarkedItem :global(.menu__link) {
font-weight: 500;
color: var(--ifm-color-primary);
}
/* 确保侧边栏项目有足够的空间显示按钮 */
:global(.menu__link-wrapper) {
padding-right: 80px !important;
position: relative !important;
}
/* 调整列表项样式 */
:global(.menu__list-item) {
position: relative !important;
}
.bookmarkedItem :global(.menu__link:hover) {
background-color: var(--ifm-color-emphasis-200) !important;
}
/* 确保样式在深色模式下也生效 */
[data-theme='dark'] .bookmarkedItem :global(.menu__link) {
background-color: var(--ifm-color-emphasis-200) !important;
}
[data-theme='dark'] .bookmarkedItem :global(.menu__link:hover) {
background-color: var(--ifm-color-emphasis-300) !important;
}

@ -0,0 +1,12 @@
import React from 'react';
import Layout from '@theme-original/Layout';
import BackToTop from '@site/src/components/BackToTop';
export default function LayoutWrapper(props) {
return (
<>
<Layout {...props} />
<BackToTop />
</>
);
}

@ -1,6 +1,67 @@
---
sidebar_label: '合并请求关联疑修'
sidebar_position: 5
id: merge-request-issue
title: 合并请求关联疑修
sidebar_label: '合并请求关联疑修'
sidebar_position: 5
---
# 合并请求关联疑修
# 合并请求关联疑修
## 功能介绍
合并请求关联疑修功能允许您在创建或编辑合并请求时,将相关的疑修与合并请求建立关联。这样可以帮助团队成员更好地追踪代码变更与疑修之间的关系,提高开发效率。
## 如何关联疑修
### 方法一:在合并请求描述中引用
1. 在创建或编辑合并请求时,在描述中使用 `#` 符号引用疑修编号
2. 例如:`修复 #123 中提到的登录问题`
3. 系统会自动识别并建立关联
### 方法二:在疑修详情页关联
1. 打开疑修详情页面
2. 点击"关联合并请求"按钮
3. 选择要关联的合并请求
4. 确认关联
## 关联后的效果
1. 在疑修详情页面可以看到关联的合并请求列表
2. 在合并请求详情页面可以看到关联的疑修信息
3. 当合并请求被合并时,系统会自动更新疑修状态
4. 可以通过关联关系快速追踪代码变更
## 管理关联关系
### 查看关联
1. 在疑修详情页面的"关联合并请求"部分查看
2. 在合并请求详情页面的"关联疑修"部分查看
### 解除关联
1. 在疑修详情页面:
- 找到要解除关联的合并请求
- 点击"解除关联"按钮
- 确认操作
2. 在合并请求详情页面:
- 找到要解除关联的疑修
- 点击"解除关联"按钮
- 确认操作
## 最佳实践
1. 在创建合并请求时,及时关联相关的疑修
2. 使用清晰的描述说明合并请求与疑修的关系
3. 定期检查关联关系,确保其准确性
4. 在合并请求被合并后,及时确认疑修状态
## 注意事项
1. 一个合并请求可以关联多个疑修
2. 一个疑修可以关联多个合并请求
3. 关联关系建立后可以随时修改
4. 解除关联不会影响已合并的代码变更

@ -1,4 +1,87 @@
---
sidebar_label: '平台公告'
sidebar_position: 1
---
id: platform-announcement
title: 平台公告
sidebar_label: '平台公告'
sidebar_position: 1
---
# 平台公告
## 功能介绍
平台公告功能允许管理员发布和管理平台相关的通知、更新和重要信息。通过平台公告,可以及时向用户传达重要信息,确保用户了解平台的最新动态。
## 创建平台公告
1. 进入平台公告管理页面
2. 点击"新建公告"按钮
3. 填写公告标题和内容
4. 设置公告类型和优先级
5. 选择发布范围
6. 点击"发布"按钮
## 公告类型
平台公告支持以下类型:
- 系统更新:平台功能更新和系统维护通知
- 功能发布:新功能发布和功能介绍
- 活动通知:平台活动、比赛和培训通知
- 重要提醒:安全提醒和重要政策变更
- 其他通知:其他类型的平台通知
## 公告管理
### 编辑公告
1. 在公告列表中找到要编辑的公告
2. 点击"编辑"按钮
3. 修改公告内容
4. 点击"保存"按钮
### 删除公告
1. 在公告列表中找到要删除的公告
2. 点击"删除"按钮
3. 确认删除操作
### 公告状态
公告可能处于以下状态:
- 草稿:未发布的公告
- 已发布:正在显示的公告
- 已过期:超过显示期限的公告
- 已归档:已归档的公告
## 公告显示
### 显示位置
1. 平台首页公告栏
2. 用户个人中心
3. 相关功能页面
### 显示规则
1. 按优先级排序显示
2. 按发布时间倒序排列
3. 支持置顶显示
4. 支持定时发布和自动过期
## 最佳实践
1. 公告标题要简洁明了
2. 内容要清晰易懂
3. 重要信息要突出显示
4. 及时更新和删除过期公告
5. 合理设置公告优先级
6. 注意公告的时效性
## 注意事项
1. 公告内容要符合平台规范
2. 避免发布重复或过时的信息
3. 重要公告要及时通知用户
4. 定期清理过期公告
5. 注意公告的权限管理
Loading…
Cancel
Save