| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- import { DataModel, transformArrayDataModel, type NewDataModel } from '@imengyu/js-request-transform';
- import { AppServerRequestModule } from './RequestModules';
- import { transformSomeToArray } from '@/api/Utils';
- import type { QueryParams } from "@imengyu/imengyu-utils";
- export class GetColumListParams extends DataModel<GetColumListParams> {
-
- public constructor() {
- super(GetColumListParams);
- this.setNameMapperCase('Camel', 'Snake');
- }
- setModelId(val: number) {
- this.modelId = val;
- return this;
- }
- setMainBodyColumnId(val: number) {
- this.mainBodyColumnId = val;
- return this;
- }
- setFlag(val: 'hot'|'recommend'|'top') {
- this.flag = val;
- return this;
- }
- setSize(val: number) {
- this.size = val;
- return this;
- }
- modelId?: number;
- /**
- * 主体栏目id
- */
- mainBodyColumnId: 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)),
- },
- }
- }
- setMainBodyColumnId(val: number|number[]) {
- this.mainBodyColumnId = val;
- return this;
- }
- setFlag(val: 'hot'|'recommend'|'top') {
- this.flag = val;
- return this;
- }
- setIds(val: number[]) {
- this.ids = val;
- return this;
- }
- setType(val: 1|2|3|4) {
- this.type = val;
- return this;
- }
- setSize(val: number) {
- this.size = val;
- return this;
- }
- setKeywords(val: string) {
- this.keywords = val;
- return this;
- }
- setModelId(val: number) {
- this.modelId = val;
- return this;
- }
- static TYPE_ARTICLE = 1;
- static TYPE_AUDIO = 2;
- static TYPE_VIDEO = 3;
- static TYPE_IMAGE = 4;
- modelId ?: number;
- /**
- * 主体栏目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' },
- publishAt: { 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') || key.endsWith('At'))
- 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 = '';
- publishAt = 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' },
- 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' },
- publishAt: { clientSide: 'date', serverSide: 'string' },
- flag: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
- tags: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
- type: { clientSide: 'number', serverSide: 'number' },
- ichSitesList: { clientSide: 'array', clientSideChildDataModel: GetContentDetailItem },
- inheritorsList: { clientSide: 'array', clientSideChildDataModel: GetContentDetailItem },
- otherLevel: { clientSide: 'array', clientSideChildDataModel: GetContentDetailItem },
- }
- this._convertKeyType = (key, direction) => {
- if (key.endsWith('Time') || key.endsWith('At'))
- return {
- clientSide: 'date',
- serverSide: 'string',
- };
- else if (key.endsWith('List')) {
- return [
- { clientSide: 'map', serverSide: 'original'},
- { clientSide: 'array', clientSideChildDataModel: GetContentDetailItem, serverSide: 'original' },
- ]
- }
- return undefined;
- };
- this._afterSolveServer = () => {
- if (this.image === 'https://mncdn.wenlvti.net')
- this.image = '';
- if (!this.image && this.images && this.images && this.images.length > 0 ) {
- this.image = this.images[0]
- }
- if ((!this.images || this.images.length == 0) && this.image && this.image != '') {
- this.images = [ this.image ]
- }
- if (!this.images)
- this.images = []
- }
- }
- id = 0;
- from = '';
- modelId = 0;
- type = 0;
- title = '';
- region = 0;
- image = '';
- images = [] as string[];
- 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 = '';
- value = '';
- intro = '';
- publishAt = new Date();
- associationMeList = [] as {
- id: number,
- title: string,
- image: string,
- thumbnail: string,
- }[];
- otherLevel : GetContentDetailItem[] = [];
- }
- 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|number[]) {
- super();
- this.modelId = modelId;
- this.mainBodyColumnId = mainBodyColumnId;
- this.debugName = debugName;
- }
- public mainBodyColumnId?: number|number[];
- public modelId: number;
- protected debugName: string;
- /**
- * 获取分类列表
- * @param type 根级类型:1=区域、2=级别、3=文物类型、4=非遗类型、42=事件类型
- * @param withself 是否返回包含自己:true=是,false=否 ,默认false
- * @returns
- */
- async getCategoryList(
- type?: number,
- withself?: boolean,
- ) {
- if (type === 1)
- withself = true;
- 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 });
- }
- private toStringArray(arr: number|number[]|undefined) {
- if (typeof arr === 'undefined')
- return '';
- return typeof arr === 'object' ? arr.join(',') : arr.toString();
- }
- /**
- * 主体栏目列表
- * @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: params.modelId || this.modelId,
- main_body_column_id: this.toStringArray(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, modelId?: number, modelClassCreator: NewDataModel = GetContentDetailItem, querys?: QueryParams) {
- return this.get('/content/content/getContentDetail', `${this.debugName} (${id}) 内容详情`, {
- model_id: modelId ?? this.modelId,
- id,
- ...querys,
- }, modelClassCreator)
- .then(res => res.data as T)
- .catch(e => { throw e });
- }
-
- /**
- * 上传文件到服务器
- */
- async uploadSmallFile(
- file: File,
- fileType?: "image" | "video" | "audio" | undefined,
- name = 'file',
- data?: Record<string, any>
- ) {
- return new Promise<{
- fullurl: string,
- url: string
- }>(async (resolve, reject) => {
- try {
- let url = this.config.baseUrl + '/common/upload';
- const formData = new FormData();
- formData.append(name, file);
- // 添加额外数据
- if (data) {
- Object.entries(data).forEach(([key, value]) => {
- formData.append(key, value);
- });
- }
- let requestOptions: RequestInit = {
- method: 'POST',
- body: formData,
- headers: {}
- };
- // 应用请求拦截器
- if (this.config.requestInceptor) {
- const { newReq, newUrl } = this.config.requestInceptor(url, requestOptions as any);
- url = newUrl;
- requestOptions = newReq as RequestInit;
- }
- // 移除Content-Type,让浏览器自动处理
- if (requestOptions.headers && (requestOptions.headers as Record<string, string>)['Content-Type'])
- delete (requestOptions.headers as Record<string, string>)['Content-Type'];
- const response = await fetch(url, requestOptions);
- const responseData = await response.json();
- if (!response.ok)
- throw new Error(`HTTP error! status: ${response.status}`);
- if (responseData.code !== 1)
- throw new Error(responseData.msg ?? `code: ${responseData.code}`);
- resolve(responseData.data);
- } catch (error) {
- reject(error);
- }
- });
- }
- }
- export default new CommonContentApi(0, '默认通用内容');
|