A estrutura básica de backend da versão Node é baseada em Egg.js (produzido por Alibaba)
Componente npm exclusivo publicado por cool-admin.com
Node.js>=8.9.0
Redis
mysql
Crie um novo banco de dados e importe-o, modifique as informações de conexão do banco de dados
Recomenda-se usar 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
##Tutorial em vídeo:
Vídeo introdutório simples sobre o back-end cool-admin (escreva rapidamente 6 interfaces API): https://www.bilibili.com/video/BV1SE411j74K
Cool-admin é usado junto com front e back-ends: https://www.bilibili.com/video/av90478011/
tutorial de treinamento interno de front-end crud cool-admin: https://www.bilibili.com/video/av89512654/
O modelo de dados deve ser colocado em app/entities/*
, caso contrário, o typeorm não poderá reconhecê-lo, como:
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 ;
}
Após a conclusão da nova criação e a execução do código, você poderá ver que uma nova tabela sys_role
foi criada no banco de dados. Se você não precisar criar automaticamente a pasta config
, modifique o arquivo de configuração typeorm.
Depois de ter a tabela de dados, se quisermos operá-la através da interface, devemos criar um novo controlador correspondente na pasta controller
, como:
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(可选)
}
}
Desta forma, concluímos a escrita de 6 interfaces. As interfaces correspondentes são as seguintes:
/admin/sys/role/add
novo/admin/sys/role/delete
/admin/sys/role/update
/admin/sys/role/info
informações únicas/admin/sys/role/list
informações da lista/admin/sys/role/page
consulta de paginação (incluindo consulta difusa, correspondência completa de campos, etc.) parâmetro | tipo | ilustrar |
---|---|---|
keyWordLikeFields | variedade | A consulta difusa requer campos correspondentes, como [ 'name','phone' ] , para que você possa consultar os dois campos姓名、手机 . |
onde | Objeto colchetes TypeORM | Corrigida a configuração da condição where, consulte typeorm para obter detalhes |
campoEq | variedade | As condições dinâmicas são totalmente correspondidas. Se você precisar filtrar status do usuário, poderá configurá-lo para ['status'] . Neste momento, a interface pode aceitar o valor do status e ter um efeito de filtragem nos dados. |
adicionarOrderBy | objeto | Várias condições de classificação podem ser passadas, como { sortNum:asc, createTime:desc } |
Em alguns cenários de negócios, não queremos operar o banco de dados toda vez que solicitamos a interface, como as recomendações de hoje, as classificações do mês passado, etc. Os dados são armazenados em redis
Nota: As anotações de cache são válidas apenas na camada 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 |
---|---|---|
resolvedor | variedade | Os parâmetros do método são obtidos e a chave é gerada usando resolver: (args => {return args[0];}), para que o primeiro parâmetro do método possa ser obtido como a key |
TTL | número | Tempo de expiração do cache, unidade:秒 |
url | corda | O URL da solicitação só será armazenado em cache se contiver esse prefixo. Por exemplo, /api/* será armazenado em cache quando solicitado e /admin/* não será armazenado em cache quando solicitado. |
O método de escrita de rota nativa do Egg.js é muito complicado. O roteamento do cool-admin
suporta BaseController
e outros suportes nativos. Para obter detalhes, consulte roteamento egg.js.
Além de operações simples em uma única tabela, os negócios reais geralmente exigem algumas operações complexas no banco de dados. Neste momento podemos personalizar o SQL no 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 |
---|---|---|
doença | Booleano | Somente quando as condições alteradas forem atendidas o sql e os parâmetros correspondentes serão unidos. |
SQL | corda | Parâmetros que precisam ser emendados |
parâmetros | variedade | Parâmetros correspondentes |