本篇主要介绍strapi自带的plugin修改和permission配置同步示例,为了解决开发时设置了permission部署到线上还要再设置一遍的问题,但目前此样例只同步id==2的public用户类型
请注意这个系列用的版本均为v3版本
,本篇是3.1.3
版本,v4版本
改的东西太多了跟前面写的差异太多
首先可以先去github如图切换版本,点击packages
就可以看到strapi自带的plugin列表,这篇的主要目标是strapi-plugin-users-permissions
这个包
首先我是这么创建了packages/quickPermission
的路径作为快速设置的包用来存放相关代码,本次用到lodash axios nodemon这些包请记得安装,相关文件都在下面示例,其中per.conf.json
是存放配置的,可以不用创建
用来存放登录信息和端口、文件位置等
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',
}
用来给系统启动时运行的脚本
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
给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')
}
}
读取 / 设置 配置文件工具
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,
}
axios请求基本设置
let _env = require('./_env')
let { default: axios } = require('axios')
let request = axios.create({
baseURL: _env.baseURL,
})
module.exports = request
首先把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' }] }])
}
},
// ...
}
位置/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()
}
由于用了文件存储,每次生成\更新配置文件都会重启项目导致无限循环,默认的strapi dev
是不能用了,需要用新的脚本
"scripts": {
// ...
"dev": "nodemon --exec \"yarn start\"",
"start": "cross-env ENV_PATH=./.env.dev strapi start",
// ...
}
还有一个nodemon监听位置的配置,在根目录创建nodemon.json
{
"watch": [
"./api/**/*",
"./config/**/*",
"./extensions/**/*"
]
}
接下来每次启动都会默认同步permission数据了