menus.service.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { Provide } from '@midwayjs/decorator';
  2. import { InjectEntityModel } from '@midwayjs/typegoose';
  3. import { ReturnModelType } from '@typegoose/typegoose';
  4. import { BaseService } from 'free-midway-component';
  5. import { Menus } from '../entity/menus.entity';
  6. import orderBy = require('lodash/orderBy');
  7. import { Types } from 'mongoose';
  8. const ObjectId = Types.ObjectId;
  9. type modelType = ReturnModelType<typeof Menus>;
  10. @Provide()
  11. export class MenusService extends BaseService<modelType> {
  12. @InjectEntityModel(Menus)
  13. model: modelType;
  14. async queryMenu(): Promise<Array<object>> {
  15. const data = await this.model.find({ is_use: '0' }, { meta: 0, __v: 0 }).sort({ order_num: 1 }).lean();
  16. let treeMenu = data.filter(f => !f.parent_id);
  17. treeMenu = this.treeMenu(data, treeMenu);
  18. return treeMenu;
  19. }
  20. treeMenu(allMenus, nowMenu) {
  21. for (const nm of nowMenu) {
  22. const { _id, parent_id } = nm;
  23. // 查下下级其是否有目录
  24. let children = allMenus.filter(f => new ObjectId(f.parent_id).equals(_id));
  25. children = this.treeMenu(allMenus, children);
  26. if (children.length > 0) nm.children = children;
  27. // 换父级组件的名称
  28. if (parent_id) {
  29. const r = allMenus.find(f => new ObjectId(f._id).equals(parent_id));
  30. if (r) nm.parent_name = r.name;
  31. }
  32. }
  33. nowMenu = orderBy(nowMenu, ['order_num'], ['asc']);
  34. return nowMenu;
  35. }
  36. }