El marco básico de backend de la versión Node se basa en Egg.js (producido por Alibaba)
Componente npm único publicado por cool-admin.com
Node.js>=8.9.0
Redis
mysql
Cree una nueva base de datos e impórtela, modifique la información de conexión de la base de datos
Se recomienda utilizar yarn
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
yarn
yarn dev
http : //localhost:7001
o npm
git clone https: //github.com/apgzs/cool-admin-api.git
cd cool - admin - api
npm install
npm run dev
http : //localhost:7001
##Videotutorial:
Video introductorio simple sobre el backend de administración genial (escriba rápidamente 6 interfaces API): https://www.bilibili.com/video/BV1SE411j74K
Cool-admin se usa junto con los extremos frontal y posterior: https://www.bilibili.com/video/av90478011/
Tutorial de capacitación interna cruda de front-end de cool-admin: https://www.bilibili.com/video/av89512654/
El modelo de datos debe colocarse en app/entities/*
; de lo contrario, typeorm no puede reconocerlo, como por ejemplo:
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 ;
}
Una vez completada la nueva creación y ejecutado el código, puede ver que se ha creado una nueva tabla sys_role
en la base de datos. Si no necesita crear automáticamente la carpeta config
, modifique el archivo de configuración de typeorm.
Después de tener la tabla de datos, si queremos operar la tabla de datos a través de la interfaz, debemos crear un nuevo controlador correspondiente en la carpeta controller
, como por ejemplo:
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(可选)
}
}
De esta manera, hemos completado la escritura de 6 interfaces. Las interfaces correspondientes son las siguientes:
/admin/sys/role/add
nuevo/admin/sys/role/delete
/admin/sys/role/update
/admin/sys/role/info
información única/admin/sys/role/list
/admin/sys/role/page
(incluidas consultas difusas, coincidencia de campos completos, etc.) parámetro | tipo | ilustrar |
---|---|---|
clavePalabraComoCampos | formación | La consulta difusa requiere campos coincidentes, como [ 'name','phone' ] , para que pueda realizar una consulta difusa en los dos campos姓名、手机 . |
dónde | Objeto de corchetes TypeORM | Se corrigió la configuración de condición donde, consulte typeorm para obtener más detalles. |
campoEq | formación | Las condiciones dinámicas coinciden completamente. Si necesita filtrar status del usuario, puede configurarlo en ['status'] En este momento, la interfaz puede aceptar el valor del status y tener un efecto de filtrado en los datos. |
agregarPedidoPor | objeto | Se pueden pasar varias condiciones de clasificación, como { sortNum:asc, createTime:desc } |
En algunos escenarios comerciales, no queremos operar la base de datos cada vez que solicitamos la interfaz, como las recomendaciones de hoy, las clasificaciones del mes pasado, etc. Los datos se almacenan en redis
. Nota: las anotaciones de caché solo son válidas en 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号' ] ;
}
}
parámetro | tipo | ilustrar |
---|---|---|
solucionador | formación | Los parámetros del método se obtienen y la clave se genera usando resolver: (args => {return args[0];}), de modo que el primer parámetro del método se pueda obtener como key |
ttl | número | Tiempo de caducidad de la caché, unidad:秒 |
URL | cadena | La URL de solicitud solo se almacenará en caché si contiene este prefijo. Por ejemplo, /api/* se almacenará en caché cuando se solicite y /admin/* no se almacenará en caché cuando se solicite. |
El método de escritura de rutas nativas de Egg.js es demasiado engorroso. El enrutamiento de cool-admin
admite BaseController
y otros soportes nativos. Para obtener más información, consulte el enrutamiento de egg.js.
Además de las operaciones simples en una sola tabla, los negocios reales a menudo requieren algunas operaciones complejas en la base de datos. En este momento podemos personalizar SQL en service
, como
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 ) ;
}
parámetro | tipo | ilustrar |
---|---|---|
condición | Booleano | Solo cuando se cumplan las condiciones modificadas se unirán el SQL y los parámetros correspondientes. |
SQL | cadena | Parámetros que necesitan ser empalmados |
parámetros | formación | Parámetros correspondientes |