Compare commits
3 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
3a86eb8fa2 | |
|
|
b89010ed51 | |
|
|
53edab4f35 |
|
|
@ -14,24 +14,6 @@ const checkers: Checker<EntityDict, 'essay', RuntimeCxt>[] = [
|
|||
$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不同
|
||||
{
|
||||
|
|
@ -88,23 +70,9 @@ const checkers: Checker<EntityDict, 'essay', RuntimeCxt>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
},
|
||||
() => {
|
||||
return context.operate(
|
||||
'comment',
|
||||
{
|
||||
action: 'remove',
|
||||
id: generateNewId(),
|
||||
data: {},
|
||||
filter: {
|
||||
essay: filter,
|
||||
},
|
||||
},
|
||||
option
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import React from 'react';
|
||||
import Styles from './styles.module.less';
|
||||
import CategoryList from './categories';
|
||||
import { useHomeContext } from './context/homeContext';
|
||||
|
||||
const FrontendHeader = () => {
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -5,14 +5,28 @@
|
|||
padding: 10px;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
height: 40px;
|
||||
|
||||
.title {
|
||||
height: 100%;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
// 内部文字居中
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 10px;
|
||||
|
||||
&:hover {
|
||||
color: #1890ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.noCategory {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 40px;
|
||||
color: #666;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ const CategoryList = (
|
|||
})}
|
||||
</div>
|
||||
) : (
|
||||
<div>{t('noCategaries')}</div>
|
||||
<div className={Styles.noCategory}>{t('noCategaries')}</div>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"enablePullDownRefresh": false,
|
||||
"usingComponents": {
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
export default OakComponent({
|
||||
entity: 'comment',
|
||||
isList: true,
|
||||
projection: {
|
||||
content: 1,
|
||||
},
|
||||
formData({ data }) {
|
||||
return {
|
||||
list: data,
|
||||
essayId: this.props.essayId
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"CommentSection":"评论区"
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
*{
|
||||
font-size: 18px;
|
||||
}
|
||||
.heading{
|
||||
font-size: 25px;
|
||||
color:rgb( 22,119,255);
|
||||
text-indent: 7em;
|
||||
font-family: Microsoft YaHei;
|
||||
}
|
||||
.messageArea{
|
||||
text-indent: 2em;
|
||||
}
|
||||
.editor {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
.left{
|
||||
flex: 1;
|
||||
margin-left: 15%;
|
||||
}
|
||||
|
||||
.right{
|
||||
margin-right: 15%;
|
||||
}
|
||||
}
|
||||
|
||||
.list {
|
||||
margin-left: 16.5%;
|
||||
margin-right: 15%;
|
||||
margin-bottom: 5px;
|
||||
.item {
|
||||
border: 1px solid rgb(60, 134, 236);
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
import React from 'react';
|
||||
import { EntityDict } from '@project/oak-app-domain';
|
||||
import { RowWithActions, WebComponentProps } from 'oak-frontend-base';
|
||||
import Styles from './styles.module.less';
|
||||
import { Input } from 'antd';
|
||||
import { Button } from 'antd';
|
||||
import useFeatures from '@project/hooks/useFeatures';
|
||||
|
||||
const { TextArea } = Input;
|
||||
|
||||
const List = (
|
||||
props: WebComponentProps<
|
||||
EntityDict,
|
||||
'comment',
|
||||
true,
|
||||
{
|
||||
list: RowWithActions<EntityDict, 'comment'>[];
|
||||
essayId: string;
|
||||
}
|
||||
>
|
||||
) => {
|
||||
const { list } = props.data;
|
||||
const { t, addItem, execute } = props.methods;
|
||||
const features = useFeatures();
|
||||
|
||||
const [newCommentText, setNewCommentText] = React.useState('');
|
||||
|
||||
const handleSubmit = () => {
|
||||
addItem({
|
||||
content: newCommentText,
|
||||
creatorId: features.token.getUserId(),
|
||||
essayId: props.data.essayId,
|
||||
});
|
||||
execute();
|
||||
//提交后清空输入框
|
||||
setNewCommentText('');
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<h3 className={Styles.heading}>{t('CommentSection')}</h3>
|
||||
|
||||
<div className={Styles.editor}>
|
||||
<div className={Styles.left}>
|
||||
{/* textarea*/}
|
||||
<TextArea
|
||||
showCount
|
||||
style={{
|
||||
width: '95%',
|
||||
height: '100px',
|
||||
resize: 'none',
|
||||
margin:'30px'
|
||||
}}
|
||||
placeholder='请输入评论'
|
||||
value={newCommentText}
|
||||
onChange={(e) => setNewCommentText(e.target.value)}
|
||||
></TextArea>
|
||||
</div>
|
||||
<div className={Styles.right}>
|
||||
{/* button */}
|
||||
<Button
|
||||
style={{
|
||||
width: "80px",
|
||||
height: "100px"
|
||||
}}
|
||||
type='primary'
|
||||
size='large'
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
{t('common::submit')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
{list && (
|
||||
<div className={Styles.list}>
|
||||
{list.map((item) => {
|
||||
return (
|
||||
<div key={item.id} className={`${Styles.item} ${Styles.messageArea}`}>
|
||||
{item.id}:{item.content}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default List;
|
||||
|
|
@ -98,6 +98,7 @@ export default OakComponent({
|
|||
cover: '',
|
||||
};
|
||||
}),
|
||||
searchParam: this.props.searchParam
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { EntityDict } from '@project/oak-app-domain';
|
||||
import { RowWithActions, WebComponentProps } from 'oak-frontend-base';
|
||||
import { RowWithActions } from 'oak-frontend-base';
|
||||
import Styles from './styles.module.less';
|
||||
import dayjs from 'dayjs';
|
||||
import useFeatures from '@project/hooks/useFeatures';
|
||||
|
|
@ -19,8 +19,6 @@ const EssayItem = (props: {
|
|||
};
|
||||
}) => {
|
||||
const { item, navigateTo, t, searchParam } = props;
|
||||
const features = useFeatures();
|
||||
// features.extraFile.
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -46,7 +44,7 @@ const EssayItem = (props: {
|
|||
</div>
|
||||
<div className={Styles.body}>
|
||||
<div className={Styles.title}>
|
||||
{item.topState === "isTop" && (
|
||||
{item.topState === 'top' && (
|
||||
<div className={Styles.top}>
|
||||
{t('common::top')}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
.noCover {
|
||||
width: 200px;
|
||||
height: 120px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background: #f0f0f0;
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.body {
|
||||
flex: 1;
|
||||
|
||||
|
|
@ -97,5 +110,10 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.creator {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,4 +83,9 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.categories {
|
||||
// 放一个属性但是不影响任何东西
|
||||
display: inherit;
|
||||
}
|
||||
|
|
@ -14,19 +14,6 @@ const i18ns: I18n[] = [
|
|||
"createCategory": "创建分类"
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "63f061bd7f1010b396cadb4bb784734f",
|
||||
namespace: "new-demo-p-console-comment-list",
|
||||
language: "zh-CN",
|
||||
module: "new-demo",
|
||||
position: "src/pages/console/comment/list",
|
||||
data: {
|
||||
"pageTitle": "评论列表",
|
||||
"content": "内容",
|
||||
"creator": "创建者",
|
||||
"essay": "文章"
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "4813a0a3acdfac90d3b3b3cfa37de82c",
|
||||
namespace: "new-demo-p-console-essay-list",
|
||||
|
|
@ -48,8 +35,7 @@ const i18ns: I18n[] = [
|
|||
"isTop": "已置顶",
|
||||
"notTop": "未置顶"
|
||||
},
|
||||
"cover": "封面",
|
||||
"label:selectLabels": "选择标签"
|
||||
"cover": "封面"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -137,7 +123,9 @@ const i18ns: I18n[] = [
|
|||
module: "new-demo",
|
||||
position: "src/pages/frontend/essay/details",
|
||||
data: {
|
||||
"like": "点赞"
|
||||
"like": "点赞",
|
||||
"liked": "已点赞",
|
||||
"unlike": "取消点赞"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -246,16 +234,6 @@ const i18ns: I18n[] = [
|
|||
"categories": "分类"
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "b0e6409d76cb424d29812006e349a91c",
|
||||
namespace: "new-demo-c-frontend-home-comment-list",
|
||||
language: "zh-CN",
|
||||
module: "new-demo",
|
||||
position: "src/components/frontend/home/comment/list",
|
||||
data: {
|
||||
"CommentSection": "评论区"
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "6fd812246bb915f692124fc05bb9ffd4",
|
||||
namespace: "new-demo-c-frontend-home-labels-byCategory",
|
||||
|
|
@ -362,8 +340,7 @@ const i18ns: I18n[] = [
|
|||
"userManage": "用户管理",
|
||||
"relationManage": "关系管理",
|
||||
"consoleHome": "控制台首页",
|
||||
"labelManage": "标签管理",
|
||||
"commentManage": "评论管理"
|
||||
"labelManage": "标签管理"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -584,35 +561,6 @@ const i18ns: I18n[] = [
|
|||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "deabf32f550dba8ce03111112ef588ce",
|
||||
namespace: "collect",
|
||||
language: "zh-CN",
|
||||
module: "",
|
||||
position: "oak-app-domain/Collect",
|
||||
data: {
|
||||
"name": "收藏记录",
|
||||
"attr": {
|
||||
"essay": "文章",
|
||||
"user": "用户"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "f70261a2fc23af2a9f459353e5ac1ea3",
|
||||
namespace: "comment",
|
||||
language: "zh-CN",
|
||||
module: "",
|
||||
position: "oak-app-domain/Comment",
|
||||
data: {
|
||||
"name": "评论",
|
||||
"attr": {
|
||||
"creator": "创建者",
|
||||
"content": "内容",
|
||||
"essay": "文章"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "b06ea1d96db9f0a2d2f3ff3ad966c9c5",
|
||||
namespace: "domain",
|
||||
|
|
@ -680,7 +628,7 @@ const i18ns: I18n[] = [
|
|||
"logs": "修改记录",
|
||||
"category": "分类",
|
||||
"iState": "状态",
|
||||
"topState": "置顶"
|
||||
"topState": "置顶状态"
|
||||
},
|
||||
"action": {
|
||||
"publish": "发布",
|
||||
|
|
@ -688,9 +636,7 @@ const i18ns: I18n[] = [
|
|||
"setTop": "置顶",
|
||||
"cancelTop": "取消置顶",
|
||||
"like": "点赞",
|
||||
"unlike": "取消点赞",
|
||||
"collect": "收藏",
|
||||
"uncollect": "取消收藏"
|
||||
"unlike": "取消点赞"
|
||||
},
|
||||
"v": {
|
||||
"iState": {
|
||||
|
|
@ -699,8 +645,8 @@ const i18ns: I18n[] = [
|
|||
"withdrawn": "已撤回"
|
||||
},
|
||||
"topState": {
|
||||
"isTop": "已置顶",
|
||||
"notTop": "未置顶"
|
||||
"top": "置顶",
|
||||
"normal": "普通"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
import { String } from 'oak-domain/lib/types/DataType';
|
||||
import { Schema as User } from 'oak-general-business/lib/entities/User';
|
||||
import { Schema as Essay } from './Essay';
|
||||
import { EntityDesc, EntityShape } from 'oak-domain/lib/types';
|
||||
|
||||
//Comment.ts
|
||||
export interface Schema extends EntityShape {
|
||||
creator: User;
|
||||
content: String<1024>;
|
||||
essay: Essay;
|
||||
}
|
||||
|
||||
export const entityDesc: EntityDesc<Schema> = {
|
||||
locales: {
|
||||
zh_CN: {
|
||||
name: '评论',
|
||||
attr: {
|
||||
creator: '创建者',
|
||||
content: '内容',
|
||||
essay: '文章'
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
// import { TopAction } from './Essay';
|
||||
import { String, Text, Boolean } from 'oak-domain/lib/types/DataType';
|
||||
import { ActionDef, EntityDesc, EntityShape } from 'oak-domain/lib/types';
|
||||
import { Schema as User } from 'oak-general-business/lib/entities/User';
|
||||
|
|
@ -6,7 +5,6 @@ import { Schema as ExtraFile } from 'oak-general-business/lib/entities/ExtraFile
|
|||
import { Schema as Log } from 'oak-domain/lib/entities/Log';
|
||||
import { Schema as Category } from './Category';
|
||||
|
||||
|
||||
export type MetaData = Record<string, any>;
|
||||
|
||||
// Essay.ts
|
||||
|
|
@ -19,18 +17,12 @@ export interface Schema extends EntityShape {
|
|||
images: ExtraFile[];
|
||||
logs: Log[];
|
||||
category?: Category;
|
||||
// isTop: Boolean;
|
||||
}
|
||||
|
||||
export type IState = 'unpublished' | 'published' | 'withdrawn';
|
||||
|
||||
export type IAction = 'publish' | 'withdraw';
|
||||
|
||||
//置顶状态
|
||||
export type TopState = 'isTop' | 'noTop';
|
||||
|
||||
export type TopAction = 'setTop' | 'cancelTop';
|
||||
|
||||
export const IActionDef: ActionDef<IAction, IState> = {
|
||||
stm: {
|
||||
publish: [['unpublished', 'withdrawn'], 'published'],
|
||||
|
|
@ -39,21 +31,23 @@ export const IActionDef: ActionDef<IAction, IState> = {
|
|||
is: 'unpublished',
|
||||
};
|
||||
|
||||
// 用户行为操作
|
||||
export type TopAction = 'setTop' | 'cancelTop';
|
||||
|
||||
export type TopState = 'top' | 'normal';
|
||||
|
||||
export const TopActionDef: ActionDef<TopAction, TopState> = {
|
||||
stm: {
|
||||
setTop: ['noTop', 'isTop'],
|
||||
cancelTop: ['isTop', 'noTop'],
|
||||
setTop: ['normal', 'top'],
|
||||
cancelTop: ['top', 'normal'],
|
||||
},
|
||||
is: 'noTop',
|
||||
is: 'normal',
|
||||
};
|
||||
|
||||
//点赞操作
|
||||
export type LikeAction = 'like'|'unlike';
|
||||
|
||||
// 用户行为操作
|
||||
type Action = IAction | TopAction| LikeAction;
|
||||
type State = IState | TopState;
|
||||
// 点赞操作
|
||||
export type LikeAction = 'like' | 'unlike';
|
||||
|
||||
type Action = IAction | TopAction | LikeAction;
|
||||
|
||||
export const entityDesc: EntityDesc<
|
||||
Schema,
|
||||
|
|
@ -77,8 +71,7 @@ export const entityDesc: EntityDesc<
|
|||
logs: '修改记录',
|
||||
category: '分类',
|
||||
iState: '状态',
|
||||
// isTop: '是否置顶',
|
||||
topState:'置顶',
|
||||
topState: '置顶状态',
|
||||
},
|
||||
action: {
|
||||
publish: '发布',
|
||||
|
|
@ -86,7 +79,7 @@ export const entityDesc: EntityDesc<
|
|||
setTop: '置顶',
|
||||
cancelTop: '取消置顶',
|
||||
like: '点赞',
|
||||
unlike:'取消点赞'
|
||||
unlike: '取消点赞',
|
||||
},
|
||||
v: {
|
||||
iState: {
|
||||
|
|
@ -95,9 +88,9 @@ export const entityDesc: EntityDesc<
|
|||
withdrawn: '已撤回',
|
||||
},
|
||||
topState: {
|
||||
isTop: "置顶",
|
||||
noTop: "不置顶"
|
||||
}
|
||||
top: '置顶',
|
||||
normal: '普通',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -110,9 +103,9 @@ export const entityDesc: EntityDesc<
|
|||
withdrawn: '#2db7f5',
|
||||
},
|
||||
topState: {
|
||||
isTop: "#a00",
|
||||
noTop: "#0b0"
|
||||
}
|
||||
top: '#f50',
|
||||
normal: '#87d068',
|
||||
},
|
||||
},
|
||||
},
|
||||
indexes: [
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { Schema as Essay } from './Essay';
|
|||
import { Schema as User } from 'oak-general-business/lib/entities/User';
|
||||
|
||||
// Like.ts
|
||||
// 关联文章和用户,表示点赞记录
|
||||
// 关联文章和用户,表示点赞记录
|
||||
export interface Schema extends EntityShape {
|
||||
essay: Essay;
|
||||
user: User;
|
||||
|
|
@ -15,7 +15,7 @@ export const entityDesc: EntityDesc<Schema> = {
|
|||
name: '点赞记录',
|
||||
attr: {
|
||||
essay: '文章',
|
||||
user:'用户',
|
||||
user: '用户',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -38,22 +38,25 @@ const menus: IMenu[] = [
|
|||
name: 'consoleHome',
|
||||
icon: 'workbench',
|
||||
url: '/home',
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
order: 0,
|
||||
actions: ['select'],
|
||||
},
|
||||
{
|
||||
name: 'userManage',
|
||||
icon: 'addpeople',
|
||||
url: '/userRelation/manage',
|
||||
parent: 'System',
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
actions: ['select'],
|
||||
},
|
||||
{
|
||||
name: 'relationManage',
|
||||
icon: 'share',
|
||||
url: '/relation/entityList',
|
||||
parent: 'System',
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
actions: ['select'],
|
||||
},
|
||||
// category
|
||||
{
|
||||
|
|
@ -61,14 +64,16 @@ const menus: IMenu[] = [
|
|||
icon: 'stealth',
|
||||
url: '/category/list',
|
||||
order: 2,
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
actions: ['select'],
|
||||
},
|
||||
{
|
||||
name: 'essayManage',
|
||||
icon: 'barrage',
|
||||
url: '/essay/list',
|
||||
order: 3,
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
actions: ['select'],
|
||||
},
|
||||
// 标签关联
|
||||
{
|
||||
|
|
@ -76,16 +81,9 @@ const menus: IMenu[] = [
|
|||
icon: 'accessory',
|
||||
url: '/label/list',
|
||||
order: 4,
|
||||
destEntity: '',
|
||||
destEntity: 'userRelation',
|
||||
actions: ['select'],
|
||||
},
|
||||
// 评论管理
|
||||
{
|
||||
name: 'commentManage',
|
||||
icon: 'message',
|
||||
url: '/comment/list',
|
||||
destEntity: '',
|
||||
order: 5,
|
||||
}
|
||||
];
|
||||
|
||||
export default class Console extends BaseConsole<EntityDict, IMenu> {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,5 @@
|
|||
"userManage": "用户管理",
|
||||
"relationManage": "关系管理",
|
||||
"consoleHome" : "控制台首页",
|
||||
"labelManage": "标签管理",
|
||||
"commentManage": "评论管理"
|
||||
"labelManage": "标签管理"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"enablePullDownRefresh": false,
|
||||
"usingComponents": {
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
export default OakComponent({
|
||||
entity: 'comment',
|
||||
isList: true,
|
||||
projection: {
|
||||
content: 1,
|
||||
essay: {
|
||||
title: 1,
|
||||
},
|
||||
creator: {
|
||||
name: 1,
|
||||
nickname: 1,
|
||||
}
|
||||
},
|
||||
formData({ data }) {
|
||||
return {
|
||||
list: data,
|
||||
};
|
||||
},
|
||||
actions: ['update', 'remove'],
|
||||
});
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"pageTitle": "评论列表",
|
||||
"content": "内容",
|
||||
"creator": "创建者",
|
||||
"essay": "文章"
|
||||
}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
.id {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.item {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
import React from 'react';
|
||||
import { EntityDict } from '@project/oak-app-domain';
|
||||
import { CascadeActionProps, RowWithActions, WebComponentProps } from 'oak-frontend-base';
|
||||
import Styles from './styles.module.less';
|
||||
import PageHeader from 'oak-frontend-base/es/components/pageHeader2';
|
||||
import { ListPro } from '@project/components/AbstractComponents';
|
||||
import labels from '@project/components/frontend/home/labels';
|
||||
import { render } from 'nprogress';
|
||||
|
||||
const List = (
|
||||
props: WebComponentProps<
|
||||
EntityDict,
|
||||
'comment',
|
||||
true,
|
||||
{
|
||||
list: RowWithActions<EntityDict, 'comment'>[];
|
||||
}
|
||||
>
|
||||
) => {
|
||||
const { list } = props.data;
|
||||
const { t } = props.methods;
|
||||
const { removeItem, execute } = props.methods;
|
||||
|
||||
const attrs = [
|
||||
{
|
||||
path: 'content',
|
||||
label: t('content'),
|
||||
render: (row: any) => {
|
||||
return row.content;
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'creator',
|
||||
label: t('creator'),
|
||||
render: (row: any) => {
|
||||
return row.creator?.name || row.creator?.nickname || '';
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'essay',
|
||||
label: t('essay'),
|
||||
render: (row: any) => {
|
||||
return row.essay?.title || '';
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
const onAction = (row: any, action: string) => {
|
||||
switch (action) {
|
||||
case 'update':
|
||||
break;
|
||||
case 'remove':
|
||||
removeItem(row.id);
|
||||
execute();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<PageHeader title={t('pageTitle')}>
|
||||
<ListPro
|
||||
entity="comment"
|
||||
data={list}
|
||||
attributes={attrs}
|
||||
oakPath={'${oakFullPath}'}
|
||||
onAction={onAction}
|
||||
></ListPro>
|
||||
</PageHeader>
|
||||
);
|
||||
};
|
||||
|
||||
export default List;
|
||||
|
||||
|
||||
|
|
@ -9,9 +9,9 @@ export default OakComponent({
|
|||
// 先按置顶排序
|
||||
sorter: {
|
||||
$attr: {
|
||||
topState: 1,
|
||||
topState: 1,
|
||||
},
|
||||
$direction: 'desc',
|
||||
$direction: 'asc',
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -52,5 +52,5 @@ export default OakComponent({
|
|||
}),
|
||||
};
|
||||
},
|
||||
actions: ['update', 'withdraw', 'publish', 'setTop', 'cancelTop', 'remove'],
|
||||
actions: ['update', 'withdraw', 'publish', 'remove', 'setTop', 'cancelTop'],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,18 +1,17 @@
|
|||
{
|
||||
"essayList": "文章列表",
|
||||
"title": "文章标题",
|
||||
"summary": "文章摘要",
|
||||
"author": "作者",
|
||||
"action": {
|
||||
"setting": "设置"
|
||||
},
|
||||
"label": {
|
||||
"selectLabels": "选择标签"
|
||||
},
|
||||
"essay": {
|
||||
"isTop": "已置顶",
|
||||
"notTop": "未置顶"
|
||||
},
|
||||
"cover": "封面",
|
||||
"label:selectLabels": "选择标签"
|
||||
"essayList": "文章列表",
|
||||
"title": "文章标题",
|
||||
"summary": "文章摘要",
|
||||
"author": "作者",
|
||||
"action":{
|
||||
"setting": "设置"
|
||||
},
|
||||
"label": {
|
||||
"selectLabels": "选择标签"
|
||||
},
|
||||
"essay":{
|
||||
"isTop": "已置顶",
|
||||
"notTop": "未置顶"
|
||||
},
|
||||
"cover": "封面"
|
||||
}
|
||||
|
|
@ -29,6 +29,16 @@
|
|||
gap: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.left{
|
||||
float: left;
|
||||
|
||||
.noCover {
|
||||
width: 100px;
|
||||
height: 50px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background: #f0f0f0;
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
|
@ -68,7 +68,7 @@ const EssayList = (
|
|||
render: (row) => {
|
||||
return (
|
||||
<>
|
||||
{row.topState === "isTop" ? (
|
||||
{row.topState === "top" ? (
|
||||
<Tag color='#f50'>{t('essay.isTop')}</Tag>
|
||||
) : (
|
||||
<Tag color='#108ee9'>{t('essay.notTop')}</Tag>
|
||||
|
|
@ -209,24 +209,16 @@ const EssayList = (
|
|||
updateItem({}, row.id, 'remove');
|
||||
execute();
|
||||
break;
|
||||
// 置顶和取消置顶
|
||||
// case 'setTop':
|
||||
// case 'cancelTop':
|
||||
// updateItem({}, row.id, action);
|
||||
// execute();
|
||||
// break;
|
||||
|
||||
default:
|
||||
updateItem({}, row.id, action as Action );
|
||||
updateItem({}, row.id, action as Action);
|
||||
execute();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<PageHeader
|
||||
title={<div className={Styles.left}>{t('essayList')}</div>}
|
||||
title={t('essayList')}
|
||||
extra={
|
||||
<Button
|
||||
type='primary'
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import item from '@project/components/console/labels/item';
|
||||
import { essayProjection } from '@project/utils/projection';
|
||||
|
||||
export default OakComponent({
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
{
|
||||
"like": "点赞"
|
||||
"like": "点赞",
|
||||
"liked": "已点赞",
|
||||
"unlike": "取消点赞"
|
||||
}
|
||||
|
|
@ -3,6 +3,22 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.back {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.nums {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.likes {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.top {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
|
@ -115,17 +131,4 @@
|
|||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.likes{
|
||||
font-size: 12px;
|
||||
float : right;
|
||||
}
|
||||
|
||||
.back {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.nums{
|
||||
font-size: 12px;
|
||||
}
|
||||
|
|
@ -6,8 +6,6 @@ import MdViewer from '@project/components/common/byteMD/MdViewer';
|
|||
import FrontendFooter from '@project/components/frontend/home/FrontendFooter';
|
||||
import { Button } from 'antd';
|
||||
import { VerticalAlignTopOutlined } from '@ant-design/icons';
|
||||
import List from '@project/components/frontend/home/comment/list';
|
||||
|
||||
import OakIcon from 'oak-frontend-base/es/components/icon';
|
||||
|
||||
const EssayDetails = (
|
||||
|
|
@ -23,8 +21,6 @@ const EssayDetails = (
|
|||
}
|
||||
>
|
||||
) => {
|
||||
const { oakFullpath } = props.data;
|
||||
|
||||
const { item, cover, isLiked, likeNums } = props.data;
|
||||
const [showScrollTop, setShowScrollTop] = useState(false);
|
||||
const { t, update, execute } = props.methods;
|
||||
|
|
@ -82,37 +78,35 @@ const EssayDetails = (
|
|||
>
|
||||
返回
|
||||
</Button>
|
||||
</div>
|
||||
<div className={Styles.likes}>
|
||||
{isLiked ? (
|
||||
<Button
|
||||
onClick={() => {
|
||||
update({}, 'unlike');
|
||||
execute();
|
||||
}}
|
||||
shape='circle'
|
||||
>
|
||||
<OakIcon name='praise_fill' size={24} />
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
shape='circle'
|
||||
onClick={() => {
|
||||
update({}, 'like');
|
||||
execute();
|
||||
}}
|
||||
>
|
||||
<OakIcon name='praise' size={24} />
|
||||
</Button>
|
||||
)}
|
||||
<div className={Styles.nums}>{likeNums}</div>
|
||||
|
||||
<div className={Styles.likes}>
|
||||
{isLiked ? (
|
||||
<Button
|
||||
onClick={() => {
|
||||
update({
|
||||
}, 'unlike');
|
||||
execute();
|
||||
}}
|
||||
shape='circle'
|
||||
>
|
||||
<OakIcon name='praise_fill' size={24} />
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
shape='circle'
|
||||
onClick={() => {
|
||||
update({}, 'like');
|
||||
execute();
|
||||
}}
|
||||
>
|
||||
<OakIcon name='praise' size={24} />
|
||||
</Button>
|
||||
)}
|
||||
<div className={Styles.nums}>{likeNums}</div>
|
||||
</div>
|
||||
</div>
|
||||
<MdViewer md={item.content!} />
|
||||
</div>
|
||||
<List
|
||||
oakPath={`${oakFullpath}.comment$essay`}
|
||||
essayId={item.id}
|
||||
></List>
|
||||
<div className={Styles.blank}></div>
|
||||
</>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
import { Filter } from './../oak-app-domain/Essay/Schema';
|
||||
import { IdAction } from './../oak-app-domain/User/Action';
|
||||
import { EntityDict } from '@oak-app-domain';
|
||||
import { RemoveTrigger, Trigger } from 'oak-domain/lib/types';
|
||||
import { Trigger } from 'oak-domain/lib/types';
|
||||
import { BackendRuntimeContext } from '../context/BackendRuntimeContext';
|
||||
import assert from 'assert';
|
||||
import Operation from 'antd/es/transfer/operation';
|
||||
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
|
||||
|
||||
const triggers: Trigger<EntityDict, 'essay', BackendRuntimeContext>[] = [
|
||||
|
|
@ -18,7 +15,6 @@ const triggers: Trigger<EntityDict, 'essay', BackendRuntimeContext>[] = [
|
|||
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个字符,加上省略号
|
||||
|
|
@ -27,89 +23,60 @@ const triggers: Trigger<EntityDict, 'essay', BackendRuntimeContext>[] = [
|
|||
? data.content.slice(0, 100) + '...'
|
||||
: data.content;
|
||||
}
|
||||
return 1;
|
||||
return 0;
|
||||
},
|
||||
},
|
||||
// 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;
|
||||
},
|
||||
},
|
||||
// 调用like的action的时候,创建点赞的记录
|
||||
{
|
||||
name: '调用like的action的时候,创建点赞的记录',
|
||||
entity: 'essay',
|
||||
action: 'like',
|
||||
when: 'before',
|
||||
|
||||
name: "调用like的action的时候,创建点赞的记录",
|
||||
entity: "essay",
|
||||
action: "like",
|
||||
when: "before",
|
||||
fn: async ({ operation }, context, option) => {
|
||||
const { filter } = operation;
|
||||
assert(filter && filter.id, "filter is required");
|
||||
const essayId = filter.id;
|
||||
const eId = filter.id;
|
||||
const userId = context.getCurrentUserId();
|
||||
//创建点赞记录
|
||||
const opers=await context.operate("like", {
|
||||
// 创建点赞记录
|
||||
const opres = await context.operate("like", {
|
||||
id: await generateNewIdAsync(),
|
||||
action: "create",
|
||||
data: {
|
||||
id: await generateNewIdAsync(),
|
||||
essayId : essayId as string,
|
||||
userId,
|
||||
|
||||
}
|
||||
},option)
|
||||
|
||||
return opers.like?.create||0;
|
||||
},
|
||||
},
|
||||
// 调用unlike的action的时候,移除点赞的记录
|
||||
{
|
||||
name: '调用like的action的时候,删除点赞的记录',
|
||||
entity: 'essay',
|
||||
action: 'unlike',
|
||||
when: 'before',
|
||||
id: await generateNewIdAsync(),
|
||||
essayId: eId as string,
|
||||
userId,
|
||||
}
|
||||
}, option)
|
||||
|
||||
return opres.like?.create || 0;
|
||||
}
|
||||
},
|
||||
// 调用unlike的action的时候,移除点赞的记录
|
||||
{
|
||||
name: "调用unlike的action的时候,移除点赞的记录",
|
||||
entity: "essay",
|
||||
action: "unlike",
|
||||
when: "before",
|
||||
fn: async ({ operation }, context, option) => {
|
||||
const { filter, data} = operation;
|
||||
const { filter, data } = operation;
|
||||
assert(filter && filter.id, "filter is required");
|
||||
const essayId = filter.id;
|
||||
const eId = filter.id;
|
||||
const userId = context.getCurrentUserId();
|
||||
//创建点赞记录
|
||||
const opers=await context.operate("like", {
|
||||
// 创建点赞记录
|
||||
const opres = await context.operate("like", {
|
||||
id: await generateNewIdAsync(),
|
||||
action: "remove",
|
||||
data: {
|
||||
},
|
||||
filter: {
|
||||
essayId,
|
||||
essayId: eId as string,
|
||||
userId,
|
||||
}
|
||||
},option)
|
||||
|
||||
return opers.like?.remove||0;
|
||||
},
|
||||
},
|
||||
}, option)
|
||||
|
||||
return opres.like?.remove || 0;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
export default triggers;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
const sequence = count + 1;
|
||||
data.sequence = sequence;
|
||||
data.meta = {};
|
||||
return 1;
|
||||
return 0;
|
||||
},
|
||||
},
|
||||
// 在create之前,查询essayId和labelId的组合是否已经存在,如果存在则不允许创建
|
||||
|
|
@ -83,7 +83,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
if (count3 > 0) {
|
||||
throw new OakUserException('该标签已经关联到文章中');
|
||||
}
|
||||
return 1;
|
||||
return 0;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -143,7 +143,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
option
|
||||
);
|
||||
// 将其和当前的seq互换
|
||||
await context.operate(
|
||||
const opres1 = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -157,7 +157,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
await context.operate(
|
||||
const opres2 = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -172,7 +172,10 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
option
|
||||
);
|
||||
|
||||
return 1;
|
||||
return (
|
||||
(opres1.essayLabels?.update || 0) +
|
||||
(opres2.essayLabels?.update || 0)
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -242,7 +245,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
option
|
||||
);
|
||||
// 将其和当前的seq互换
|
||||
await context.operate(
|
||||
const opres1 = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -256,7 +259,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
await context.operate(
|
||||
const opres2 = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -270,7 +273,10 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
return 1;
|
||||
return (
|
||||
(opres1.essayLabels?.update || 0) +
|
||||
(opres2.essayLabels?.update || 0)
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -291,6 +297,9 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
id && nextId,
|
||||
'id and nextId are required when moving essayLabels'
|
||||
);
|
||||
|
||||
let res = 0;
|
||||
|
||||
// 查询当前 essayLabel 和目标 essayLabel 的信息
|
||||
const [currentLabel, nextLabel] = await Promise.all([
|
||||
context.select(
|
||||
|
|
@ -342,7 +351,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
);
|
||||
|
||||
for (const label of affectedLabels) {
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -352,6 +361,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
} else {
|
||||
// 下移逻辑
|
||||
|
|
@ -371,7 +381,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
);
|
||||
|
||||
for (const label of affectedLabels) {
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -381,11 +391,13 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新当前 essayLabel 的 sequence
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -395,12 +407,14 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
|
||||
res += opres.essayLabels?.update || 0;
|
||||
} else {
|
||||
// 位置相同,无需移动
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return res;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -414,6 +428,8 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
const { id } = filter as { id: string };
|
||||
assert(id, 'id is required when moving essayLabels to first');
|
||||
|
||||
let res = 0;
|
||||
|
||||
// 查询当前 essayLabel 的信息
|
||||
const [currentLabel] = await context.select(
|
||||
'essayLabels',
|
||||
|
|
@ -450,7 +466,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
|
||||
// 更新受影响的 essayLabels
|
||||
for (const label of affectedLabels) {
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -460,10 +476,11 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
|
||||
// 将当前 essayLabels 移到第一位
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -473,9 +490,10 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return res;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -489,6 +507,8 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
const { id } = filter as { id: string };
|
||||
assert(id, 'id is required when moving essayLabels to last');
|
||||
|
||||
let res = 0;
|
||||
|
||||
// 查询当前 essayLabels 的信息
|
||||
const [currentLabel] = await context.select(
|
||||
'essayLabels',
|
||||
|
|
@ -538,7 +558,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
|
||||
// 更新受影响的 essayLabels
|
||||
for (const label of affectedLabels) {
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -548,10 +568,12 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
|
||||
// 将当前 essayLabels 移到最后一位
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -561,9 +583,11 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return res;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -575,6 +599,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
const { filter } = operation;
|
||||
assert(filter);
|
||||
|
||||
let res = 0;
|
||||
// 因为删除可能是一个批量操作,filter可以查询到0-n条记录
|
||||
const essayLabels = await context.select(
|
||||
'essayLabels',
|
||||
|
|
@ -609,7 +634,7 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
|
||||
// 更新受影响的 essayLabels
|
||||
for (const label of affectedLabels) {
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -619,9 +644,11 @@ const triggers: Trigger<EntityDict, 'essayLabels', BackendRuntimeContext>[] = [
|
|||
},
|
||||
option
|
||||
);
|
||||
|
||||
res += opres.essayLabels?.update || 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
return res;
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ const triggers: Trigger<EntityDict, 'label', BackendRuntimeContext>[] = [
|
|||
const { data } = operation;
|
||||
assert(data && !Array.isArray(data));
|
||||
data.meta = {};
|
||||
return 1;
|
||||
return 0;
|
||||
},
|
||||
},
|
||||
// 在执行addToEssay时,将创建essayLabels,将label关联到essay中
|
||||
|
|
@ -57,7 +57,7 @@ const triggers: Trigger<EntityDict, 'label', BackendRuntimeContext>[] = [
|
|||
}
|
||||
|
||||
// 创建关联
|
||||
await context.operate(
|
||||
const opres = await context.operate(
|
||||
'essayLabels',
|
||||
{
|
||||
id: await generateNewIdAsync(),
|
||||
|
|
@ -71,7 +71,7 @@ const triggers: Trigger<EntityDict, 'label', BackendRuntimeContext>[] = [
|
|||
option
|
||||
);
|
||||
|
||||
return 1;
|
||||
return opres.essayLabels?.create || 0;
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -81,15 +81,16 @@ export const essayProjection: EntityDict['essay']['Selection']['data'] = {
|
|||
},
|
||||
count: 1,
|
||||
},
|
||||
//点赞相关的记录
|
||||
// 点赞相关的记录
|
||||
like$essay: {
|
||||
$entity: "like",
|
||||
data: {
|
||||
id: 1,
|
||||
user: {
|
||||
id: 1,
|
||||
name: 1,
|
||||
nickname: 1,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue