Skip to content

Commit 460cd19

Browse files
committed
修复文档版本切换无法找到对应文章问题
1 parent ef9ddd3 commit 460cd19

File tree

6 files changed

+100
-7
lines changed

6 files changed

+100
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ php artisan export:documents-seed
9898

9999
## 待解决已知问题
100100
1.BUG问题
101-
- 文档版本切换无法找到对应文章问题
101+
- 文档没有章节的文章目录展示问题
102102

103103
2.体验优化问题
104104
- 目录跳转后开关闭合状态不存储问题

app/Admin/Controllers/ArticleController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected function grid()
4949
});
5050
}
5151

52-
$grid->column('slug','跳转链接');
52+
$grid->column('slug','跳转链接')->help('如需切换版本,请保持各版本跳转链接不变');
5353
$grid->column('title');
5454
$grid->column('order');
5555
$grid->column('created_at')->sortable();
@@ -115,7 +115,7 @@ protected function form()
115115
$form->hidden('id');
116116
$form->text('slug','跳转链接')->required();
117117
$form->text('title');
118-
$form->markdown('content')->languageUrl(admin_asset('@admin/dcat/plugins/editor-md/languages/zh-tw.js'));
118+
$form->markdown('content')->languageUrl(admin_asset('@admin/dcat/plugins/editor-md/languages/zh-tw.js'))->required();
119119

120120
$document = \App\Models\Document::find($documentId);
121121

app/Admin/Controllers/ChapterController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected function grid()
3131
$grid->column('id')->sortable();
3232
$grid->column('document.name','文档名称');
3333
$grid->column('version.version_number','文档版本');
34-
$grid->column('title');
34+
$grid->column('title')->help('如需切换版本,请保持各版本标题一致');
3535
$grid->column('order')->sortable()->orderable();
3636
// 添加自定义版本管理按钮
3737
$grid->column('article_management', '下级管理')->display(function () {

app/Http/Controllers/ArticleController.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Http\Controllers;
44

55
use App\Models\Article;
6+
use App\Models\Chapter;
67
use App\Models\Document;
78
use App\Models\Version;
89
use Illuminate\Http\Request;
@@ -39,4 +40,53 @@ public function show(Request $request, $document_slug, $version_number, $article
3940

4041
return view('documents.articles.show', compact('document', 'version', 'article', 'articles'));
4142
}
43+
44+
public function findArticleIdBySlug($document_slug, $version_number, $chapter_id, $article_slug)
45+
{
46+
47+
$document = Document::where('slug', $document_slug)->firstOrFail();
48+
$version = Version::where('document_id', $document->id)
49+
->where('version_number', $version_number)
50+
->firstOrFail();
51+
$chapter = Chapter::where('id',$chapter_id)->firstOrFail();
52+
$new_chapter = Chapter::where('document_id', $document->id)->where('version_id',$version->id)->where('title',$chapter->title)->firstOrFail();
53+
$article = Article::where('slug', $article_slug)
54+
->where('chapter_id', $new_chapter->id)
55+
->where('version_id', $version->id)
56+
->first();
57+
if ($article) {
58+
return response()->json([
59+
'success' => true,
60+
'article_id' => $article->id
61+
]);
62+
} else {
63+
return response()->json([
64+
'success' => false,
65+
'message' => '该版本对应文章没有找到!'
66+
]);
67+
}
68+
}
69+
70+
public function findArticleIdBySlugNoChapter($document_slug, $version_number, $article_slug)
71+
{
72+
$document = Document::where('slug', $document_slug)->firstOrFail();
73+
$version = Version::where('document_id', $document->id)
74+
->where('version_number', $version_number)
75+
->firstOrFail();
76+
$article = Article::where('slug', $article_slug)
77+
->whereNull('chapter_id')
78+
->where('version_id', $version->id)
79+
->first();
80+
if ($article) {
81+
return response()->json([
82+
'success' => true,
83+
'article_id' => $article->id
84+
]);
85+
} else {
86+
return response()->json([
87+
'success' => false,
88+
'message' => '该版本对应文章没有找到!'
89+
]);
90+
}
91+
}
4292
}

resources/views/documents/articles/show.blade.php

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,10 @@
209209
<div class="content-wrapper">
210210
<div class="content">
211211
<div class="article-header">
212-
<div class="version-selector">
213-
<select onchange="location = this.value;">
212+
<div>
213+
<select id="version-selector">
214214
@foreach($document->versions as $ver)
215-
<option value="{{ route('articles.show', ['document_slug' => $document->slug, 'version' => $ver->version_number, 'article_slug' => $article->slug, 'article_id' => $articleItem->id]) }}" {{ $ver->version_number == $version->version_number ? 'selected' : '' }}>
215+
<option value="{{ $ver->version_number }}" {{ $ver->version_number == $version->version_number ? 'selected' : '' }}>
216216
{{ $ver->version_number }}
217217
</option>
218218
@endforeach
@@ -247,6 +247,43 @@
247247
<script src="{{ asset('js/editormd.min.js') }}"></script>
248248
<script src="{{ asset('js/lightbox.min.js') }}"></script>
249249
<script>
250+
$(document).ready(function() {
251+
let lastVersion = $('#version-selector').val(); // 初始化时存储当前选中的版本号
252+
253+
$('#version-selector').on('focus', function () {
254+
// 在下拉菜单获得焦点时记录当前的值
255+
lastVersion = $(this).val();
256+
}).change(function() {
257+
const newVersion = $(this).val(); // 获取新选中的版本号
258+
updateArticleLink(newVersion, lastVersion); // 调用函数,并传递当前选择和上次选择
259+
});
260+
261+
function updateArticleLink(newVersion, lastVersion) {
262+
const documentSlug = '{{ $document->slug }}';
263+
const articleSlug = '{{ $article->slug }}';
264+
const chapterId = '{{ $article->chapter_id }}';
265+
266+
// 检查 chapterId 是否存在,如果不存在或为空,则使用不同的 URL
267+
const url = chapterId ?
268+
`/documents/${documentSlug}/${newVersion}/${chapterId}/find-article/${articleSlug}` :
269+
`/documents/${documentSlug}/${newVersion}/find-article/${articleSlug}`;
270+
271+
$.get(url, function(data) {
272+
if (data.success) {
273+
const newLink = `/documents/${documentSlug}/${newVersion}/articles/${articleSlug}/${data.article_id}`;
274+
window.location.href = newLink;
275+
// 请求成功后更新 lastVersion
276+
$('#version-selector').data('last', newVersion);
277+
} else {
278+
alert(data.message);
279+
$('#version-selector').val(lastVersion); // 请求失败时,恢复原来的选择
280+
}
281+
}).fail(function() {
282+
alert('该版本对应文章没有找到!');
283+
$('#version-selector').val(lastVersion); // 网络请求本身失败也恢复原来的选择
284+
});
285+
}
286+
});
250287
$(function() {
251288
editormd.markdownToHTML("article-content", {
252289
htmlDecode: "style,script,iframe",
@@ -357,6 +394,7 @@ function getArticleUrlByIndex(baseUrl, documentName, version, chapterId, article
357394
window.scrollToTop = function() {
358395
$("html, body").animate({ scrollTop: 0 }, 500);
359396
}
397+
360398
});
361399
</script>
362400
</body>

routes/web.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,8 @@
3232
Route::get('/documents/{slug}/{version?}', [DocumentController::class, 'show'])->name('documents.show');
3333
Route::get('/documents/{document_slug}/{version}/articles/{article_slug}/{article_id}', [ArticleController::class, 'show'])->name('articles.show');
3434

35+
Route::get('/documents/{document_slug}/{version_number}/{chapter_id}/find-article/{article_slug}', [ArticleController::class, 'findArticleIdBySlug'])->name('articles.find_by_slug');
36+
Route::get('/documents/{document_slug}/{version_number}/find-article/{article_slug}', [ArticleController::class, 'findArticleIdBySlugNoChapter'])->name('articles.find_by_slug_no_chapter');
37+
38+
39+

0 commit comments

Comments
 (0)