From 3577c45295f8a763a89f6cfca9ec8c7febd6a877 Mon Sep 17 00:00:00 2001 From: wangtianqi Date: Thu, 31 Oct 2024 16:25:54 +0800 Subject: [PATCH] =?UTF-8?q?Like=20for=E9=81=8D=E5=8E=86=E6=94=B9some=20ess?= =?UTF-8?q?ay=20top=E5=AD=97=E6=AE=B5=E6=94=B9=E6=88=90state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/checkers/essay.ts | 4 +-- src/components/frontend/home/essays/index.ts | 2 +- .../frontend/home/essays/item/index.tsx | 2 +- src/data/i18n.ts | 3 +- src/entities/Essay.ts | 27 +++++++++++++--- src/pages/console/essay/list/index.ts | 2 +- .../console/essay/list/locales/zh_CN.json | 32 +++++++++---------- src/pages/console/essay/list/web.pc.tsx | 4 +-- src/pages/frontend/essay/details/index.ts | 12 ++----- src/triggers/essay.ts | 6 ++-- src/utils/projection.ts | 2 +- 11 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/checkers/essay.ts b/src/checkers/essay.ts index 838aabb..6d8da3b 100644 --- a/src/checkers/essay.ts +++ b/src/checkers/essay.ts @@ -14,7 +14,7 @@ const checkers: Checker[] = [ $or: [{ iState: 'unpublished' }, { iState: 'withdrawn' }], }, }, - // settop的时候只能是isTop为false的 + /* // settop的时候只能是isTop为false的 { entity: 'essay', action: 'setTop', @@ -31,7 +31,7 @@ const checkers: Checker[] = [ 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..bbe78a4 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 === 'top' && (
{t('common::top')}
diff --git a/src/data/i18n.ts b/src/data/i18n.ts index 7fcc0f2..d80a772 100644 --- a/src/data/i18n.ts +++ b/src/data/i18n.ts @@ -654,8 +654,7 @@ const i18ns: I18n[] = [ "images": "图片", "logs": "修改记录", "category": "分类", - "iState": "状态", - "isTop": "是否置顶" + "iState": "状态" }, "action": { "publish": "发布", diff --git a/src/entities/Essay.ts b/src/entities/Essay.ts index cbd4f27..b9b5662 100644 --- a/src/entities/Essay.ts +++ b/src/entities/Essay.ts @@ -17,11 +17,14 @@ export interface Schema extends EntityShape { images: ExtraFile[]; logs: Log[]; category?: Category; - isTop: Boolean; } export type IState = 'unpublished' | 'published' | 'withdrawn'; +export type TopState = 'top' | 'notTop'; + +export type TopAction = 'setTop' | 'cancelTop'; + export type IAction = 'publish' | 'withdraw'; export const IActionDef: ActionDef = { @@ -32,12 +35,19 @@ export const IActionDef: ActionDef = { is: 'unpublished', }; +export const TopActionDef: ActionDef = { + stm: { + setTop: ['notTop', 'top'], + cancelTop: ['top', 'notTop'], + }, + is: 'notTop', +}; + // 用户行为操作 -export type CommonAction = 'setTop' | 'cancelTop'; export type LikeAction = 'like' | 'unlike'; -type Action = IAction | CommonAction | LikeAction; +type Action = IAction | TopAction | LikeAction; export const entityDesc: EntityDesc< Schema, @@ -45,6 +55,7 @@ export const entityDesc: EntityDesc< '', { iState: IState; + topState: TopState; } > = { locales: { @@ -60,7 +71,7 @@ export const entityDesc: EntityDesc< logs: '修改记录', category: '分类', iState: '状态', - isTop: '是否置顶', + topState: '置顶状态', }, action: { publish: '发布', @@ -76,6 +87,10 @@ export const entityDesc: EntityDesc< published: '已发布', withdrawn: '已撤回', }, + topState: { + top: '已置顶', + notTop: '未置顶', + }, }, }, }, @@ -87,6 +102,10 @@ export const entityDesc: EntityDesc< published: '#87d068', withdrawn: '#2db7f5', }, + topState: { + top: '#87d068', + notTop: '#f50', + } }, }, indexes: [ diff --git a/src/pages/console/essay/list/index.ts b/src/pages/console/essay/list/index.ts index 6ddca61..713a591 100644 --- a/src/pages/console/essay/list/index.ts +++ b/src/pages/console/essay/list/index.ts @@ -9,7 +9,7 @@ export default OakComponent({ // 先按置顶排序 sorter: { $attr: { - isTop: 1, + topState: 1, }, $direction: 'desc', }, diff --git a/src/pages/console/essay/list/locales/zh_CN.json b/src/pages/console/essay/list/locales/zh_CN.json index 969a676..6a4e281 100644 --- a/src/pages/console/essay/list/locales/zh_CN.json +++ b/src/pages/console/essay/list/locales/zh_CN.json @@ -1,17 +1,17 @@ { - "essayList": "文章列表", - "title": "文章标题", - "summary": "文章摘要", - "author": "作者", - "action":{ - "setting": "设置" - }, - "label": { - "selectLabels": "选择标签" - }, - "essay":{ - "isTop": "已置顶", - "notTop": "未置顶" - }, - "cover": "封面" -} \ No newline at end of file + "essayList": "文章列表", + "title": "文章标题", + "summary": "文章摘要", + "author": "作者", + "action": { + "setting": "设置" + }, + "label": { + "selectLabels": "选择标签" + }, + "essay": { + "isTop": "已置顶", + "notTop": "未置顶" + }, + "cover": "封面" +} diff --git a/src/pages/console/essay/list/web.pc.tsx b/src/pages/console/essay/list/web.pc.tsx index c0130f9..04e99c6 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/pages/frontend/essay/details/index.ts b/src/pages/frontend/essay/details/index.ts index a246d92..9b5261b 100644 --- a/src/pages/frontend/essay/details/index.ts +++ b/src/pages/frontend/essay/details/index.ts @@ -9,15 +9,9 @@ export default OakComponent({ const fileIndex = data?.extraFile$entity?.findIndex( (item) => item.tag1 === 'cover' ); - let isSelfLiked = false; - if (data?.like$essay) { - for (let i = 0; i < data?.like$essay?.length; i++) { - if (data?.like$essay?.[i].creator.id === this.features.token.getUserId()) { - isSelfLiked = true - break - } - } - } + const isSelfLiked = data?.like$essay?.some( + (item) => item.creator.id === features.token.getUserId() + ); if (fileIndex !== undefined && fileIndex > -1) { const url = this.features.extraFile.getUrl( data!.extraFile$entity![fileIndex] diff --git a/src/triggers/essay.ts b/src/triggers/essay.ts index d93f68c..3c95c2d 100644 --- a/src/triggers/essay.ts +++ b/src/triggers/essay.ts @@ -15,7 +15,7 @@ const triggers: Trigger[] = [ assert(data && !(data instanceof Array)); // 若不存在meta,则初始化一个空对象 data.meta = data.meta || {}; - data.isTop = data.isTop || false; + /* data.isTop = data.isTop || false; */ assert(data.content, 'content is required'); if (!data.summary) { // 自动截取前面100个字符,加上省略号 @@ -27,7 +27,7 @@ const triggers: Trigger[] = [ return 1; }, }, - // action: setTop的时候设置isTop为true + /* // action: setTop的时候设置isTop为true { name: '置顶时设置isTop为true', entity: 'essay', @@ -52,7 +52,7 @@ const triggers: Trigger[] = [ data.isTop = false; return 1; }, - }, + }, */ // action: like的时候,增加点赞记录 { name: "like的时候,增加点赞记录", diff --git a/src/utils/projection.ts b/src/utils/projection.ts index 428e240..8c57ad4 100644 --- a/src/utils/projection.ts +++ b/src/utils/projection.ts @@ -61,7 +61,7 @@ export const essayProjection: EntityDict['essay']['Selection']['data'] = { name: 1, }, iState: 1, - isTop: 1, + topState: 1, // 相关labels essayLabels$essay: { $entity: 'essayLabels',