Базовая структура бэкэнда версии Node основана на Egg.js (производства Alibaba).
Уникальный компонент npm, опубликованный Cool-admin.com
Node.js>=8.9.0
Redis
mysql
Создайте новую базу данных и импортируйте ее, измените информацию о подключении к базе данных.
Рекомендуется использовать yarn
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
yarn
yarn dev
http : //localhost:7001
или npm
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
npm install
npm run dev
http : //localhost:7001
##Видеоурок:
Простое вводное видео о бэкэнде Cool-admin (быстро напишите 6 API-интерфейсов): https://www.bilibili.com/video/BV1SE411j74K
Cool-admin используется вместе с фронтендом и бэкендом: https://www.bilibili.com/video/av90478011/
Учебное пособие по внутреннему обучению интерфейсу crud Cool-admin: https://www.bilibili.com/video/av89512654/
Модель данных должна быть размещена в app/entities/*
, иначе typeorm не сможет ее распознать, например:
import { Entity , Column , Index } from 'typeorm' ;
import { BaseEntity } from 'egg-cool-entity' ;
/**
* 系统角色
*/
@ Entity ( { name : 'sys_role' } )
export default class SysRole extends BaseEntity {
// 名称
@ Index ( { unique : true } )
@ Column ( )
name : string ;
// 角色标签
@ Index ( { unique : true } )
@ Column ( { nullable : true } )
label : string ;
// 备注
@ Column ( { nullable : true } )
remark : string ;
}
После завершения нового создания и запуска кода вы увидите, что в базе данных создана новая таблица sys_role
. Если вам не нужно автоматически создавать папку config
, измените файл конфигурации typeorm.
Имея таблицу данных, если мы хотим управлять таблицей данных через интерфейс, мы должны создать новый соответствующий контроллер в папке controller
, например:
import { BaseController } from 'egg-cool-controller' ;
import { Context } from 'egg' ;
import routerDecorator from 'egg-cool-router' ;
import { Brackets } from 'typeorm' ;
/**
* 系统-角色
*/
@ routerDecorator . prefix ( '/admin/sys/role' , [ 'add' , 'delete' , 'update' , 'info' , 'list' , 'page' ] )
export default class SysRoleController extends BaseController {
constructor ( ctx : Context ) {
super ( ctx ) ;
this . setEntity ( this . ctx . repo . sys . Role ) ;
this . setPageOption ( {
keyWordLikeFields : [ 'name' , 'label' ] ,
where : new Brackets ( qb => {
qb . where ( 'id !=:id' , { id : 1 } ) ;
} ) ,
} ) ; //分页配置(可选)
this . setService ( this . service . sys . role ) ; //设置自定义的service(可选)
}
}
Таким образом мы завершили написание 6 интерфейсов. Соответствующие интерфейсы следующие:
/admin/sys/role/add
новую/admin/sys/role/delete
/admin/sys/role/update
обновление/admin/sys/role/info
отдельная информация/admin/sys/role/list
информация списка/admin/sys/role/page
(включая нечеткий запрос, полное сопоставление полей и т. д.) параметр | тип | иллюстрировать |
---|---|---|
keyWordLikeFields | множество | Нечеткий запрос требует совпадающих полей, таких как [ 'name','phone' ] , чтобы можно было выполнить нечеткий запрос к двум полям姓名、手机 . |
где | Объект TypeORM Brackets | Исправлена настройка условия, подробности см. в typeform. |
полеEq | множество | Динамические условия полностью совпадают. Если вам нужно отфильтровать status пользователя, вы можете установить его на ['status'] . В это время интерфейс может принимать значение status и оказывать фильтрующее воздействие на данные. |
addOrderBy | объект | Можно передать несколько условий сортировки, например { sortNum:asc, createTime:desc } |
В некоторых бизнес-сценариях мы не хотим использовать базу данных каждый раз, когда запрашиваем интерфейс, например, сегодняшние рекомендации, рейтинги за прошлый месяц и т. д. Данные хранятся в redis
. Примечание. Аннотации кэша действительны только на уровне service
.
import { BaseService } from 'egg-cool-service' ;
import { Cache } from 'egg-cool-cache' ;
/**
* 业务-排行榜服务类
*/
export default class BusRankService extends BaseService {
/**
* 上个月榜单
*/
@ Cache ( { ttl : 1000 } ) // 表示缓存
async rankList ( ) {
return [ '程序猿1号' , '程序猿2号' , '程序猿3号' ] ;
}
}
параметр | тип | иллюстрировать |
---|---|---|
резольвер | множество | Параметры метода получаются, а ключ генерируется с помощью resolver: (args => {return args[0];}), так что первый параметр метода можно получить как key |
ТТЛ | число | Срок действия кэша, ед.:秒 |
URL | нить | URL-адрес запроса будет кэшироваться только в том случае, если он содержит этот префикс. Например, /api/* будет кэшироваться при запросе, а /admin/* не будет кэшироваться при запросе. |
Собственный метод записи маршрутов Egg.js слишком громоздкий. Маршрутизация cool-admin
поддерживает BaseController
и другие встроенные средства поддержки. Подробную информацию см. в разделе маршрутизация egg.js.
Помимо простых операций с одной таблицей, реальный бизнес часто требует выполнения некоторых сложных операций с базой данных. В настоящее время мы можем настроить SQL в service
, например
async page ( query ) {
const { keyWord , status } = query ;
const sql = `
SELECT
a.*,
GROUP_CONCAT(c.name) AS roleName
FROM
sys_user a
LEFT JOIN sys_user_role b ON a.id = b.userId
LEFT JOIN sys_role c ON b.roleId = c.id
WHERE 1 = 1
${ this . setSql ( status , 'and a.status = ?' , [ status ] ) }
${ this . setSql ( keyWord , 'and (a.name LIKE ? or a.username LIKE ?)' , [ `% ${ keyWord } %` , `% ${ keyWord } %` ] ) }
${ this . setSql ( true , 'and a.id != ?' , [ 1 ] ) }
GROUP BY a.id` ;
return this . sqlRenderPage ( sql , query ) ;
}
параметр | тип | иллюстрировать |
---|---|---|
состояние | логическое значение | Только когда измененные условия будут выполнены, соответствующие sql и параметры будут склеены. |
sql | нить | Параметры, которые необходимо склеить |
параметры | множество | Соответствующие параметры |