feat(article): 优化文章列表页面功能

- 将标题列改为可点击链接,支持直接跳转到文章详情页
- 新增操作列,添加查看按钮便于访问文章详情
- 修复事件绑定语法错误,将@pressEnter改为@press-enter
- 修复分页组件事件绑定错误,将@showSizeChange改为@show-size-change
- 实现路由参数监听,支持通过URL参数keywords自动搜索文章
- 临时禁用开发者中心的产品选择下拉菜单
- 移除已废弃的开发者中心相关页面和百色中学API接口文件
This commit is contained in:
2026-01-21 15:04:16 +08:00
parent 9a1dcad104
commit 60c39cfec4
138 changed files with 71 additions and 10633 deletions

View File

@@ -14,7 +14,7 @@
v-model:value="keywords"
placeholder="关键词 keywords"
class="w-72"
@pressEnter="doSearch"
@press-enter="doSearch"
/>
<a-button type="primary" :loading="pending" @click="doSearch">查询</a-button>
<a-button :disabled="pending" @click="refresh">刷新</a-button>
@@ -40,10 +40,33 @@
size="middle"
>
<a-table-column title="ID" data-index="articleId" width="90" />
<a-table-column title="标题" data-index="title" />
<a-table-column title="标题" data-index="title">
<template #default="{ record }">
<NuxtLink
v-if="record?.articleId"
class="text-blue-600 hover:underline"
:to="`/item/${record.articleId}`"
>
{{ record.title }}
</NuxtLink>
<span v-else>{{ record.title }}</span>
</template>
</a-table-column>
<a-table-column title="编号" data-index="code" width="220" />
<a-table-column title="栏目" data-index="categoryName" width="160" />
<a-table-column title="创建时间" data-index="createTime" width="180" />
<a-table-column title="操作" key="action" width="120">
<template #default="{ record }">
<a-button
size="small"
type="link"
:disabled="!record?.articleId"
@click="record?.articleId && navigateTo(`/item/${record.articleId}`)"
>
查看
</a-button>
</template>
</a-table-column>
</a-table>
<div class="mt-4 flex items-center justify-end">
@@ -54,7 +77,7 @@
show-size-changer
:page-size-options="['10', '20', '50', '100']"
@change="onPageChange"
@showSizeChange="onPageSizeChange"
@show-size-change="onPageSizeChange"
/>
</div>
</a-card>
@@ -66,6 +89,7 @@
import { pageCmsArticle } from '@/api/cms/cmsArticle/index'
import { getToken, removeToken, setToken } from '@/utils/token-util'
const route = useRoute()
const config = useRuntimeConfig()
const tenantId = computed(() => String(config.public.tenantId))
@@ -78,6 +102,19 @@ onMounted(() => {
token.value = getToken()
})
watch(
() => route.query.keywords,
(val) => {
const next = Array.isArray(val) ? val[0] : val
if (typeof next === 'string' && next.trim() && next.trim() !== keywords.value.trim()) {
keywords.value = next.trim()
page.value = 1
refresh()
}
},
{ immediate: true }
)
const { data, pending, error, refresh } = useAsyncData(
'cms-article-page',
() =>

View File

@@ -1,13 +0,0 @@
<template>
<div>
<a-page-header title="应用中心" sub-title="订阅应用与交付入口" />
<AppsCenter />
</div>
</template>
<script setup lang="ts">
import AppsCenter from '@/components/developer/AppsCenter.vue'
definePageMeta({ layout: 'developer' })
</script>

View File

@@ -1,34 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="Git 账号绑定" sub-title="用于开通 Gitea 仓库访问权限" />
<a-card :bordered="false" class="card">
<a-alert
type="info"
show-icon
message="待接入接口:保存你的 Gitea 用户名(或邮箱),用于运营加组。"
/>
<a-form class="mt-4" layout="vertical">
<a-form-item label="Gitea 用户名">
<a-input placeholder="例如lily" />
</a-form-item>
<a-form-item label="备注(可选)">
<a-textarea :rows="3" placeholder="例如:公司/项目/联系方式" />
</a-form-item>
<a-button type="primary" disabled>保存</a-button>
</a-form>
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,49 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="概览" sub-title="开发者能力与交付入口" />
<a-row :gutter="[16, 16]">
<a-col :xs="24" :md="12" :lg="8">
<a-card :bordered="false" class="card">
<div class="text-gray-500">可开发应用</div>
<div class="text-2xl font-semibold mt-1">-</div>
<div class="text-gray-400 mt-2">订阅有效且已购买源码权益</div>
</a-card>
</a-col>
<a-col :xs="24" :md="12" :lg="8">
<a-card :bordered="false" class="card">
<div class="text-gray-500">待处理申请</div>
<div class="text-2xl font-semibold mt-1">-</div>
<div class="text-gray-400 mt-2">Git 加组申请处理状态</div>
</a-card>
</a-col>
<a-col :xs="24" :md="12" :lg="8">
<a-card :bordered="false" class="card">
<div class="text-gray-500">教程更新</div>
<div class="text-2xl font-semibold mt-1">-</div>
<div class="text-gray-400 mt-2">后续接入教程内容源</div>
</a-card>
</a-col>
</a-row>
<a-card title="快捷入口" :bordered="false" class="card">
<div class="flex flex-wrap gap-3">
<a-button type="primary" @click="navigateTo('/developer/apps')">应用中心</a-button>
<a-button @click="navigateTo('/developer/source')">源码与仓库</a-button>
<a-button @click="navigateTo('/developer/tutorial')">开发教程</a-button>
<a-button @click="navigateTo('/developer/git')">Git 账号绑定</a-button>
<a-button @click="navigateTo('/developer/requests')">权限申请记录</a-button>
</div>
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,20 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="权限申请记录" sub-title="Git 加组申请与处理状态" />
<a-card :bordered="false" class="card">
<a-empty description="待接入:/developer/git-access-requests" />
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,40 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="源码与仓库" sub-title="Gitea 仓库访问与源码交付" />
<a-alert
type="info"
show-icon
message="当前版本为页面骨架:后续将接入“订阅有效 + 已购买源码权益”的可见性与申请流程。"
/>
<a-card title="仓库访问" :bordered="false" class="card">
<a-steps :current="1" size="small">
<a-step title="绑定 Git 账号" />
<a-step title="提交加组申请" />
<a-step title="运营处理加组" />
<a-step title="获得仓库访问权限" />
</a-steps>
<div class="mt-4 flex flex-wrap gap-3">
<a-button type="primary" @click="navigateTo('/developer/git')">去绑定 Git 账号</a-button>
<a-button @click="navigateTo('/developer/requests')">查看申请记录</a-button>
</div>
</a-card>
<a-card title="我的源码列表" :bordered="false" class="card">
<a-empty description="待接入:按 templateId 映射仓库 + 权益校验" />
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,24 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="支持与反馈" sub-title="开发相关问题工单与联系渠道" />
<a-card :bordered="false" class="card">
<a-descriptions bordered :column="1">
<a-descriptions-item label="常见问题">待补充</a-descriptions-item>
<a-descriptions-item label="工单/反馈">待接入</a-descriptions-item>
<a-descriptions-item label="联系方式">待补充</a-descriptions-item>
</a-descriptions>
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,43 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="开发教程" sub-title="快速开始二次开发与部署" />
<a-row :gutter="[16, 16]">
<a-col :xs="24" :md="12" :lg="8">
<a-card title="快速开始" :bordered="false" class="card">
<p class="text-gray-600">拉代码安装依赖配置环境变量本地运行</p>
<a-button type="link" class="px-0" disabled>查看</a-button>
</a-card>
</a-col>
<a-col :xs="24" :md="12" :lg="8">
<a-card title="二次开发" :bordered="false" class="card">
<p class="text-gray-600">扩展点模块/插件机制权限/菜单接入规范</p>
<a-button type="link" class="px-0" disabled>查看</a-button>
</a-card>
</a-col>
<a-col :xs="24" :md="12" :lg="8">
<a-card title="部署上线" :bordered="false" class="card">
<p class="text-gray-600">Docker/PM2域名 HTTPS升级回滚</p>
<a-button type="link" class="px-0" disabled>查看</a-button>
</a-card>
</a-col>
</a-row>
<a-alert
type="warning"
show-icon
message="教程内容源待接入:可先用 Markdown/远端 CMS/静态页面三选一实现。"
/>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'developer' })
</script>
<style scoped>
.card {
border-radius: 12px;
}
</style>

View File

@@ -1,13 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="小程序开发" :ghost="false" class="page-header" />
<a-card :bordered="false">
<a-result status="info" title="模块已创建" sub-title="mp 模块页面占位后续在此接入功能" />
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'mp' })
</script>

View File

@@ -1,13 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="办公协同OA" :ghost="false" class="page-header" />
<a-card :bordered="false">
<a-result status="info" title="模块已创建" sub-title="oa 模块页面占位后续在此接入功能" />
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'oa' })
</script>

View File

@@ -1,91 +0,0 @@
<template>
<div class="mx-auto max-w-screen-xl px-4 py-12">
<a-typography-title :level="1" class="!mb-2">产品矩阵</a-typography-title>
<a-typography-paragraph class="!text-gray-600 !mb-8">
面向不同业务场景的可售卖产品支持套餐化售卖支付即开通模板/插件加购与私有化交付
</a-typography-paragraph>
<a-row :gutter="[16, 16]">
<a-col v-for="p in products" :key="p.title" :xs="24" :md="12" :lg="8">
<a-card :title="p.title">
<template #extra>
<a-tag v-if="p.recommend" color="green">推荐</a-tag>
</template>
<a-typography-paragraph class="!text-gray-600">
{{ p.desc }}
</a-typography-paragraph>
<div class="flex flex-wrap gap-2">
<a-tag v-for="t in p.tags" :key="t">{{ t }}</a-tag>
</div>
<div class="mt-4">
<a-button type="link" @click="navigateTo('/contact')">咨询开通</a-button>
</div>
</a-card>
</a-col>
</a-row>
<a-card class="mt-10" :bordered="false" style="background: #f0f5ff">
<a-row :gutter="[16, 16]" align="middle">
<a-col :xs="24" :md="16">
<a-typography-title :level="3" class="!mb-1">需要上架你的专属产品</a-typography-title>
<a-typography-paragraph class="!mb-0 !text-gray-600">
我们可基于平台能力为你定制产品组合套餐定价开通初始化与交付流程
</a-typography-paragraph>
</a-col>
<a-col :xs="24" :md="8" class="flex md:justify-end">
<a-button type="primary" size="large" @click="navigateTo('/contact')">马上联系</a-button>
</a-col>
</a-row>
</a-card>
</div>
</template>
<script setup lang="ts">
import { usePageSeo } from '@/composables/usePageSeo'
usePageSeo({
title: '产品矩阵 - 套餐售卖 / 支付即开通 / 模板&插件加购',
description: '企业官网、电商、小程序等产品矩阵,支持套餐化售卖、支付即开通、模板/插件加购与私有化交付。',
path: '/products'
})
const products = [
{
title: '企业官网',
recommend: true,
desc: '品牌展示与获客转化支持多模板、多语言、SEO 与可视化配置。',
tags: ['模板', 'SEO', '多语言', '私有化']
},
{
title: '电商系统',
recommend: true,
desc: '商品/订单/支付/营销基础能力,插件化扩展,支持多端触达。',
tags: ['支付', '插件', '营销', '多租户']
},
{
title: '小程序/公众号',
recommend: false,
desc: '多端渠道接入与统一管理,适配常见内容与电商场景。',
tags: ['多端', '渠道', '可扩展']
},
{
title: '行业门户',
recommend: false,
desc: '内容栏目体系、推荐与搜索能力,适配资讯/政企/协会等门户需求。',
tags: ['内容管理', '栏目', '审计']
},
{
title: '管理后台',
recommend: false,
desc: '多租户管理、角色权限、组织架构与可扩展菜单体系。',
tags: ['权限', '多租户', '审计']
},
{
title: '模板/插件市场',
recommend: false,
desc: '支持模板与插件购买、授权与更新,形成生态与增值体系。',
tags: ['市场', '授权', '更新', '变现']
}
]
</script>

View File

@@ -1,13 +0,0 @@
<template>
<div class="space-y-4">
<a-page-header title="云·企业官网" :ghost="false" class="page-header" />
<a-card :bordered="false">
<a-result status="info" title="模块已创建" sub-title="site 模块页面占位后续在此接入功能" />
</a-card>
</div>
</template>
<script setup lang="ts">
definePageMeta({ layout: 'site' })
</script>