如何扩展Strapi Admin User属性以添加图片字段(v3.1.4)
我来帮你搞定这个问题,不管是扩展Admin User加图片字段,还是优化你当前的作者信息存储方式,都给你讲得明明白白:
一、扩展Admin User模型添加图片字段的具体步骤
因为Strapi的Admin User是内置插件strapi-admin的模型,不能直接改插件源码,咱们得通过项目的扩展目录来定制:
创建模型扩展文件
在项目根目录新建extensions/strapi-admin/models/路径,然后创建User.js文件,内容如下:module.exports = { attributes: { // 保留原有所有字段,新增image关联上传插件的文件模型 image: { model: 'file', via: 'related', plugin: 'upload', }, }, };这里用
model: 'file'关联Strapi自带的上传插件,实现图片上传功能。修改Admin面板的用户编辑页面
默认Admin面板不会显示咱们加的image字段,所以得覆盖原有的编辑组件:
在项目根目录新建extensions/strapi-admin/admin/src/components/EditUser/路径,创建index.js文件。你可以从Strapi官方源码的strapi-admin/admin/src/components/EditUser/index.js里复制原组件代码,然后在表单中插入图片上传控件:// 先引入Strapi的上传组件 import { Upload } from '@strapi/helper-plugin'; // 在表单的合适位置(比如用户名、邮箱字段下面)添加: <div className="col-12 col-md-6"> <Upload inputName="image" label="用户头像" multiple={false} files={formik.values.image ? [formik.values.image] : []} onAdd={(files) => formik.setFieldValue('image', files[0])} onRemove={() => formik.setFieldValue('image', null)} /> </div>重启Strapi服务
保存所有文件后重启你的Strapi项目,现在进Admin面板编辑用户,就能看到新增的图片上传框了。
二、更新生命周期钩子获取作者图片
接下来更新你原来的Article生命周期钩子,查询Admin User时带上image关联,把图片URL存入Author字段:
module.exports = { lifecycles: { async beforeCreate(data) { // 获取当前创建文章的管理员用户,关联image字段 const user = await strapi.query('user', 'strapi-admin').findOne({ id: data.createdBy }, ['image']); if (user) { data.Author = { name: user.username, email: user.email, avatar: user.image ? user.image.url : null, // 新增图片URL }; } }, // 同理更新beforeUpdate钩子,处理文章编辑时的作者信息 async beforeUpdate(params, data) { const user = await strapi.query('user', 'strapi-admin').findOne({ id: data.updatedBy }, ['image']); if (user) { data.Author = { name: user.username, email: user.email, avatar: user.image ? user.image.url : null, }; } }, }, };
三、更优方案:用关联关系替代冗余存储
说实话,你现在把作者信息存到Article的隐藏字段里,会有数据冗余的问题——如果作者后来换了头像、改了名字,Article里的旧信息不会自动同步,还得额外维护钩子。更符合Strapi设计思路的方案是:
给Article模型加Admin User关联
编辑Article集合类型的模型文件api/article/models/Article.js,添加关联字段:module.exports = { attributes: { // 保留你原来的其他字段 author: { model: 'user', plugin: 'strapi-admin', via: null, // 一对一关联,一篇文章对应一个作者 }, }, };这样每篇Article都会和对应的Admin User绑定。
查询时直接关联获取作者信息
当你查询Article的时候,通过populate参数就能直接拿到作者的所有信息(包括图片):- 如果是在控制器里写查询逻辑:
async find(ctx) { // 关联author和author的image字段 const articles = await strapi.query('article').find(ctx.query, ['author', 'author.image']); ctx.send(articles); } - 如果是直接调用API,在请求URL里加
?populate=author.image参数就行。
- 如果是在控制器里写查询逻辑:
这个方案不仅代码更简洁,还能保证数据实时同步,完全不用再维护生命周期钩子,是Strapi处理关联数据的标准姿势。
内容的提问来源于stack exchange,提问作者Petr Mrkvicka

