Le framework de base backend de la version Node est basé sur Egg.js (produit par Alibaba)
Composant npm unique publié par cool-admin.com
Node.js>=8.9.0
Redis
mysql
Créez une nouvelle base de données et importez-la, modifiez les informations de connexion à la base de données
Il est recommandé d'utiliser yarn
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
yarn
yarn dev
http : //localhost:7001
ou npm
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
npm install
npm run dev
http : //localhost:7001
##Tutoriel vidéo :
Vidéo d'introduction simple sur le backend cool-admin (écrire rapidement 6 interfaces API) : https://www.bilibili.com/video/BV1SE411j74K
Cool-admin est utilisé avec le front-end et le back-end : https://www.bilibili.com/video/av90478011/
Tutoriel de formation interne cool-admin front-end crud : https://www.bilibili.com/video/av89512654/
Le modèle de données doit être placé sous app/entities/*
, sinon typeorm ne peut pas le reconnaître, comme :
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 ;
}
Une fois la nouvelle création terminée et le code exécuté, vous pouvez voir qu'une nouvelle table sys_role
a été créée dans la base de données. Si vous n'avez pas besoin de créer automatiquement le dossier config
, modifiez le fichier de configuration typeorm.
Après avoir la table de données, si nous voulons faire fonctionner la table de données via l'interface, nous devons créer un nouveau contrôleur correspondant sous le dossier controller
, tel que :
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(可选)
}
}
Nous avons ainsi réalisé l'écriture de 6 interfaces. Les interfaces correspondantes sont les suivantes :
/admin/sys/role/add
un nouveau/admin/sys/role/delete
/admin/sys/role/update
/admin/sys/role/info
informations uniques/admin/sys/role/list
liste d'informations/admin/sys/role/page
(y compris requête floue, correspondance de champ complet, etc.) paramètre | taper | illustrer |
---|---|---|
keyWordLikeFields | tableau | La requête floue nécessite des champs correspondants, tels que [ 'name','phone' ] , afin que vous puissiez interroger de manière floue les deux champs姓名、手机 . |
où | Objet Supports TypeORM | Correction du paramètre de condition, voir typeorm pour plus de détails |
champEq | tableau | Les conditions dynamiques correspondent parfaitement. Si vous devez filtrer status de l'utilisateur, vous pouvez le définir sur ['status'] . À ce stade, l'interface peut accepter la valeur du status et avoir un effet de filtrage sur les données. |
ajouterOrderBy | objet | Plusieurs conditions de tri peuvent être transmises, telles que { sortNum:asc, createTime:desc } |
Dans certains scénarios commerciaux, nous ne souhaitons pas utiliser la base de données à chaque fois que nous demandons l'interface, comme les recommandations du jour, les classements du mois dernier, etc. Les données sont stockées dans redis
. Remarque : les annotations du cache ne sont valides que dans 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号' ] ;
}
}
paramètre | taper | illustrer |
---|---|---|
résolveur | tableau | Les paramètres de la méthode sont obtenus et la clé est générée à l'aide resolver: (args => {return args[0];}), afin que le premier paramètre de la méthode puisse être obtenu comme key |
ttl | nombre | Délai d'expiration du cache, unité :秒 |
URL | chaîne | L'URL de la requête ne sera mise en cache que si elle contient ce préfixe. Par exemple, /api/* sera mis en cache lorsqu'il est demandé, et /admin/* ne sera pas mis en cache lorsqu'il est demandé. |
La méthode d'écriture de route native d'Egg.js est trop lourde. Le routage de cool-admin
prend en charge BaseController
et d'autres supports natifs. Pour plus de détails, veuillez vous référer au routage egg.js.
En plus des opérations simples sur une seule table, les affaires réelles nécessitent souvent des opérations complexes sur la base de données. À l'heure actuelle, nous pouvons personnaliser SQL en service
,Par exemple
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 ) ;
}
paramètre | taper | illustrer |
---|---|---|
condition | Booléen | Ce n'est que lorsque les conditions modifiées seront remplies que le SQL et les paramètres correspondants seront épissés. |
SQL | chaîne | Paramètres qui doivent être épissés |
paramètres | tableau | Paramètres correspondants |