259 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { MockRequest, MockStatusError } from '@delon/mock';
 | 
						|
import { deepCopy } from '@delon/util';
 | 
						|
import { Random } from 'mockjs';
 | 
						|
import { genLabel, genMp } from './utils';
 | 
						|
 | 
						|
let id = 1;
 | 
						|
const CATEGORY = [
 | 
						|
  {
 | 
						|
    id: 1,
 | 
						|
    title: 'General',
 | 
						|
    list: [
 | 
						|
      {
 | 
						|
        id: 1,
 | 
						|
        title: 'Getting started',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 2,
 | 
						|
        title: 'Announcements',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 3,
 | 
						|
        title: 'Guides',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
  {
 | 
						|
    id: 2,
 | 
						|
    title: 'Shopping',
 | 
						|
    list: [
 | 
						|
      {
 | 
						|
        id: 4,
 | 
						|
        title: 'Guides',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 5,
 | 
						|
        title: 'Payments',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 6,
 | 
						|
        title: 'Products',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 7,
 | 
						|
        title: 'Refund',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
  {
 | 
						|
    id: 3,
 | 
						|
    title: 'Support',
 | 
						|
    list: [
 | 
						|
      {
 | 
						|
        id: 8,
 | 
						|
        title: 'Common questions',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
      },
 | 
						|
      {
 | 
						|
        id: 9,
 | 
						|
        title: 'Site issues',
 | 
						|
        threads: Random.natural(1, 20),
 | 
						|
        replies: Random.natural(6, 100),
 | 
						|
        last: {
 | 
						|
          id: id++,
 | 
						|
          mp: genMp(),
 | 
						|
          title: Random.title(5, 10),
 | 
						|
          user_name: Random.name(),
 | 
						|
          time: '1d ago',
 | 
						|
        },
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
];
 | 
						|
 | 
						|
const THREAD: any[] = new Array(20).fill({}).map((v, idx) => ({
 | 
						|
  id: id++,
 | 
						|
  title: Random.title(5, 10),
 | 
						|
  replies: Random.natural(1, 1000),
 | 
						|
  label: idx % 2 === 0 && Random.boolean() ? genLabel() : null,
 | 
						|
  category_id: Random.natural(1, 9),
 | 
						|
  last: {
 | 
						|
    id: id++,
 | 
						|
    mp: genMp(),
 | 
						|
    title: Random.title(5, 10),
 | 
						|
    user_name: Random.name(),
 | 
						|
    time: '1d ago',
 | 
						|
  },
 | 
						|
}));
 | 
						|
 | 
						|
const REPLIES: any[] = new Array(20).fill({}).map((v, idx) => ({
 | 
						|
  id: id++,
 | 
						|
  content: Random.paragraph(),
 | 
						|
  user: {
 | 
						|
    name: Random.name(),
 | 
						|
    mp: genMp(),
 | 
						|
    posts: Random.natural(0, 1000),
 | 
						|
  },
 | 
						|
  time: Random.time(),
 | 
						|
  like: Random.natural(0, 100),
 | 
						|
  dislike: Random.natural(0, 10),
 | 
						|
}));
 | 
						|
 | 
						|
function get(params: any): any {
 | 
						|
  let ret = deepCopy(THREAD);
 | 
						|
  if (params.q) {
 | 
						|
    ret = ret.filter((data: any) => data.name.indexOf(params.q) > -1);
 | 
						|
  }
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
function getIdx(itemId: number): number {
 | 
						|
  itemId = +itemId;
 | 
						|
  const idx = THREAD.findIndex((w) => w.id === itemId);
 | 
						|
  if (idx === -1) {
 | 
						|
    throw new MockStatusError(404);
 | 
						|
  }
 | 
						|
  return idx;
 | 
						|
}
 | 
						|
 | 
						|
function getCate(itemId: number): any {
 | 
						|
  let item: any;
 | 
						|
  const category: any = deepCopy(CATEGORY).find((w: any) => {
 | 
						|
    item = w.list.find((l: any) => l.id === itemId);
 | 
						|
    if (item) {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
  });
 | 
						|
  delete category.list;
 | 
						|
  return item;
 | 
						|
}
 | 
						|
 | 
						|
export const FORUMS = {
 | 
						|
  '/forum/category': CATEGORY,
 | 
						|
  '/forum/thread/:id': (req: MockRequest) => {
 | 
						|
    // list
 | 
						|
    const pi = +(req.queryString.pi || 1);
 | 
						|
    const ps = +(req.queryString.ps || 10);
 | 
						|
    const data = get(req.queryString);
 | 
						|
    return {
 | 
						|
      category: getCate(+req.params.id),
 | 
						|
      total: data.length,
 | 
						|
      list: data.slice((pi - 1) * ps, pi * ps),
 | 
						|
    };
 | 
						|
  },
 | 
						|
  '/forum/:id': (req: MockRequest) => {
 | 
						|
    const idx = getIdx(req.params.id || 0);
 | 
						|
    const item = {
 | 
						|
      ...THREAD[idx],
 | 
						|
      time: '3 days ago',
 | 
						|
      like: Random.natural(0, 100),
 | 
						|
      view: Random.natural(0, 10000),
 | 
						|
      user: {
 | 
						|
        name: Random.name(),
 | 
						|
        mp: genMp(),
 | 
						|
        posts: Random.natural(0, 1000),
 | 
						|
      },
 | 
						|
      desc:
 | 
						|
        '<p>' +
 | 
						|
        new Array(Random.natural(1, 3))
 | 
						|
          .fill('')
 | 
						|
          .map((v) => Random.paragraph())
 | 
						|
          .join('</p><p>') +
 | 
						|
        '</p>',
 | 
						|
    };
 | 
						|
    item.category = getCate(item.category_id);
 | 
						|
    return item;
 | 
						|
  },
 | 
						|
  '/forum/:id/replies': (req: MockRequest) => {
 | 
						|
    const pi = +(req.queryString.pi || 1);
 | 
						|
    const ps = +(req.queryString.ps || 10);
 | 
						|
    return {
 | 
						|
      total: REPLIES.length,
 | 
						|
      list: REPLIES.slice((pi - 1) * ps, pi * ps),
 | 
						|
    };
 | 
						|
  },
 | 
						|
 | 
						|
  'POST /forum': (req: MockRequest) => {
 | 
						|
    const itemId = req.body.id || 0;
 | 
						|
    if (itemId > 0) {
 | 
						|
      const idx = getIdx(itemId);
 | 
						|
      THREAD[idx] = { ...THREAD[idx], ...req.body };
 | 
						|
      return { msg: 'ok', item: THREAD[idx] };
 | 
						|
    }
 | 
						|
 | 
						|
    const item = { ...req.body, id: THREAD.sort((a, b) => b.id - a.id)[0].id + 1 };
 | 
						|
    THREAD.push(item);
 | 
						|
    return { msg: 'ok', item };
 | 
						|
  },
 | 
						|
  'DELETE /forum/:id': (req: MockRequest) => {
 | 
						|
    const idx = getIdx(req.params.id || 0);
 | 
						|
    THREAD.splice(idx, 1);
 | 
						|
    return { msg: 'ok' };
 | 
						|
  },
 | 
						|
};
 |