Skip to content

其他

权限校验

后台admin接口权限校验,在controller使用@AdminPermission装饰器。

import { AdminPermission, ApiOperationResponse } from '@/decorators/index.js';
import { User } from '@/entities/user.entity.js';
import { Body, Controller, Inject, Post } from '@midwayjs/core';
import { UserCreateDto } from '../dto/userCreate.dto.js';
import { UserService } from '../service/user.service.js';
import { BaseController } from './base.controller.js';

/**
 * 为了防止防火墙禁止PUT、DELETE请求,方便传参,除详情外统一使用post请求。
 * meadmin对controller做了装饰器继承封装,当以/开头时会使用当前controller前缀地址,不以/开头时会递归继承controller前缀地址
 */
@Controller('user')
export class UserController extends BaseController {
  @Inject()
  userService: UserService;

  //接口方法必须加async 方法的接口装饰器值必须/开头
  @Post('/add')
  @ApiOperationResponse({
    responseType: User,
    summary: '添加用户信息',
  })
  @AdminPermission('UserAdd')
  async add(@Body() createDto: UserCreateDto) {
    return this.success(await this.userService.create(createDto));
  }
}

前台index接口权限校验,在controller使用@IndexPermission装饰器。前台登录仅校验是否登录,未做过多的权限封装。

import { ApiOperationResponse, IndexPermission } from '@/decorators/index.js';
import { Controller, Get, Inject } from '@midwayjs/core';
import { User } from '../../../entities/user.entity.js';
import { UserService } from '../service/user.service.js';
import { BaseController } from './base.controller.js';

/**
 * 为了防止防火墙禁止PUT、DELETE请求,规避get请求缓存,统一使用post请求。
 * meadmin对controller做了装饰器继承封装,当以/开头时会使用当前controller前缀地址,不以/开头时会递归继承controller前缀地址
 */
@Controller('user')
export class UserController extends BaseController {
  @Inject()
  userService: UserService;

  //接口方法必须加async 方法的接口装饰器值必须/开头
  @Get('/info')
  @ApiOperationResponse({
    responseType: User,
    summary: '获取当前用户的信息',
  })
  @IndexPermission()
  async info() {
    const entity = await this.userService.findOne(this.ctx.userInfo.id);
    return this.success(entity);
  }
}

登录校验

后台admin接口放开登录校验可在src/config/config.default.ts中配置。

admin: {
    login: {
      secret: 'desec2ec3=ase$&e1#edad#$%%', //token加密平台标识
      expiresIn: 3600000 * 6, //token过期时间ms
      renewal: 60000 * 10, //续期时间ms
      cacheKey: 'admin', //token使用的缓存key对应cacheManager.clients
    },
    auth: {
      noLoginUrl: [`/api/admin/login/login`, `/api/admin/login/captcha`, new RegExp('/api/admin/file/get/.+')] as Array<string | RegExp>, //无需登录地址,支持字符串或正则
    },
  },

配置和环境变量

本项目配置文件在src/config/config.default.ts中,并根据运行环境加载对应的.env文件。

dev命令cross-env NODE_ENV=local npx me-devBootstrap --cleanOutDir --watch --run @midwayjs/mock/app会依次加载 .env``.env.local文件

start 命令cross-env NODE_ENV=prod node ./bootstrap.js会依次加载 .env``.env.prod文件 更多说明请参考midway 文档

.env环境变量中以VIEW_ADMIN_开头和以VIEW_INDEX_开头的环境变量可分别被 adminindex前台项目读取到。

多语言

本项目的多语言目录在src/locales中,配置方式如下:

//src/config/config.default.ts
i18n: {
  // 默认语言  "zh-cn"
  defaultLocale: 'zh-cn',
  // used to alter the behaviour of missing keys
  missingKeyFn: function (locale, value) {
    return value;
  },

  // 把你的翻译文本放到这里
  localeTable: {
    'zh-cn': {
      validate: {
        'string.mobile': '{{#label}} 必须是一个正确的手机号',
      },
    },
    'en': {
      default: await import('../locales/en.json', { with: { type: 'json' } }),
      validate: await import('@midwayjs/validate/locales/en_US.json', { with: { type: 'json' } }),
    },
  },

  missingKeyHandler: (message: string, options?: TranslateOptions) => (options?.args ? formatText(message, options.args) : message),
},

更多说明请参考midway文档

日志

调试模式及部署模式,都将日志目录改为本地的 ${app.appDir}/logs/ 目录下

//src/config/config.default.ts
midwayLogger: {
    default: {
      transports: {
        file: {
          dir: resolve(import.meta.dirname, '../../logs'),
        },
        error: {
          dir: resolve(import.meta.dirname, '../../logs'),
        },
      },
    },
    // ...
  },

缓存

集成@midwayjs/redis@3和@midwayjs/cache-manager@3组件,实现基于redis的缓存支持

//src/config/config.default.ts
  redis: {
    clients: {
      cache: {
        host: process.env.REDIS_HOST,
        port: process.env.REDIS_PORT,
        password: process.env.REDIS_PASS,
        db: 0,
      },
    },
  },
  cacheManager: {
    //缓存配置
    clients: {
      admin: {
        store: createRedisStore('cache'),
      },
      index: {
        store: createRedisStore('cache'),
      },
    },
  },

静态文件映射

集成 @midwayjs/static-file@3组件,public文件夹下的资源都可以使用/文件名直接访问

//src/config/config.default.ts
  staticFile: {
    dirs: {
      default: {
        prefix: '/',
        dir: 'public',
      },
      viewAdmin: {
        prefix: '/html/admin/',
        dir: 'view/admin/dist',
      },
      viewIndex: {
        prefix: '/html/index/',
        dir: 'view/index/dist',
      },
    },
  },

更多

依赖注入、生命周期、Cookies 和 Session、内置服务、Web 路由表、现有装饰器索引、框架错误码、设计模式等更多特性请参考midway文档