ThinkTs是参考了[ThinkPHP+Nestjs+FastAPI]这四种的实现,当然目的也是为产品经理打造的,理念是每一天都有可能实现一个小目标(项目)……
@Class(["add","del","fix","info","page"])//or @Class("/admin",……)or @Class("admin",……)
class Admin extends Controller{
@Inject(Admin$) readonly a_:Admin$
@Inject(User$) readonly u_:User$
@Middle(W.Log,W.V_B("account|1#3~10","pwd#6~23|1"))
@app.post("register")
add(@B b,@R r:Response) {
r.status=202;//设置状态码
return this.u_.register(b.account,b.pwd)
}
}
/** Here's how to show EJS template rendering */
class View{
@Get() @Get("index.html")
index(ctx:Context){
html(ctx,{test:"test",author:"asciphx"}).next().value
}
@Get("login.html")
login(ctx:Context){
html(ctx,{test:"test",author:"Login"}).next().value
}
}
export default class User$ extends $ implements F{
constructor(
private u=Inject(User),private r=Inject(Role)
) {
super({
leftJoin:{e:"u.roles",a:'role'},
addSelect:['role.id','role.name'],
where: query => new Brackets(qb => {
if (query.account) qb.where('account like :v', { v: `%${query.account}%` })
if (query.id) qb.andWhere('u.id >:i', { i: query.id })
}),
orderBy: { "u.id": "desc" }
},"u")
}
}
export default interface UserFace{
/** register one*/register(entity)
/** login one*/login(entity)
/** search all*/all()
}
Headers请求头现在为2个参数,原版jwt不变。现增加一个secret,算法是在cryptoUtil.ts里并由后端额外提供动态secret,此项目只是个高度安全的案例,只要后端代码加强算法并不泄露,就难破解。
t:`${token}` s:`${secret}`特别地,localhost:8080/index.html是Postman界面,记住登陆后记录token和sercet,并像上面使用即可。前端目前还在实现中,先暂给大家用Postman尝鲜 在正式环境下启动的指令,windows使用的是
npm run pro
,Mac或者Linux是npm run prod
.正式环境下请使用npm run pm2
开启多核心。 新增redis,为了每个线程上的服务可同步缓存,在app/config.ts下设置synchronize,默认6秒,redis密码在config配置 允许使用postgres(在ormconfig.js中配置),win用户得用登录win账户名,我是Asciphx(其他系统记得改下),并且也需在pgsql中创建spring这个database 若启动时出现QueryFailedError请用对应sql文件在查询窗口/工具 内粘贴进去执行(即相当于导入功能),导入暂时还没测,注意mysql必须用utf8mb4编码 socketIo版和普通版放到了example目录下,如需使用请覆盖到顶级目录即可 注意:布尔类型字段,尽量用application/json的格式传输,这样后台就不用对这样的字段处理了 压测前请把pm2开启,并且使用cluster集群模式,instances最好是max,生产环境下多核测试性能方面相当于.net core的75% ./.vscode目录下包含正式环境下压测图,本机是i5的6核心cpu,启动1分钟后,每个核心占用50M+内存,一共300M+[非常少],rps大概在1350左右。
后端文件入口
控制层
实体层
接口层
服务层
基础层
工具层
后台ejs模板渲染文件夹/前端打包文件夹
windows用到linux的rm与cp指令程序,需放环境变量目录
提供前端的路由文件,每个controller会创建一个
上传文件的存储目录
后端打包到正式环境的目录
pm2输出日志目录
存放SocketIo的模板,还有普通的模板
请参考nestjs的微服务模式文档,基本上可以实现
[example目录下面其他版本直接覆盖到顶层目录即可替换]
PATH路径,自动生成的(匹配规则)
增加:POST/admin
删除:DELETE/admin/
修改:PUT/admin/
查询:GET/admin/
分页:GET/admin
菜单只包含目录结构,没有请求路径。 路由的上级节点只能是菜单,包含请求路径。
按钮的上级节点只能是路由,而且必须没有请求路径,是因为按钮的功能都基于spa单页应用。
put方法实际上跟patch方法等同,如果局部修改也不会影响其他,所以没写patch装饰器。
ormconfig.js注释中包含是否输出log或错误,取消注释即可使用。 JWT默认禁用,方便测试。
其中synchronize设置为true是自动同步,若是修改了实体类,自动同步可能会导致修改的字段数据清空。
所以保存之前,重启服务前,先在数据库改,比如字段长度。然后在实体类改成一样的并保存,最后再重启服务。
或,synchronize设置false,修改实体类重启服务则不同步 ,然后手动在数据库修改成与实体类一样的属性。
restful规范中的返回值实际太费带宽,而我认为前端只需判断返回是字符串还是对象,如字符串就直接显示(前端弹窗就行),
如返回对象,请求状态码一定是200,所以只拿重要数据而不需code状态码和massage提示成功(那两东西完全是浪费流量)。
该项目离serverless又更近了一步,目前是发布版,redis会自动重连。自动生成的curd也附带了参数校验。
如你觉有收获,请给我打赏
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。