Skip to main content
  1. Blogs/
  2. 前端开发/

·502 words·3 mins
Table of Contents

通过 volume 外挂自己的配置
#

The default configuration for MySQL can be found in /etc/mysql/my.cnf, which may !includedir additional directories such as /etc/mysql/conf.d or /etc/mysql/mysql.conf.d. Please inspect the relevant files and directories within the mysql image itself for more details.

$ docker run –name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

环境设置: Public Key Retrieval is not allowed

docker 运行命令:

docker run --name mysql-demo -v D:\docker-volume\mysql-volume:/var/lib/mysql -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

开始 Strapi
#

更改数据库连接方式
#

创建 strapi mysql 数据库,更改 mysql 连接参数(默认是 sqlite):

// config\database.ts
import path from 'path';

export default ({ env }) => {
  // const client = env('DATABASE_CLIENT', 'sqlite');
  const client = env('DATABASE_CLIENT', 'mysql');

  const connections = {
    mysql: {
      connection: {
        host: env('DATABASE_HOST', 'localhost'),
        port: env.int('DATABASE_PORT', 3306),
        database: env('DATABASE_NAME', 'strapi'),
        user: env('DATABASE_USERNAME', 'strapi'),
        password: env('DATABASE_PASSWORD', 'strapi'),
        ssl: env.bool('DATABASE_SSL', false) && {
          key: env('DATABASE_SSL_KEY', undefined),
          cert: env('DATABASE_SSL_CERT', undefined),
          ca: env('DATABASE_SSL_CA', undefined),
          capath: env('DATABASE_SSL_CAPATH', undefined),
          cipher: env('DATABASE_SSL_CIPHER', undefined),
          rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
        },
      },
      pool: { min: env.int('DATABASE_POOL_MIN', 2), 
      max: env.int('DATABASE_POOL_MAX', 10) },
    },
    postgres: {
	    // ...
    },
    sqlite: {
      connection: {
        filename: path.join(__dirname, '..', '..', env('DATABASE_FILENAME', '.tmp/data.db')),
      },
      useNullAsDefault: true,
    },
  };

  return {
    connection: {
      client,
      ...connections[client],
      acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
    },
  };
};

创建数据
#

配置一对多
#

首先业务涉及2张表:PageWeb 和 PageVersion,我们前端项目都是单页面应用,通过 PageVersion 来维护迭代版本,项目名称等信息通过 PageWeb 维护,并通过一对多和 PageVersion 关联。

即:PageVersion

最终效果将是这样:

restful api
#

http://localhost:1337/api/web-pages

{
  "data": [
    {
      "id": 13,
      "documentId": "m3yldqawekgqgy4kvdam1eo8",
      "createdAt": "2025-05-08T06:06:20.566Z",
      "updatedAt": "2025-05-08T06:06:20.566Z",
      "publishedAt": "2025-05-08T06:06:20.598Z",
      "name": "gzw",
      "desc": "公众号"
    },
    {
      "id": 15,
      "documentId": "p7v44adl2hy0ir0nbbm6z2z4",
      "createdAt": "2025-05-08T06:06:35.511Z",
      "updatedAt": "2025-05-08T06:06:35.511Z",
      "publishedAt": "2025-05-08T06:06:35.537Z",
      "name": "zzt",
      "desc": "掌政通"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "pageSize": 25,
      "pageCount": 1,
      "total": 2
    }
  }
}

http://localhost:1337/api/web-pages?populate=versions

{
  "data": [
    {
      "id": 13,
      "documentId": "m3yldqawekgqgy4kvdam1eo8",
      "createdAt": "2025-05-08T06:06:20.566Z",
      "updatedAt": "2025-05-08T06:06:20.566Z",
      "publishedAt": "2025-05-08T06:06:20.598Z",
      "name": "gzw",
      "desc": "公众号",
      "versions": [
        {
          "id": 7,
          "documentId": "pk23ycxdfug4i5v1kzfo3dgo",
          "version": "1.0.0",
          "createdAt": "2025-05-08T06:06:48.819Z",
          "updatedAt": "2025-05-08T06:06:48.819Z",
          "publishedAt": "2025-05-08T06:06:48.852Z",
          "desc": "fix"
        },
        {
          "id": 9,
          "documentId": "i2qtaq68sgc0cfaycoh59j4j",
          "version": "1.1.0",
          "createdAt": "2025-05-08T06:07:01.937Z",
          "updatedAt": "2025-05-08T06:07:01.937Z",
          "publishedAt": "2025-05-08T06:07:01.967Z",
          "desc": "fix"
        }
      ]
    },
    {
      "id": 15,
      "documentId": "p7v44adl2hy0ir0nbbm6z2z4",
      "createdAt": "2025-05-08T06:06:35.511Z",
      "updatedAt": "2025-05-08T06:06:35.511Z",
      "publishedAt": "2025-05-08T06:06:35.537Z",
      "name": "zzt",
      "desc": "掌政通",
      "versions": [
        {
          "id": 11,
          "documentId": "ktft0c0apjfd6spjqsj2yyg3",
          "version": "1.0.0",
          "createdAt": "2025-05-08T06:07:13.250Z",
          "updatedAt": "2025-05-08T06:07:13.250Z",
          "publishedAt": "2025-05-08T06:07:13.281Z",
          "desc": null
        }
      ]
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "pageSize": 25,
      "pageCount": 1,
      "total": 2
    }
  }
}

http://localhost:1337/api/web-pages?populate[versions][sort][0]=version%3Adesc&populate[versions][filters][enabled][$eq]=active&populate[versions]&filters[name][$eq]=gzh&pagination[limit]=1

关联关系的维护
#

不像查询,增删改对安全的敏感度更高,需要设置对应 token:

比如我对 page 模块单独定义了 PageAccess 用户对这类 restful 操作的权限设置:

为什么要设置 find?

因为对于 relation 关系的数据不光要设置 create,update,还需要 find,内部他要查询到才能关联上。

首先定义一个页面版本记录:

curl --location --request POST 'http://192.168.13.115:1337/api/page-versions' \
--header 'Authorization: Bearer 141ca7491....d3f8' \
--header 'Content-Type: application/json' \
--data-raw '{ 
  "data": {
    "version": "2.0.3",
    "desc":"添加一个restful版本",
    "enabled":"active"
  }
}'
{
    "data": {
        "id": 34,
        "documentId": "z1v8n4qqybce2twapn9e79uy",
        "version": "2.0.3",
        "createdAt": "2025-05-12T05:15:05.499Z",
        "updatedAt": "2025-05-12T05:15:05.499Z",
        "publishedAt": "2025-05-12T05:15:05.516Z",
        "desc": "添加一个restful版本",
        "enabled": "active"
    },
    "meta": {}
}

对于页面来说,需要关联上面这条数据:

curl --location --request PUT 'http://192.168.13.115:1337/api/web-pages/m3yldqawekgqgy4kvdam1eo8' \
--header 'Authorization: Bearer 141ca7491....d3f8' \
--header 'Content-Type: application/json' \
--data-raw '{
    "data": {
        "versions":{
            "connect":["z1v8n4qqybce2twapn9e79uy"]
        }
    }
}'

问题
#

生产环境下,如何修改数据结构?
#

由于开发环境基于 npm run dev 可以自动修改数据结构,生产环境还是需要老实实调用 sql 脚本迁移

strapi 是否支持增删修改?
#

支持,需要配置 token 来控制修改权限

client boot 的异常方案,是否 oss 要提供 metadata.json 版本描述文件
#

client boot 获取的数据量问题
#

strapi nacos 配置参数分离
#

参考
#