# 自定义接口模板
## 数据库创建规则
- 除了中间表,所有数据表主键都是uid,不为空,不设置默认值,由服务端直接生成uid
- 除了uid,所有必填项都必须设置默认值,必填项在服务端会进行不为空校验,`create_time`和`update_time`必填但不设置默认值,由服务端生成
- 所有需要模糊搜索的字段,都需要设置一个默认值
- 表以t_xxx命名,字段以xxx_xxx命名,字段名不能起关键字
- 所有表都需要有create_time,update_time字段,必填项、不设置默认值,varchar类型
- 所有的列都必须有注释,所有的表也必须有注释
## `/router/`
### `article.js`
```js
const Router = require('koa-router') // 引入路由
const articleRouter = new Router()
const articleController = require('../controller/article')
articleRouter.post('/saveArticle', articleController.saveArticle )
articleRouter.post('/deleteArticleByUid', articleController.deleteArticleByUid )
articleRouter.post('/queryArticlePage', articleController.queryArticlePage )
articleRouter.post('/updateArticleByUid', articleController.updateArticleByUid )
module.exports = articleRouter
```
### `index.js`
```js
const Router = require('koa-router') // 引入路由
const router = new Router()
const userRouter = require('./user')
const articleSortRouter = require('./articleSort')
const articleTagRouter = require('./articleTag')
/**
* 在此处新增该模块引入代码
*/
const articleRouter = require('./article')
router.use('/user', userRouter.routes(), userRouter.allowedMethods())
router.use('/articleSort', articleSortRouter.routes(), articleSortRouter.allowedMethods())
router.use('/articleTag', articleTagRouter.routes(), articleTagRouter.allowedMethods())
/**
* 在此处新增该模块引入代码
*/
router.use('/article', articleRouter.routes(), articleRouter.allowedMethods())
module.exports = router // 导出router给app.js使用
```
## `/controller/`
### `article.js`
#### `文件头`
```js
const articleService = require('../service/article')
const {
saveArticleValidator,
deleteArticleByUidValidator,
updateArticleByUidValidator,
queryArticlePageValidator,
} = require('../validation/article')
const resCode = require('../constant/resCode')
/**
* 获取错误码所属的模块
*
* 模式:$保存接口,获取已存在错误码模块$
* 模式解析方式:从控制台中获得---通过正则解析出原文件resCodeVariable.js中的错误码模块名
* (每次创建新模块时候,如果需要,提前创建好所需的错误码),
* 然后运行npm run add 执行创建代码脚本时,从控制台选择所涉及到的模块错误码,
* 替换为常量格式字符串
*/
const {ARTICLE, APP} = require('../constant/resCodeVariable')
const generateUuid = require('../utils/generateUuid')
const dayjs = require('dayjs')
```
#### `saveArticle` 新增
```js
/**
* 分析:
* 保存接口,关系到分页查询接口
* 只要需要条件查询的字段,在保存的时候都不能是null,
* ( koa中使用mysql包写sql语句传参时,天然存在参数解析问题,不能用 %?% ,不能用in (?) 等 )
* ( 在模糊查询的时候,得在传递参数的时候把 %param%直接拼接好,然后使用 like ? )
* ( 这就导致了,当在有null值的多条件查询时,写sql语句非常麻烦,得考虑很多参数的有无,无法写一个通用的多条件模糊查询语句 )
* ( 而假如,把所有需要条件查询的值,在保存的时候都给一个默认值,即不为null,那么就可以写一个比较通用的sql语句 )
*
* select * from t_blog
* where blog_title like ?
* and blog_author_id like ?
* and is_original like ?
* and blog_sort_id like ?
* and recommend_level like ?
* and is_open_comment like ?
* and blog_status like ?
* order by order_num,create_time desc
* limit ?,?
*
* ( 这样,即便是有的参数没有传,在分页查询的接口接收参数的时候,也可以提前判断出来,为其赋值一个空字符串,然后参数替换后就变成了 )
* select * from t_blog
* where blog_title like %哈哈哈%
* and blog_author_id like %%
* and is_original like %%
* and blog_sort_id like %%
* and recommend_level like %%
* and is_open_comment like %%
* and blog_status like %%
* order by order_num,create_time desc
* limit ?,?
*
* ( 这样即便是前台没有传递参数,也可以查询出来期望的结果 )
*
* 所以,在写通用保存接口时,为了解决这个问题,直接把所有需要模糊查询的字段,在保存这条记录的时候,直接就设置一个不是null的默认值
* 那么, 模式 $保存接口,参数校验参数接收$ ,可以在设计数据库时,勾选 不为null,以此来区分,这些参数是前台必须传递过来的参数,
* 而 模式 $分页查询接口,未传递参数设置空字符串$,可以在设计数据库时,给所有需要条件查询的字段,设置一个不为null的默认值,以此来区分。
*
*/
const saveArticle = async ctx => {
/**
* 这里把数据库表里的字段都声明出来
* 除了 uid create_time update_time
*
* 这些都是可以从前台接收来的参数
*
* 模式:$保存接口,参数接收$
* 模式解析方式:提取出所有解析过的数据表字段,将连字符变量,替换为为小驼峰格式字符串,排除 uid,createTime,updateTime
*/
let {
blogTitle, blogSummary, blogAuthorId, isOriginal, blogSortId,
recommendLevel, order, isOpenComment, blogStatus,
coverUrl, blogContent, blogTagIds
} = ctx.request.body
console.log(ctx.request.body, 'ctx.request.body')
/**
* 这里把需要校验的参数传递进去
*
* 模式:$保存接口,参数校验参数接收$
* 模式解析方式:提取出解析过的数据表,属性为必填的字段,替换为为小驼峰格式字符串,排除 uid,createTime,updateTime
*
*/
const {errorMsg, isValid} = saveArticleValidator(blogTitle, isOriginal, isOpenComment, blogStatus, blogTagIds)
/**
* 为一些参数设置默认值,根据数据表中的默认值设置
*
* 模式:$新增接口,未传递参数设置默认值$
* 模式解析方式:提取出解析过的数据表中,有默认值的字段,替换为小驼峰格式字符串,排除 uid,createTime,updateTime
*
*/
blogSummary = blogSummary ? blogSummary : ''
blogSortId = blogSortId ? blogSortId : ''
recommendLevel = recommendLevel ? recommendLevel : '-1'
order = order ? order : '0'
isOpenComment = isOpenComment ? isOpenComment : '2'
blogStatus = blogStatus ? blogStatus : '2'
blogContent = blogContent ? blogContent : ''
blogTagIds = blogTagIds ? blogTagIds : []
// 补充参数
const uid = generateUuid()
const createTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
const updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
/**
* 封装好处理过的参数
*
* 模式:$保存接口,封装处理过的参数$
* 模式解析方式:提取出所有解析过的数据表字段,将连字符变量,替换为为小驼峰变量
*
*/
const params = {
uid, blogTitle, blogSummary, blogAuthorId, isOriginal, blogSortId,
recommendLevel, order, isOpenComment, blogStatus,
coverUrl, blogContent, blogTagIds, createTime, updateTime
}
if (!isValid) { // 校验不通过
ctx.fail(resCode.get(APP.PARAMETER_INVALID), errorMsg)
} else {
/**
* 保存的时候需要校验 是否已经保存过
* 定义默认根据数据库表中的第二个字段查询(第一个字段是Uid)
*
* 模式:$保存接口,根据第二个字段查询是否已经保存过$
* 模式解析方
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
毕设&课设&项目&实训-本系统主要以实现个人博客为概念,了解并分析当今网络时代人们的需求,进行系统开发。主要应用于web 端,系统基于前端 【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
毕设&课设&项目&实训-本系统主要以实现个人博客为概念,了解并分析当今网络时代人们的需求,进行系统开发。.zip (904个子文件)
.babelrc 267B
.babelrc 267B
nord.css 3KB
night-owl.css 3KB
purebasic.css 2KB
grayscale.css 2KB
atom-one-dark-reasonable.css 2KB
a11y-light.css 1KB
a11y-dark.css 1KB
gruvbox-light.css 1KB
gruvbox-dark.css 1KB
vs2015.css 1KB
isbl-editor-dark.css 1KB
shades-of-purple.css 1KB
isbl-editor-light.css 1KB
nnfx-dark.css 1KB
nnfx.css 1KB
hybrid.css 1KB
atelier-estuary-light.css 1KB
atelier-savanna-light.css 1KB
atelier-plateau-light.css 1KB
atelier-estuary-dark.css 1KB
atelier-savanna-dark.css 1KB
atelier-plateau-dark.css 1KB
atelier-cave-light.css 1KB
agate.css 1KB
gradient-dark.css 1KB
atelier-cave-dark.css 1KB
atom-one-light.css 1KB
atom-one-dark.css 1KB
routeros.css 1KB
xcode.css 1KB
railscasts.css 1KB
an-old-hope.css 1KB
sunburst.css 1KB
idea.css 1KB
default.css 1KB
tomorrow-night-blue.css 1KB
atelier-sulphurpool-light.css 1KB
atelier-sulphurpool-dark.css 1KB
tomorrow-night.css 1KB
github.css 1KB
solarized-light.css 1KB
solarized-dark.css 1KB
docco.css 1KB
atelier-lakeside-light.css 1KB
atelier-lakeside-dark.css 1KB
pojoaque.css 1KB
atelier-seaside-light.css 1KB
atelier-seaside-dark.css 1KB
atelier-forest-light.css 1KB
atelier-forest-dark.css 1KB
atelier-heath-light.css 1KB
atelier-heath-dark.css 1KB
atelier-dune-light.css 1KB
atelier-dune-dark.css 1KB
foundation.css 1KB
tomorrow-night-eighties.css 1KB
tomorrow-night-bright.css 1KB
obsidian.css 1KB
hopscotch.css 1KB
kimbie.light.css 1KB
kimbie.dark.css 1KB
lightfair.css 1KB
lioshi.css 1KB
googlecode.css 1KB
xt256.css 1KB
github-gist.css 1KB
arduino-light.css 1KB
srcery.css 1KB
monokai-sublime.css 1KB
dracula.css 1016B
paraiso-light.css 1015B
paraiso-dark.css 1014B
ocean.css 1004B
school-book.css 991B
rainbow.css 983B
qtcreator_light.css 978B
tomorrow.css 978B
qtcreator_dark.css 977B
zenburn.css 947B
gml.css 942B
monokai.css 940B
darcula.css 901B
magula.css 900B
color-brewer.css 884B
ir-black.css 871B
arta.css 852B
far.css 849B
brown-paper.css 842B
codepen-embed.css 842B
vs.css 837B
dark.css 794B
androidstudio.css 774B
mono-blue.css 738B
ascetic.css 591B
.editorconfig 147B
.editorconfig 147B
oauthSuccess.ejs 535B
.eslintignore 30B
共 904 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功