|
@@ -0,0 +1,323 @@
|
|
|
+import { DataModel, transformArrayDataModel, type KeyValue, type NewDataModel } from '@imengyu/js-request-transform';
|
|
|
+import { AppServerRequestModule } from './RequestModules';
|
|
|
+import type { QueryParams } from '@/common/request/utils/AllType';
|
|
|
+import { transformSomeToArray } from '@/common/request/utils/Utils';
|
|
|
+
|
|
|
+export class GetColumListParams extends DataModel<GetColumListParams> {
|
|
|
+
|
|
|
+ public constructor() {
|
|
|
+ super(GetColumListParams);
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 主体栏目id
|
|
|
+ */
|
|
|
+ mainBodyColumnId: number|number[] = 0;
|
|
|
+ /**
|
|
|
+ * 标志:hot=热门,recommend=推荐,top=置顶
|
|
|
+ */
|
|
|
+ flag ?: 'hot'|'recommend'|'top';
|
|
|
+ /**
|
|
|
+ * 内容数量,默认4
|
|
|
+ */
|
|
|
+ size = 4;
|
|
|
+}
|
|
|
+export class GetContentListParams extends DataModel<GetContentListParams> {
|
|
|
+
|
|
|
+ public constructor() {
|
|
|
+ super(GetContentListParams);
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ this._convertTable = {
|
|
|
+ ids: {
|
|
|
+ customToServerFn: (val) => (val as number[]).join(','),
|
|
|
+ customToClientFn: (val) => (val as string).split(',').map((item) => parseInt(item)),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 主体栏目id
|
|
|
+ */
|
|
|
+ mainBodyColumnId: number|number[] = 0;
|
|
|
+ /**
|
|
|
+ * 标志:hot=热门,recommend=推荐,top=置顶
|
|
|
+ */
|
|
|
+ flag ?: 'hot'|'recommend'|'top';
|
|
|
+ /**
|
|
|
+ * 内容id(逗号隔开)如:3 或者 1,2,3
|
|
|
+ */
|
|
|
+ ids?: number[];
|
|
|
+ /**
|
|
|
+ * 类型:1=文章,2=音频,3=视频,4=相册
|
|
|
+ */
|
|
|
+ type?: 1|2|3|4;
|
|
|
+ /**
|
|
|
+ * 内容数量,默认4
|
|
|
+ */
|
|
|
+ size = 4;
|
|
|
+ /**
|
|
|
+ * 关键字查询
|
|
|
+ */
|
|
|
+ keywords?: string;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+export class GetColumContentList extends DataModel<GetColumContentList> {
|
|
|
+ constructor() {
|
|
|
+ super(GetColumContentList, "主体栏目列表");
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ this._convertTable = {
|
|
|
+ id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
|
|
|
+ name: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
|
|
|
+ content_list: {
|
|
|
+ clientSide: 'array',
|
|
|
+ clientSideRequired: true,
|
|
|
+ clientSideChildDataModel: GetContentListItem,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ name = '';
|
|
|
+ overview = '';
|
|
|
+}
|
|
|
+export class GetContentListItem extends DataModel<GetContentListItem> {
|
|
|
+ constructor() {
|
|
|
+ super(GetContentListItem, "内容列表");
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ this._convertTable = {
|
|
|
+ id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
|
|
|
+ mainBodyColumnId: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
|
|
|
+ title: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
|
|
|
+ isGuest: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isLogin: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isComment: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isLike: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isCollect: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ latitude: { clientSide: 'number', serverSide: 'number' },
|
|
|
+ longitude: { clientSide: 'number', serverSide: 'number' },
|
|
|
+ publish_at: { clientSide: 'date', serverSide: 'string' },
|
|
|
+ flag: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
|
|
|
+ tags: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
|
|
|
+ keywords: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
|
|
|
+ type: { clientSide: 'number', serverSide: 'number' },
|
|
|
+ };
|
|
|
+ this._convertKeyType = (key, direction) => {
|
|
|
+ if (key.endsWith('Time'))
|
|
|
+ return {
|
|
|
+ clientSide: 'date',
|
|
|
+ serverSide: 'string',
|
|
|
+ };
|
|
|
+ return undefined;
|
|
|
+ };
|
|
|
+ }
|
|
|
+ id = 0;
|
|
|
+ mainBodyColumnId = 0;
|
|
|
+ latitude = 0;
|
|
|
+ longitude = 0;
|
|
|
+ mapX = '';
|
|
|
+ mapY = '';
|
|
|
+ from = '';
|
|
|
+ modelId = 0;
|
|
|
+ title = '!title';
|
|
|
+ typeText = '';
|
|
|
+ region = 0;
|
|
|
+ image = '';
|
|
|
+ thumbnail = '';
|
|
|
+ desc = '!desc';
|
|
|
+ content = '!content';
|
|
|
+ type = 0;
|
|
|
+ keywords ?: string[];
|
|
|
+ flag ?: string[];
|
|
|
+ tags ?: string[];
|
|
|
+ views = 0;
|
|
|
+ comments = 0;
|
|
|
+ likes = 0;
|
|
|
+ collects = 0;
|
|
|
+ dislikes = 0;
|
|
|
+ district = '';
|
|
|
+ publish_at = new Date();
|
|
|
+}
|
|
|
+export class GetContentDetailItem extends DataModel<GetContentDetailItem> {
|
|
|
+ constructor() {
|
|
|
+ super(GetContentDetailItem, "内容详情");
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ this._convertTable = {
|
|
|
+ id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
|
|
|
+ title: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
|
|
|
+ content: { clientSide: 'string', serverSide: 'string' },
|
|
|
+ isGuest: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isLogin: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isComment: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isLike: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ isCollect: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ publish_at: { clientSide: 'date', serverSide: 'string' },
|
|
|
+ flag: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
|
|
|
+ tags: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
|
|
|
+ type: { clientSide: 'number', serverSide: 'number' },
|
|
|
+ }
|
|
|
+ this._convertKeyType = (key, direction) => {
|
|
|
+ if (key.endsWith('Time'))
|
|
|
+ return {
|
|
|
+ clientSide: 'date',
|
|
|
+ serverSide: 'string',
|
|
|
+ };
|
|
|
+ return undefined;
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ id = 0;
|
|
|
+ from = '';
|
|
|
+ modelId = 0;
|
|
|
+ type = 0;
|
|
|
+ title = '';
|
|
|
+ region = 0;
|
|
|
+ image = '';
|
|
|
+ images = [];
|
|
|
+ audio = '';
|
|
|
+ video = '';
|
|
|
+ desc = '';
|
|
|
+ flag ?: string[];
|
|
|
+ tags ?: string[];
|
|
|
+ views = 0;
|
|
|
+ comments = 0;
|
|
|
+ likes = 0;
|
|
|
+ collects = 0;
|
|
|
+ dislikes = 0;
|
|
|
+ isLogin = false;
|
|
|
+ isGuest = false;
|
|
|
+ isComment = false;
|
|
|
+ isLike = false;
|
|
|
+ isCollect = false;
|
|
|
+ content = '';
|
|
|
+ publish_at = new Date();
|
|
|
+}
|
|
|
+
|
|
|
+export class CategoryListItem extends DataModel<CategoryListItem> {
|
|
|
+ constructor() {
|
|
|
+ super(CategoryListItem, "分类列表");
|
|
|
+ this.setNameMapperCase('Camel', 'Snake');
|
|
|
+ this._convertTable = {
|
|
|
+ id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
|
|
|
+ pid: { clientSide: 'number', serverSide: 'number' },
|
|
|
+ haschild: { clientSide: 'boolean', serverSide: 'number' },
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ id !: number;
|
|
|
+ pid !: number;
|
|
|
+ title = '';
|
|
|
+ status = 'normal';
|
|
|
+ weight = 0;
|
|
|
+ spacer = '';
|
|
|
+ haschild = false;
|
|
|
+ children?: CategoryListItem[];
|
|
|
+}
|
|
|
+
|
|
|
+export class CommonContentApi extends AppServerRequestModule<DataModel> {
|
|
|
+
|
|
|
+ constructor(modelId: number, debugName: string, mainBodyColumnId?: number) {
|
|
|
+ super();
|
|
|
+ this.modelId = modelId;
|
|
|
+ this.mainBodyColumnId = mainBodyColumnId;
|
|
|
+ this.debugName = debugName;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected mainBodyColumnId?: number;
|
|
|
+ protected modelId: number;
|
|
|
+ protected debugName: string;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取分类列表
|
|
|
+ * @param type 根级类型:1=区域、2=级别、3=文物类型、4=非遗类型、42=事件类型
|
|
|
+ * @param withself 是否返回包含自己:true=是,false=否 ,默认false
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+ async getCategoryList(
|
|
|
+ type?: number,
|
|
|
+ withself?: boolean,
|
|
|
+ ) {
|
|
|
+ return (this.get('/content/category/getCategoryList', '获取分类列表', {
|
|
|
+ type,
|
|
|
+ is_tree: false,
|
|
|
+ withself,
|
|
|
+ }))
|
|
|
+ .then(res => transformArrayDataModel<CategoryListItem>(CategoryListItem, res.data2, `获取分类列表`, true))
|
|
|
+ .catch(e => { throw e });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 用于获取某一个分类需要用的子级
|
|
|
+ * @param pid 父级
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+ async getCategoryChildList(pid?: number) {
|
|
|
+ return (this.get('/content/category/getCategoryOnlyChildList', '获取分类子级列表', {
|
|
|
+ pid,
|
|
|
+ }))
|
|
|
+ .then(res => transformArrayDataModel<CategoryListItem>(
|
|
|
+ CategoryListItem,
|
|
|
+ transformSomeToArray(res.data2),
|
|
|
+ `获取分类列表`,
|
|
|
+ true
|
|
|
+ ))
|
|
|
+ .catch(e => { throw e });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 主体栏目列表
|
|
|
+ * @param params 参数
|
|
|
+ * @param querys 额外参数
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+ getColumList<T extends DataModel = GetColumContentList>(params: GetColumListParams, modelClassCreator: NewDataModel = GetColumContentList, querys?: QueryParams) {
|
|
|
+ return this.get('/content/content/getMainBodyColumnContentList', `${this.debugName} 主体栏目列表`, {
|
|
|
+ model_id: this.modelId,
|
|
|
+ ...params.toServerSide(),
|
|
|
+ ...querys,
|
|
|
+ })
|
|
|
+ .then(res => ({
|
|
|
+ list: transformArrayDataModel<T>(modelClassCreator, res.data2.list, `${this.debugName} 主体栏目列表`, true),
|
|
|
+ total: res.data2.total as number,
|
|
|
+ }))
|
|
|
+ .catch(e => { throw e });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 模型内容列表
|
|
|
+ * @param params 参数
|
|
|
+ * @param page 页码
|
|
|
+ * @param pageSize 页大小
|
|
|
+ * @param querys 额外参数
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+ getContentList<T extends DataModel = GetContentListItem>(params: GetContentListParams, page: number, pageSize: number = 10, modelClassCreator: NewDataModel = GetContentListItem, querys?: QueryParams) {
|
|
|
+ return this.get('/content/content/getContentList', `${this.debugName} 模型内容列表`, {
|
|
|
+ ...params.toServerSide(),
|
|
|
+ ...querys,
|
|
|
+ model_id: this.modelId,
|
|
|
+ main_body_column_id: params.mainBodyColumnId || this.mainBodyColumnId,
|
|
|
+ page,
|
|
|
+ pageSize,
|
|
|
+ })
|
|
|
+ .then(res => ({
|
|
|
+ list: transformArrayDataModel<T>(modelClassCreator, res.data2.list, `${this.debugName} 模型内容列表`, true),
|
|
|
+ total: res.data2.total as number,
|
|
|
+ }))
|
|
|
+ .catch(e => { throw e });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 内容详情
|
|
|
+ * @param id id
|
|
|
+ * @param querys 额外参数
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+ getContentDetail<T extends DataModel = GetContentDetailItem>(id: number, modelClassCreator: NewDataModel = GetContentDetailItem, querys?: QueryParams) {
|
|
|
+ return this.get('/content/content/getContentDetail', `${this.debugName} (${id}) 内容详情`, {
|
|
|
+ model_id: this.modelId,
|
|
|
+ id,
|
|
|
+ ...querys,
|
|
|
+ }, modelClassCreator)
|
|
|
+ .then(res => res.data as T)
|
|
|
+ .catch(e => { throw e });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export default new CommonContentApi(0, '默认通用内容');
|