CommonContent.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. import { DataModel, transformArrayDataModel, type NewDataModel } from '@imengyu/js-request-transform';
  2. import { AppServerRequestModule } from './RequestModules';
  3. import type { QueryParams } from '../common/request/utils/AllType';
  4. import ApiCofig from '@/common/config/ApiCofig';
  5. import { transformSomeToArray } from '@/common/request/utils/Utils';
  6. export class GetColumListParams extends DataModel<GetColumListParams> {
  7. public constructor() {
  8. super(GetColumListParams);
  9. this.setNameMapperCase('Camel', 'Snake');
  10. }
  11. /**
  12. * 主体栏目id
  13. */
  14. mainBodyColumnId: number|number[] = 0;
  15. /**
  16. * 标志:hot=热门,recommend=推荐,top=置顶
  17. */
  18. flag ?: 'hot'|'recommend'|'top';
  19. /**
  20. * 内容数量,默认4
  21. */
  22. size = 4;
  23. }
  24. export class GetContentListParams extends DataModel<GetContentListParams> {
  25. static TYPE_ARTICLE = 1;
  26. static TYPE_AUDIO = 2;
  27. static TYPE_VIDEO = 3;
  28. static TYPE_ALBUM = 4;
  29. public constructor() {
  30. super(GetContentListParams);
  31. this.setNameMapperCase('Camel', 'Snake');
  32. this._convertTable = {
  33. ids: {
  34. customToServerFn: (val) => (val as number[]).join(','),
  35. customToClientFn: (val) => (val as string).split(',').map((item) => parseInt(item)),
  36. },
  37. }
  38. }
  39. /**
  40. * 主体栏目id
  41. */
  42. mainBodyColumnId: number|number[] = 0;
  43. /**
  44. * 标志:hot=热门,recommend=推荐,top=置顶
  45. */
  46. flag ?: 'hot'|'recommend'|'top';
  47. /**
  48. * 内容id(逗号隔开)如:3 或者 1,2,3
  49. */
  50. ids?: number[];
  51. /**
  52. * 类型:1=文章,2=音频,3=视频,4=相册
  53. */
  54. type?: 1|2|3|4;
  55. /**
  56. * 内容数量,默认4
  57. */
  58. size = 4;
  59. /**
  60. * 关键字查询
  61. */
  62. keywords?: string;
  63. }
  64. export class GetColumContentList extends DataModel<GetColumContentList> {
  65. constructor() {
  66. super(GetColumContentList, "主体栏目列表");
  67. this.setNameMapperCase('Camel', 'Snake');
  68. this._convertTable = {
  69. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  70. name: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
  71. content_list: {
  72. clientSide: 'array',
  73. clientSideRequired: true,
  74. clientSideChildDataModel: GetContentListItem,
  75. },
  76. }
  77. }
  78. name = '';
  79. overview = '';
  80. }
  81. export class GetContentListItem extends DataModel<GetContentListItem> {
  82. constructor() {
  83. super(GetContentListItem, "内容列表");
  84. this.setNameMapperCase('Camel', 'Snake');
  85. this._convertTable = {
  86. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  87. mainBodyColumnId: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  88. title: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
  89. isGuest: { clientSide: 'boolean', serverSide: 'number' },
  90. isLogin: { clientSide: 'boolean', serverSide: 'number' },
  91. isComment: { clientSide: 'boolean', serverSide: 'number' },
  92. isLike: { clientSide: 'boolean', serverSide: 'number' },
  93. isCollect: { clientSide: 'boolean', serverSide: 'number' },
  94. latitude: { clientSide: 'number', serverSide: 'number' },
  95. longitude: { clientSide: 'number', serverSide: 'number' },
  96. publishAt: { clientSide: 'date', serverSide: 'string' },
  97. flag: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  98. tags: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  99. keywords: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  100. type: { clientSide: 'number', serverSide: 'number' },
  101. };
  102. this._convertKeyType = (key, direction) => {
  103. if (key.endsWith('Time'))
  104. return {
  105. clientSide: 'date',
  106. serverSide: 'string',
  107. };
  108. return undefined;
  109. };
  110. }
  111. id = 0;
  112. mainBodyColumnId = 0;
  113. latitude = 0;
  114. longitude = 0;
  115. mapX = '';
  116. mapY = '';
  117. from = '';
  118. modelId = 0;
  119. title = '!title';
  120. region = 0;
  121. image = '';
  122. thumbnail = '';
  123. desc = '!desc';
  124. content = '!content';
  125. type = 0;
  126. keywords ?: string[];
  127. flag ?: string[];
  128. tags ?: string[];
  129. views = 0;
  130. comments = 0;
  131. likes = 0;
  132. collects = 0;
  133. dislikes = 0;
  134. district = '';
  135. publishAt = new Date();
  136. }
  137. export class GetContentDetailItem extends DataModel<GetContentDetailItem> {
  138. constructor() {
  139. super(GetContentDetailItem, "内容详情");
  140. this.setNameMapperCase('Camel', 'Snake');
  141. this._convertTable = {
  142. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  143. title: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
  144. content: { clientSide: 'string', serverSide: 'string' },
  145. isGuest: { clientSide: 'boolean', serverSide: 'number' },
  146. isLogin: { clientSide: 'boolean', serverSide: 'number' },
  147. isComment: { clientSide: 'boolean', serverSide: 'number' },
  148. isLike: { clientSide: 'boolean', serverSide: 'number' },
  149. isCollect: { clientSide: 'boolean', serverSide: 'number' },
  150. publishAt: { clientSide: 'date', serverSide: 'string' },
  151. flag: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  152. tags: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  153. type: { clientSide: 'number', serverSide: 'number' },
  154. associationMeList: [
  155. { clientSide: 'map', serverSide: 'original'},
  156. { clientSide: 'array', serverSide: 'original' },
  157. ],
  158. }
  159. this._convertKeyType = (key, direction) => {
  160. if (key.endsWith('Time'))
  161. return {
  162. clientSide: 'date',
  163. serverSide: 'string',
  164. };
  165. return undefined;
  166. };
  167. }
  168. id = 0;
  169. from = '';
  170. modelId = 0;
  171. type = 0;
  172. title = '';
  173. region = 0;
  174. image = '';
  175. images = [];
  176. audio = '';
  177. video = '';
  178. desc = '';
  179. flag ?: string[];
  180. tags ?: string[];
  181. views = 0;
  182. comments = 0;
  183. likes = 0;
  184. collects = 0;
  185. dislikes = 0;
  186. isLogin = false;
  187. isGuest = false;
  188. isComment = false;
  189. isLike = false;
  190. isCollect = false;
  191. content = '';
  192. publishAt = new Date();
  193. associationMeList = [] as {
  194. id: number,
  195. title: string,
  196. image: string,
  197. thumbnail: string,
  198. }[];
  199. }
  200. export class CategoryListItem extends DataModel<CategoryListItem> {
  201. constructor() {
  202. super(CategoryListItem, "分类列表");
  203. this.setNameMapperCase('Camel', 'Snake');
  204. this._convertTable = {
  205. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  206. pid: { clientSide: 'number', serverSide: 'number' },
  207. haschild: { clientSide: 'boolean', serverSide: 'number' },
  208. }
  209. }
  210. id !: number;
  211. pid !: number;
  212. title = '';
  213. status = 'normal';
  214. weight = 0;
  215. spacer = '';
  216. haschild = false;
  217. children?: CategoryListItem[];
  218. }
  219. export class CommonContentApi extends AppServerRequestModule<DataModel> {
  220. constructor(mainBodyId = ApiCofig.mainBodyId, modelId = 0, debugName = 'CommonContent', mainBodyColumnId?: number) {
  221. super();
  222. this.modelId = modelId;
  223. this.mainBodyId = mainBodyId;
  224. this.mainBodyColumnId = mainBodyColumnId;
  225. this.debugName = debugName;
  226. }
  227. protected mainBodyId: number;
  228. protected mainBodyColumnId?: number;
  229. protected modelId: number;
  230. protected debugName: string;
  231. /**
  232. * 获取分类列表
  233. * @param type 根级类型:1=区域、2=级别、3=文物类型、4=非遗类型、42=事件类型
  234. * @param withself 是否返回包含自己:true=是,false=否 ,默认false
  235. * @returns
  236. */
  237. async getCategoryList(
  238. type?: number,
  239. withself?: boolean,
  240. ) {
  241. return (this.get('/content/category/getCategoryList', '获取分类列表', {
  242. type,
  243. is_tree: false,
  244. withself,
  245. }))
  246. .then(res => transformArrayDataModel<CategoryListItem>(CategoryListItem, res.data2, `获取分类列表`, true))
  247. .catch(e => { throw e });
  248. }
  249. /**
  250. * 用于获取某一个分类需要用的子级
  251. * @param pid 父级
  252. * @returns
  253. */
  254. async getCategoryChildList(pid?: number) {
  255. return (this.get('/content/category/getCategoryOnlyChildList', '获取分类子级列表', {
  256. pid,
  257. }))
  258. .then(res => transformArrayDataModel<CategoryListItem>(
  259. CategoryListItem,
  260. transformSomeToArray(res.data2),
  261. `获取分类列表`,
  262. true
  263. ))
  264. .catch(e => { throw e });
  265. }
  266. /**
  267. * 主体栏目列表
  268. * @param params 参数
  269. * @param querys 额外参数
  270. * @returns
  271. */
  272. getColumList<T extends DataModel = GetColumContentList>(params: GetColumListParams, modelClassCreator: NewDataModel = GetColumContentList, querys?: QueryParams) {
  273. return this.get('/content/content/getMainBodyColumnContentList', `${this.debugName} 主体栏目列表`, {
  274. main_body_id: this.mainBodyId,
  275. model_id: this.modelId,
  276. ...params.toServerSide(),
  277. ...querys,
  278. })
  279. .then(res => ({
  280. list: transformArrayDataModel<T>(modelClassCreator, res.data2.list, `${this.debugName} 主体栏目列表`, true),
  281. total: res.data2.total as number,
  282. }))
  283. .catch(e => { throw e });
  284. }
  285. /**
  286. * 模型内容列表
  287. * @param params 参数
  288. * @param page 页码
  289. * @param pageSize 页大小
  290. * @param querys 额外参数
  291. * @returns
  292. */
  293. getContentList<T extends DataModel = GetContentListItem>(params: GetContentListParams, page: number, pageSize: number = 10, modelClassCreator: NewDataModel = GetContentListItem, querys?: QueryParams) {
  294. return this.get('/content/content/getContentList', `${this.debugName} 模型内容列表`, {
  295. ...params.toServerSide(),
  296. model_id: params.modelId || this.modelId,
  297. main_body_id: params.mainBodyId || this.mainBodyId,
  298. main_body_column_id: params.mainBodyColumnId || this.mainBodyColumnId,
  299. page,
  300. pageSize,
  301. ...querys,
  302. })
  303. .then(res => {
  304. let resList : any = null;
  305. let resTotal : any = null;
  306. if (res.data2?.list && Array.isArray(res.data2.list)) {
  307. resList = res.data2.list;
  308. resTotal = res.data2.total ?? resList.length;
  309. }
  310. else if (res.data2 && Array.isArray(res.data2)) {
  311. resList = res.data2;
  312. resTotal = resList.length;
  313. } else
  314. resList = res.data;
  315. if (resList === null)
  316. return { list: [], total: 0 };
  317. return {
  318. list: transformArrayDataModel<T>(modelClassCreator, resList, `${this.debugName} 模型内容列表`, true),
  319. total: resTotal as number,
  320. }
  321. })
  322. .catch(e => { throw e });
  323. }
  324. /**
  325. * 内容详情
  326. * @param id id
  327. * @param querys 额外参数
  328. * @returns
  329. */
  330. getContentDetail<T extends DataModel = GetContentDetailItem>(id: number, modelClassCreator: NewDataModel = GetContentDetailItem, querys?: QueryParams) {
  331. return this.get('/content/content/getContentDetail', `${this.debugName} (${id}) 内容详情`, {
  332. main_body_id: this.mainBodyId,
  333. model_id: this.modelId,
  334. id,
  335. ...querys,
  336. }, modelClassCreator)
  337. .then(res => res.data as T)
  338. .catch(e => { throw e });
  339. }
  340. }
  341. export default new CommonContentApi(undefined, 0, '默认通用内容');