strapi入门——第三篇

本篇主要介绍strapi自带的plugin修改和permission配置同步示例,为了解决开发时设置了permission部署到线上还要再设置一遍的问题,但目前此样例只同步id==2的public用户类型

请注意这个系列用的版本均为v3版本,本篇是3.1.3版本,v4版本改的东西太多了跟前面写的差异太多

系统自带插件

在这里插入图片描述

首先可以先去github如图切换版本,点击packages就可以看到strapi自带的plugin列表,这篇的主要目标是strapi-plugin-users-permissions这个包

本地同步代码package

首先我是这么创建了packages/quickPermission的路径作为快速设置的包用来存放相关代码,本次用到lodash axios nodemon这些包请记得安装,相关文件都在下面示例,其中per.conf.json是存放配置的,可以不用创建
在这里插入图片描述

_env.js

用来存放登录信息和端口、文件位置等

let path = require('path')

module.exports = {
    
    
  baseURL: 'http://localhost:1337',
  email: 'email',
  password: 'password',
  perFile: path.resolve(__dirname, './per.conf.json'),
  isDev: process.env.NODE_ENV === 'development',
}

asyncPer.js

用来给系统启动时运行的脚本

let request = require('./request'),
  login = require('./login')
const {
    
     getPerConf } = require('./perConfUtils')

async function asyncPer() {
    
    
  await login()
  console.log('set config')
  await request.put('/users-permissions/roles/2', {
    
     permissions: getPerConf() })
}

module.exports = asyncPer

login.js

asyncPer.js用来登录设置axios的header用的

let _env = require('./_env')
let request = require('./request')

let hasInit = false
module.exports = async function login() {
    
    
  if (hasInit) return
  try {
    
    
    let data = (
      await request.post('/admin/login', {
    
    
        email: _env.email,
        password: _env.password,
      })
    ).data
    let token = 'Bearer ' + data.data.token

    hasInit = true
    request.defaults.headers.Authorization = token
    console.log('token', token)
  } catch (error) {
    
    
    console.error(error)
    throw new Error('get token fail')
  }
}

perConfUtils.js

读取 / 设置 配置文件工具

let fs = require('fs'),
  _env = require('./_env')

let getPerConf = () => {
    
    
  try {
    
    
    return JSON.parse(fs.readFileSync(_env.perFile, 'utf-8'))
  } catch (error) {
    
    
    return {
    
    }
  }
}

let setPerConf = (perConf) => {
    
    
  fs.writeFileSync(_env.perFile, JSON.stringify(perConf), 'utf-8')
}

module.exports = {
    
    
  getPerConf,
  setPerConf,
}

request.js

axios请求基本设置

let _env = require('./_env')
let {
    
     default: axios } = require('axios')

let request = axios.create({
    
    
  baseURL: _env.baseURL,
})

module.exports = request

plugin设置代码修改

首先把github中的strapi-plugin-users-permissions/controllers/UsersPermissions.js复制到项目的/extensions/users-permissions/controllers/UsersPermissions.js中,其中这步相当于把系统plugin的功能覆盖了,接下来在里面改的代码都可以覆盖原有的

下面的代码我把updateRole单独提出来,其他的删除掉也不会影响其他的原本功能,添加注释的代码即可完成开发模式时在设置permission时自动保存文件

'use strict'

const {
    
     merge } = require('lodash')
/**
 * UsersPermissions.js controller
 *
 * @description: A set of functions called "actions" of the `users-permissions` plugin.
 */

const _ = require('lodash')
const {
    
    
  getPerConf,
  setPerConf,
} = require('../../../packages/quickPermission/perConfUtils')

module.exports = {
    
    
  // ...
  async updateRole(ctx) {
    
    
    const roleID = ctx.params.role

    if (_.isEmpty(ctx.request.body)) {
    
    
      return ctx.badRequest(null, [{
    
     messages: [{
    
     id: 'Bad request' }] }])
    }

    try {
    
    
      await strapi.plugins[
        'users-permissions'
      ].services.userspermissions.updateRole(roleID, ctx.request.body)
	  // ! 增加的代码
      if (roleID == 2) {
    
    
        let newConfig = merge(getPerConf(), ctx.request.body.permissions)
        setPerConf(newConfig)
      }
      ctx.send({
    
     ok: true })
    } catch (err) {
    
    
      strapi.log.error(err)
      ctx.badRequest(null, [{
    
     messages: [{
    
     id: 'An error occurred' }] }])
    }
  },
  // ...
}

修改基本配置

bootstrap配置

位置/config/functions/bootstrap.js,在项目启动时同步permission数据到数据库

'use strict'

const asyncPer = require('../../packages/quickPermission/asyncPer')

/**
 * An asynchronous bootstrap function that runs before
 * your application gets started.
 *
 * This gives you an opportunity to set up your data model,
 * run jobs, or perform some special logic.
 *
 * See more details here: https://strapi.io/documentation/v3.x/concepts/configurations.html#bootstrap
 */

module.exports = () => {
    
    
  console.log('bootstrap', process.env.NODE_ENV)
  asyncPer()
}

package.json 启动脚本

由于用了文件存储,每次生成\更新配置文件都会重启项目导致无限循环,默认的strapi dev是不能用了,需要用新的脚本

  • package.json
"scripts": {
    
    
	// ...
    "dev": "nodemon --exec \"yarn start\"",
    "start": "cross-env ENV_PATH=./.env.dev strapi start",
    // ...
}

还有一个nodemon监听位置的配置,在根目录创建nodemon.json

  • nodemon.json
{
    
    
    "watch": [
        "./api/**/*",
        "./config/**/*",
        "./extensions/**/*"
    ]
}

接下来每次启动都会默认同步permission数据了

猜你喜欢

转载自blog.csdn.net/qq_41535611/article/details/124243822