快乐的梦鱼 1 miesiąc temu
rodzic
commit
aec36655a7

+ 36 - 0
server/api/article/byChannelAndOnLevelChild.ts

@@ -0,0 +1,36 @@
+import { defineEventHandler, EventHandlerRequest } from 'h3';
+import { DB } from '~~/server/db/DB';
+import { createErrorResponse, createSuccessResponse, IResponse } from '~~/server/utils/response';
+import { CommonPageResult } from '~~/server/db/CommonModel';
+import type { IArticle } from './[id]';
+import { IChannel } from '../channel/[id]';
+
+export default defineEventHandler<EventHandlerRequest, Promise<IResponse<CommonPageResult<IArticle>>>>(async (event) => {
+  try {  
+    const query = getQuery(event);
+    const page = query.page as string;
+    const pageSize = query.pageSize as string;
+    const channelId = query.channelId as string;
+    if (!channelId)
+      return createErrorResponse('分类ID不能为空');
+
+    const childChannels = await DB.table('pr_cms_channel')
+            .where('parent_id', channelId)
+            .select('id')
+            .get() as IChannel[];
+
+    const articles = await DB.table('pr_cms_archives')
+            .whereIn('channel_id', [...childChannels.map(item => item.id), channelId])
+            .where('status', 'normal')
+            .orderBy('weigh', 'desc')
+            .orderBy('publishtime', 'desc')
+            .orderBy('createtime', 'desc')
+            .orderBy('id', 'asc')
+            .paginate(Number(page), Number(pageSize));
+    if (!articles) 
+      return createErrorResponse('文章不存在');
+    return createSuccessResponse(articles);
+  } catch (error) {
+    return createErrorResponse(error);
+  }
+});

+ 2 - 1
src/components/NavBar.vue

@@ -8,7 +8,8 @@
         <div class="container">
           <ul class="nav-list">
             <li v-for="item in navItems.content.value" :key="item.url" class="nav-item" :class="{ active: isActive(item.url) }">
-              <router-link :to="item.url">{{ item.name }}</router-link>
+              <a v-if="item.type === 'link'" :href="item.outlink" target="_blank">{{ item.name }}</a>
+              <router-link v-else :to="item.url">{{ item.name }}</router-link>
             </li>
           </ul>
         </div>

+ 5 - 4
src/pages/channel/[id].vue

@@ -62,7 +62,8 @@
                   <ol class="breadcrumb">
                     <li class="breadcrumb-item"><router-link to="/">首页</router-link></li>
                     <li v-for="(item, key) in channelData.content.value?.parents" :key="key" class="breadcrumb-item">
-                      <router-link :to="`/channel/${item.id}`">{{ item.name }}</router-link>
+                      <a v-if="item.type === 'link'" :href="item.outlink" target="_blank">{{ item.name }}</a>
+                      <router-link v-else :to="`/channel/${item.id}`">{{ item.name }}</router-link>
                     </li>
                     <li class="breadcrumb-item active" aria-current="page">{{ channelName }}</li>
                   </ol>
@@ -139,11 +140,11 @@ const articlesData = await useSSrSimpleDataLoader('articles' + channelId, async
     throw new Error(res.message);
 
   if (res.data?.empty && channelData.content.value?.childs?.[0]) {
-    // 没有文章时,并且有子分类时,尝试读取第一个子分类的文章
-    const res = await $fetch('/api/article/byChannel', {
+    // 没有文章时,并且有子分类时,尝试读取全部第一级子分类的文章
+    const res = await $fetch('/api/article/byChannelAndOnLevelChild', {
       method: 'GET',
       query: { 
-        channelId: channelData.content.value.childs[0].id,
+        channelId: channelId,
         page: route.query.page || 1,
         pageSize: 10,
       }

+ 4 - 6
src/pages/channel/laws.vue

@@ -112,7 +112,7 @@ const performSearch = () => {
 };
 // 更新查询参数
 const updateQuery = () => {
-  router.push({
+  router.replace({
     query: {
       ...route.query,
       category: selectedCategory.value,
@@ -153,11 +153,9 @@ const articlesData = await useSSrSimpleDataLoader('articles' + channelId, async
 
 const channelName = computed(() => channelData.content.value?.name || '');
 
-watch(() => route.query.page, async (newVal, oldVal) => {
-  if (newVal !== oldVal) {
-    articlesData.loadData(undefined, true);
-  }
-})
+watch(route, async (newVal, oldVal) => {
+  articlesData.loadData(undefined, true);
+});
 
 </script>