技术标签: headless sqlite mysql strapi 数据库
strapi在默认下是安装了sqlite数据库,并且默认把数据放在.tmp/data.db中,并且被gitignore了
在团队开发中,这个二进制文件如果不被gitignore,即使覆盖或者保留双方都会崩掉,不得不重来。所以最后就变成了单独一个人管理数据库和后台了
官方配置文档
目前本人用的mysql,数据库的配置在config/database.js
中
module.exports = ({
env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'mysql',
host: '数据库ip地址',
port: 3306,
database: 'test',
username: '用户名',
password: '密码',
},
options: {
useNullAsDefault: true,
},
},
},
});
在web管理系统中随便添加一条数据,就可以看到远程的数据库添加了新的表
这里官方文档算是写的挺详细的
Method | 路径 | 说明 |
---|---|---|
GET | /{表名} | 获取该表的所有数据 |
GET | /{表名}/:id | 获取该表对应id的单个数据 |
GET | /{表名}/count | 获取该表的所有数据总数 |
POST | /{表名} | 创建该表中一条新数据 |
DELETE | /{表名}/:id | 删除该表中对应id的单个数据 |
PUT | /{表名}/:id | 更新该表中一条数据 |
关于通过ajax post/put relation数据的,根据设置一对多/一对一,字段的类型为number[]/number,填入对应数据的id即可
在api文件中,能发现我在第一篇中创建的两张表test和relation同名文件夹,并且2个的文件结构都一样
路由配置 config/routes.json
控制器 controllers/relation.js
数据生命钩子 models/{表名}.js
数据结构 models/relation.settings.json
共享函数文件 services/{表名}.js
打开json文件能看到以下类似的数据结构:
{
"routes": [
{
"method": "GET",
"path": "/relations",
"handler": "relation.find",
"config": {
"policies": []
}
},
// .....
]
}
里面的routes
的个数刚好对应默认api的6个,其中
method
就是请求的方法path
请求的路径handler
请求用到的方法,在这里为relation.find
,表示会用到在relation文件夹下的controllers/{表名}.js
中的find函数。但默认下find函数已经在系统中存在了,所以controllers/{表名}.js
中没有find函数config.policies
并没有用过,可以自己看文档一些小技巧
handler
中也可以设置test.findFn
,由此特性可以创建一个新的空表在里面单独设置path
和handler
路由配置文件的handler就是指向这里module.exports
中的函数。
在这里我写个例子:
relation数据
r1和r2aaaa分别关联test表的title1和title2
routes.json
{
"routes": [
{
"method": "GET",
"path": "/relations/testFn",
"handler": "relation.testFn",
"config": {
"policies": []
}
},
// .....
]
}
controllers/relation.js
module.exports = {
async testFn(){
let dataList = await strapi.query('relation').find({
retitle:'r2aaaa'})
return dataList
}
};
查询结果
记得去public开放该接口
其中的坑或注意项
relation.js
文件中的strapi变量是strapi给每个js文件中混入的全局变量strapi.query('表名')
中的表名并不局限本文件夹中,relation中可以查找test表services/{表名}.js
就是个可以存我上面relation.js
写的方法,该文件用或不用都是可以的并没有怎么用不清楚哦
query方法官方文档
简单来说就是过滤排序,如果只是比较简单的过滤用这个比上面写方法要快得多
例子:/relations?id=1
,过滤出id === 1的数据
属性后面带_${方法}
,例子/relations?id_ne=1
方法 | 说明 | 说明 |
---|---|---|
ne | 不等于 | |
lt | 小于 | 对比数字/日期类型 |
gt | 大于 | 对比数字/日期类型 |
lte | 小于等于 | |
gte | 大于等于 | |
in | Included in an array | 包含多个同属性等值过滤,如/relations?id_in=3&id_in=6&id_in=8 |
nin | Not included in an array | 没用过 |
contains | 包括 | 一般用于搜索功能 |
ncontains | 不包括 | |
containss | 包括,大小写敏感 | |
ncontainss | 不包括,大小写敏感 | |
null | Is null or not null | 没用过 |
目前就两种,用法为_sort=${属性}:${排序方式}
,例子:/relations?_sort=id:ASC
;看官网还能多排,但没这个条件用过/users?_sort=email:DESC,username:ASC
大部分用来弄翻页功能的,很简单就全列出来了
例子:/relations?_start=10&_limit=30
,这里要说明的是limit这个不设置默认好像是返回列表最大20个,只有设置了-1才返回所有
strapi的后端框架koa并没怎么用,之前都是用的express的apicache,但可以使用转化包把express的中间件使用在koa中
需要的两个库:koa-connect、apicache
配置位置:/config/functions/bootstrap.js
var e2k = require('koa-connect'),
cache = require('apicache').middleware
var midd = e2k(cache('1 minutes'))
module.exports = () => {
strapi.app.use(midd)
};
文章浏览阅读1.5w次,点赞2次,收藏18次。当β = 0时,Swish变为线性函数f(x)=x/2β → ∞, σ(x)=(1+exp(−x))−1σ(x)=(1+exp(−x))−1为0或1. Swish变为ReLU: f(x)=2max(0,x)所以Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数. beta是个常数或者可以训练的参数。其具有无上界有下界、平滑、非单调的特性。其在模型效果上优于ReLU。ha..._swish和hardswish
文章浏览阅读153次。《ACM竞赛-C/C++入门》 C语言-2 毕业于清华大学,曾担任Googl..._,c++ 语言本身比较难学,语法特性很多,这里推荐一个acm大佬的免费课程,可以试听下,
文章浏览阅读4.7k次,点赞3次,收藏8次。此问题可导致不可使用pip解决方法:cmd 中输入:python -m ensurepipScripts文件夹下就出现 pip的exe 文件,配置好环境变量(把本路径加到path下),pip就可以使用了_python scripts 是空的
文章浏览阅读2.4k次。实习第二天Lua直接上手体验,各种嵌套的内容像html实际代码体验类似c上手luastudio,增加断点调试,修改逻辑发现bug最近登录角色level显示错误创建自定义位置解决项目,导入项目文件夹。添加现有项Unity此时没有运行代码,调试窗口附加到进程,启动调试右侧会显示调用方法。 实习第三天涉及问题 :UI错位问题 其中宝箱尺..._luastudio
文章浏览阅读9.9k次,点赞5次,收藏29次。(1)以sys用户登录oracle—— sqlplus / as sysdba。(2)查看监听—— lsnrctl status。(1)启动监听—— lsnrctl start。(3)关闭监听—— lsnrctl stop。(3)关闭数据库实例—— shutdown。(2)开启数据库实例—— startup。(4)退出sql命令行界面—— quit。启动oracle第一步启动监听,第二步启动数据库实例。_oracle启动监听
文章浏览阅读2w次,点赞131次,收藏671次。一、需求分析用JSP/Servlet技术开发一个网上书店,主要完成以下功能:用户:注册与登录,用户信息的修改图书:图书显示,图书的购买,购物车的管理。图书的添加,删除,查询二、系统设计1)创建相关的数据库表;2)使用MVC架构或者JSP+JavaBean,至少一个功能模块使用MVC;3)在JSP中综合使用EL 表达式,JSTL标记库,JavaBean ;4)使用过滤器完成请求参数编码的设置或登录权限的控制;5)正确完成Servlet和过滤器的配置6)使用数据库连接池进_javaweb网上书店
文章浏览阅读6.7k次,点赞7次,收藏47次。利用双重for循环控制输入二维数组,再将 a[ i ][ i ]累加后输出。求一个3 * 3矩阵对角线元素之和。_c语言求一个3×3矩阵对角线元素之和。
文章浏览阅读633次。(1)从键盘循环录入录入一个字符串,输入"end"表示结束(2)将字符串中大写字母变成小写字母,小写字母变成大写字母,其它字符用"*"代替,并统计字母的个数举例:键盘录入:Hello12345World输出结果:hELLO*****wORLD总共10个字母package test7_2;import java.util.Scanner;public class Demo02 { public static void main(String[] args) { while(true_换行不表示结束符,做字符统计,但用一个特殊的字符串“#end”来表示结束符,该结束
文章浏览阅读4.7k次。 1. 1px 边框变粗问题截图如下(iPhone 6截图):如果我们把上图与我们手机系统上的 1px 边框进行对比,如下图:我们会发现,上面两个上下线条,下线条的粗细才是正确的,上线条就显得有点粗了。但是上线条我们是用纯正的 1px border生成的,而下线条我们实际是采用transform压缩了1px高度的一半模拟实现的,也就相当于 0.5px 的高度了。为什么会这样..._分割线1px
文章浏览阅读143次。在过去几年的DevOps的浪潮中,自动化、持续集成这两个概念早已深入人心(互联网技术人)。比尔盖茨先生曾经都说过:“任何技术在一个业务中使用的第一条规则就是,将自动化应用到一个高效的操作上将会放大高效。第二条就是自动化应用到一个低效操作上,则放大了低效率。”自动化部署也逐渐成为各中小型企业追求的方向,那么,今天民工哥就自动化部署的概述、自动化部署的工具、自动化部署的流程、自动化部署实践等4个方面,..._git 自动发布工具
文章浏览阅读37次。其中ServerChannelInitializer的initChannel为触发read事件时,在SerializeAdapterDecoder的decode方法的最后一个中加入ServerChannelHandler 继承 ChannelInboundHandlerAdapter继续处理read事件时,在ServerChannelHandler 的channelRead方法中使用线程池来处理读到的数据(可能是耗时操作)从而来保证不会由于处理请求导致work线程全部耗尽,而出现等待的情况。
文章浏览阅读5.9k次,点赞4次,收藏17次。1.下载1.1. 安装程序 OpenCASCADExxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/loadocc/1.2.文档OCCTDocumentationxxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/_wnt_wdriver.hxx