يعتمد الإطار الأساسي للواجهة الخلفية لإصدار 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
##فيديو تعليمي:
فيديو تمهيدي بسيط عن الواجهة الخلفية للمشرف الرائع (اكتب بسرعة 6 واجهات API): https://www.bilibili.com/video/BV1SE411j74K
يتم استخدام Cool-admin مع الأطراف الأمامية والخلفية: https://www.bilibili.com/video/av90478011/
البرنامج التعليمي للتدريب الداخلي على الواجهة الأمامية لـ 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
new/admin/sys/role/delete
/admin/sys/role/update
update/admin/sys/role/info
معلومات فردية/admin/sys/role/list
معلومات القائمة/admin/sys/role/page
استعلام الترحيل (بما في ذلك الاستعلام الغامض، ومطابقة الحقول الكاملة، وما إلى ذلك) المعلمة | يكتب | يوضح |
---|---|---|
keyWordLikeFields | صفيف | يتطلب الاستعلام المبهم حقولًا متطابقة، مثل [ 'name','phone' ] ، بحيث يمكنك الاستعلام المبهم عن حقلي姓名、手机 . |
أين | كائن TypeORM بين قوسين | تم إصلاح مكان إعداد الشرط، راجع النموذج للحصول على التفاصيل |
مكافئ المجال | صفيف | الشروط الديناميكية متطابقة تمامًا. إذا كنت بحاجة إلى تصفية 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 |
ttl | رقم | وقت انتهاء ذاكرة التخزين المؤقت، الوحدة:秒 |
عنوان 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 | خيط | المعلمات التي تحتاج إلى الربط |
المعلمات | صفيف | المعلمات المقابلة |