Das Backend-Grundgerüst der Node-Version basiert auf Egg.js (hergestellt von Alibaba).
Einzigartige NPM-Komponente, veröffentlicht von cool-admin.com
Node.js>=8.9.0
Redis
mysql
Erstellen Sie eine neue Datenbank, importieren Sie sie und ändern Sie die Datenbankverbindungsinformationen
Es wird empfohlen, yarn
zu verwenden
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
yarn
yarn dev
http : //localhost:7001
oder npm
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
npm install
npm run dev
http : //localhost:7001
##Video-Tutorial:
Einfaches Einführungsvideo zum Cool-Admin-Backend (schnell 6 API-Schnittstellen schreiben): https://www.bilibili.com/video/BV1SE411j74K
Cool-admin wird zusammen mit dem Front- und Backend verwendet: https://www.bilibili.com/video/av90478011/
Cool-Admin-Front-End-Crud-internes Schulungs-Tutorial: https://www.bilibili.com/video/av89512654/
Das Datenmodell muss unter app/entities/*
abgelegt werden, sonst kann Typeorm es nicht erkennen, wie zum Beispiel:
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 ;
}
Nachdem die neue Erstellung abgeschlossen und der Code ausgeführt wurde, können Sie sehen, dass eine neue sys_role
Tabelle in der Datenbank erstellt wurde. Wenn Sie den config
nicht automatisch erstellen müssen, ändern Sie die Typeorm-Konfigurationsdatei.
Wenn wir nach Erhalt der Datentabelle die Datentabelle über die Schnittstelle bedienen möchten, müssen wir einen neuen entsprechenden Controller im controller
Ordner erstellen, z. B.:
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(可选)
}
}
Auf diese Weise haben wir das Schreiben von 6 Schnittstellen abgeschlossen. Die entsprechenden Schnittstellen lauten wie folgt:
/admin/sys/role/add
new/admin/sys/role/delete
/admin/sys/role/update
/admin/sys/role/info
Einzelinformationen/admin/sys/role/list
Listeninformationen/admin/sys/role/page
Paging-Abfrage (einschließlich Fuzzy-Abfrage, vollständiger Feldabgleich usw.) Parameter | Typ | veranschaulichen |
---|---|---|
keyWordLikeFields | Array | Fuzzy-Abfragen erfordern übereinstimmende Felder wie [ 'name','phone' ] , damit Sie die beiden Felder姓名、手机 unscharf abfragen können. |
Wo | TypeORM Brackets-Objekt | Die Einstellung der Where-Bedingung wurde korrigiert. Weitere Informationen finden Sie im Typeorm |
fieldEq | Array | Dynamische Bedingungen werden vollständig angepasst. Wenn Sie den status filtern müssen, können Sie ihn auf ['status'] setzen. Zu diesem Zeitpunkt kann die Schnittstelle den Wert von status akzeptieren und einen Filtereffekt auf die Daten haben. |
addOrderBy | Objekt | Es können mehrere Sortierbedingungen übergeben werden, z. B. { sortNum:asc, createTime:desc } |
In einigen Geschäftsszenarien möchten wir die Datenbank nicht jedes Mal bedienen, wenn wir die Schnittstelle anfordern, z. B. die heutigen Empfehlungen, die Rangliste des letzten Monats usw. Die Daten werden in redis
gespeichert. Hinweis: Cache-Anmerkungen sind nur in service
gültig.
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号' ] ;
}
}
Parameter | Typ | veranschaulichen |
---|---|---|
Resolver | Array | Die Methodenparameter werden abgerufen und der Schlüssel wird mit resolver: (args => {return args[0];}), sodass der erste Parameter der Methode als Cache- key |
ttl | Nummer | Cache-Ablaufzeit, Einheit:秒 |
URL | Zeichenfolge | Die Anforderungs-URL wird nur zwischengespeichert, wenn sie dieses Präfix enthält. Beispielsweise wird /api/* bei Anforderung zwischengespeichert, und /admin/* wird bei Anforderung nicht zwischengespeichert. |
Die native Route-Schreibmethode von Egg.js ist zu umständlich. Das Routing von cool-admin
unterstützt BaseController
und andere native Unterstützungen.
Zusätzlich zu einfachen Vorgängen an einer einzelnen Tabelle erfordern reale Geschäfte häufig einige komplexe Vorgänge an der Datenbank. Zu diesem Zeitpunkt können wir SQL im service
anpassen, z
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 ) ;
}
Parameter | Typ | veranschaulichen |
---|---|---|
Zustand | Boolescher Wert | Erst wenn die geänderten Bedingungen erfüllt sind, werden die entsprechende SQL und die entsprechenden Parameter gespleißt. |
sql | Zeichenfolge | Parameter, die gespleißt werden müssen |
Parameter | Array | Entsprechende Parameter |