From 2d22e67ff3eac9329f56de1692cd21ab6a92b88d Mon Sep 17 00:00:00 2001 From: unknown <2182025330@QQ.COM> Date: Thu, 31 Oct 2024 17:23:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=87isTop=E4=BB=8E=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BA=86=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 1 + src/checkers/essay.ts | 19 +---- src/components/frontend/home/essays/index.ts | 2 +- .../frontend/home/essays/item/index.tsx | 2 +- src/data/i18n.ts | 45 +++++++++-- src/entities/Essay.ts | 28 +++++-- src/pages/console/essay/list/index.ts | 3 +- src/pages/console/essay/list/web.pc.tsx | 4 +- src/triggers/essay.ts | 81 +------------------ src/utils/projection.ts | 2 +- 10 files changed, 72 insertions(+), 115 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7a73a41..055d8dc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,2 +1,3 @@ { + "github.copilot.editor.enableAutoCompletions": true } \ No newline at end of file diff --git a/src/checkers/essay.ts b/src/checkers/essay.ts index 838aabb..936ae50 100644 --- a/src/checkers/essay.ts +++ b/src/checkers/essay.ts @@ -14,24 +14,7 @@ const checkers: Checker[] = [ $or: [{ iState: 'unpublished' }, { iState: 'withdrawn' }], }, }, - // settop的时候只能是isTop为false的 - { - entity: 'essay', - action: 'setTop', - type: 'row', - filter: { - isTop: false, - }, - }, - // cancelTop的时候只能是isTop为true的 - { - entity: 'essay', - action: 'cancelTop', - type: 'row', - filter: { - isTop: true, - }, - }, + // 在删除essay的时候,同步删除extraFile和essayLabels还有log // 注意,在checker中为非异步环境,这点与trigger不同 { diff --git a/src/components/frontend/home/essays/index.ts b/src/components/frontend/home/essays/index.ts index a9a36ad..020331f 100644 --- a/src/components/frontend/home/essays/index.ts +++ b/src/components/frontend/home/essays/index.ts @@ -9,7 +9,7 @@ export default OakComponent({ // 先按置顶排序 sorter: { $attr: { - isTop: 1, + topState: 1, }, $direction: 'desc', }, diff --git a/src/components/frontend/home/essays/item/index.tsx b/src/components/frontend/home/essays/item/index.tsx index 0c07bd8..ca04806 100644 --- a/src/components/frontend/home/essays/item/index.tsx +++ b/src/components/frontend/home/essays/item/index.tsx @@ -46,7 +46,7 @@ const EssayItem = (props: {
- {item.isTop && ( + {item.topState && (
{t('common::top')}
diff --git a/src/data/i18n.ts b/src/data/i18n.ts index 16c6800..13f7612 100644 --- a/src/data/i18n.ts +++ b/src/data/i18n.ts @@ -22,9 +22,9 @@ const i18ns: I18n[] = [ position: "src/pages/console/comment/list", data: { "pageTitle": "评论管理", - "content": "", - "creator": "", - "essay": "" + "content": "内容", + "creator": "创建者", + "essay": "文章" } }, { @@ -208,6 +208,14 @@ const i18ns: I18n[] = [ } } }, + { + id: "29381bca365eb7ac4abcf1d6dee6b61c", + namespace: "new-demo-c-console-likes", + language: "zh-CN", + module: "new-demo", + position: "src/components/console/likes", + data: {} + }, { id: "052936d351c8e58f6eb07d0a2e74d806", namespace: "new-demo-c-console-menu", @@ -333,7 +341,8 @@ const i18ns: I18n[] = [ "change": "修改", "finish": "完成", "creator": "创建人", - "top": "置顶" + "top": "置顶", + "like": "点赞" } }, { @@ -653,19 +662,25 @@ const i18ns: I18n[] = [ "logs": "修改记录", "category": "分类", "iState": "状态", - "isTop": "是否置顶" + "topState": "是否置顶" }, "action": { "publish": "发布", "withdraw": "撤回", "setTop": "置顶", - "cancelTop": "取消置顶" + "cancelTop": "取消置顶", + "like": "点赞", + "unlike": "取消点赞" }, "v": { "iState": { "unpublished": "未发布", "published": "已发布", "withdrawn": "已撤回" + }, + "topState": { + "Top": "已置顶", + "unTop": "未置顶" } } } @@ -784,6 +799,24 @@ const i18ns: I18n[] = [ } } }, + { + id: "25a720a152eb939d9835e630788e7dc1", + namespace: "likes", + language: "zh-CN", + module: "", + position: "oak-app-domain/Likes", + data: { + "name": "点赞", + "attr": { + "creator": "创建者", + "essay": "文章" + }, + "action": { + "like": "点赞", + "unlike": "取消点赞" + } + } + }, { id: "f3c966c0e1deb4ca4c10e10117143849", namespace: "livestream", diff --git a/src/entities/Essay.ts b/src/entities/Essay.ts index 6a495a4..9b620e2 100644 --- a/src/entities/Essay.ts +++ b/src/entities/Essay.ts @@ -17,9 +17,13 @@ export interface Schema extends EntityShape { images: ExtraFile[]; logs: Log[]; category?: Category; - isTop: Boolean; + //isTop: Boolean; } +export type TopState = 'Top' | 'unTop'; + +export type TopAction = 'setTop' | 'cancelTop'; + export type IState = 'unpublished' | 'published' | 'withdrawn'; export type IAction = 'publish' | 'withdraw'; @@ -32,14 +36,19 @@ export const IActionDef: ActionDef = { is: 'unpublished', }; -// 用户行为操作 -export type CommonAction = 'setTop' | 'cancelTop'; +export const TopActionDef: ActionDef = { + stm: { + setTop: ['unTop', 'Top'], + cancelTop: ['Top', 'unTop'] + }, + is: 'unTop', +} export type LikeAction = | 'like' | 'unlike'; -export type Action = IAction | CommonAction | LikeAction; +export type Action = IAction | LikeAction | TopAction; @@ -49,6 +58,7 @@ export const entityDesc: EntityDesc< '', { iState: IState; + topState: TopState; } > = { locales: { @@ -64,7 +74,7 @@ export const entityDesc: EntityDesc< logs: '修改记录', category: '分类', iState: '状态', - isTop: '是否置顶', + topState: '是否置顶', }, action: { publish: '发布', @@ -80,6 +90,10 @@ export const entityDesc: EntityDesc< published: '已发布', withdrawn: '已撤回', }, + topState: { + Top: '已置顶', + unTop: '未置顶', + }, }, }, }, @@ -91,6 +105,10 @@ export const entityDesc: EntityDesc< published: '#87d068', withdrawn: '#2db7f5', }, + topState: { + Top: '#ff0', + unTop: '#ccc', + }, }, }, indexes: [ diff --git a/src/pages/console/essay/list/index.ts b/src/pages/console/essay/list/index.ts index 6ddca61..0958c9b 100644 --- a/src/pages/console/essay/list/index.ts +++ b/src/pages/console/essay/list/index.ts @@ -1,4 +1,5 @@ import { essayProjection } from '@project/utils/projection'; +import { TopState } from '@project/entities/Essay'; export default OakComponent({ entity: 'essay', @@ -9,7 +10,7 @@ export default OakComponent({ // 先按置顶排序 sorter: { $attr: { - isTop: 1, + topState: 1, }, $direction: 'desc', }, diff --git a/src/pages/console/essay/list/web.pc.tsx b/src/pages/console/essay/list/web.pc.tsx index c0130f9..515e50c 100644 --- a/src/pages/console/essay/list/web.pc.tsx +++ b/src/pages/console/essay/list/web.pc.tsx @@ -67,7 +67,7 @@ const EssayList = ( render: (row) => { return ( <> - {row.isTop ? ( + {row.topState === "Top" ? ( {t('essay.isTop')} ) : ( {t('essay.notTop')} @@ -245,7 +245,7 @@ const EssayList = ( /> setShowSelectLabels(false)} onOk={() => { diff --git a/src/triggers/essay.ts b/src/triggers/essay.ts index 7c5cf6d..0fffc01 100644 --- a/src/triggers/essay.ts +++ b/src/triggers/essay.ts @@ -14,7 +14,7 @@ const triggers: Trigger[] = [ assert(data && !(data instanceof Array)); // 若不存在meta,则初始化一个空对象 data.meta = data.meta || {}; - data.isTop = data.isTop || false; + assert(data.content, 'content is required'); if (!data.summary) { // 自动截取前面100个字符,加上省略号 @@ -26,87 +26,8 @@ const triggers: Trigger[] = [ return 1; }, }, - // action: setTop的时候设置isTop为true - { - name: '置顶时设置isTop为true', - entity: 'essay', - action: 'setTop', - when: 'before', - fn: async ({ operation }, context, option) => { - const { id, data } = operation; - assert(data && !(data instanceof Array)); - data.isTop = true; - return 1; - }, - }, - // action: cancelTop的时候设置isTop为false - { - name: '取消置顶时设置isTop为false', - entity: 'essay', - action: 'cancelTop', - when: 'before', - fn: async ({ operation }, context, option) => { - const { id, data } = operation; - assert(data && !(data instanceof Array)); - data.isTop = false; - return 1; - }, - }, - - { - name: '点赞', - entity: 'essay', - action: 'create', // 假设我们有一个 action 名称 `createLike` 表示点赞 - when: 'after', - fn: async ({ operation }, context, option) => { - const { data } = operation; - assert(data && !Array.isArray(data)); - - // 获取当前用户 ID - const userId = context.getCurrentUserId(); - // 初始化 meta 和 likes 列表 - data.meta = data.meta || {}; - data.meta.likes = data.meta.likes || []; - // 检查用户是否已点赞 - if (!data.meta.likes.includes(userId)) { - // 添加用户 ID 到 likes 列表 - data.meta.likes.push(userId); - // 增加点赞计数 - data.likesCount = (data.likesCount || 0) + 1; - } - return 1; - }, - }, - - { - name: '取消点赞', - entity: 'essay', - action: 'create', // 假设我们有一个 action 名称 `removeLike` 表示取消点赞 - when: 'after', - fn: async ({ operation }, context, option) => { - const { data } = operation; - assert(data && !Array.isArray(data)); - - // 获取当前用户 ID - const userId = context.getCurrentUserId(); - // 初始化 meta 和 likes 列表 - data.meta = data.meta || {}; - data.meta.likes = data.meta.likes || []; - - // 检查用户是否已点赞 - const index = data.meta.likes.indexOf(userId); - if (index !== -1) { - // 从 likes 列表中移除用户 ID - data.meta.likes.splice(index, 1); - // 减少点赞计数 - data.likesCount = (data.likesCount || 0) - 1; - } - - return 1; - }, - } ]; export default triggers; diff --git a/src/utils/projection.ts b/src/utils/projection.ts index 96b030a..cf76b56 100644 --- a/src/utils/projection.ts +++ b/src/utils/projection.ts @@ -50,7 +50,7 @@ export const essayProjection: EntityDict['essay']['Selection']['data'] = { name: 1, }, iState: 1, - isTop: 1, + topState: 1, // 相关labels essayLabels$essay: { $entity: 'essayLabels',