Vue+thinkJs博客网站(二)之thinkJs的使用

news/2024/4/28 6:40:28/文章来源:https://blog.csdn.net/weixin_34250709/article/details/88602657

一.简介

这个个人博客网站最初制作的目的就是练习使用thinkJs,这一篇就主要讲一下thinkJs的一些特性和注意事项。涉及到了文件上传,thinkJs的插件机制,model层建立以及CURD的编写方式等。本项目github地址在这里。

项目thinkJs端主要参考了知乎上大佬Ischo的文章,链接在这。

二.thinkJs model层写法

这里主要讲两个部分,一是表对应的js文件,二是CRUD写法。项目表结构比较简单,一共八个表,包含多对一,一对多,多对多关系。主要的几个表,都对应着model文件夹下的js文件,表关系也在这个js里维护。这里我们以model/content.js为例讲一哈:

module.exports = class extends think.Model {// 模型关联get relation() {return {category: {type: think.Model.BELONG_TO,model: "meta",key: "category_id",fKey: "id",field: "id,name,slug,description,count"},tag: {type: think.Model.MANY_TO_MANY,model: "meta",rModel: "relationship",rfKey: "meta_id",key: "id",fKey: "content_id",field: "id,name,slug,description,count"},comment: {type: think.Model.HAS_MANY,key: "id",fKey: "content_id",where: "status=99",order: "create_time desc"},user: {type: think.Model.BELONG_TO,model: "user",key: "user_id",fKey: "id",field: "id,username,email,qq,github,weibo,zhihu"}};}// 添加文章async insert(data) {const tags = data.tag;data = this.parseContent(data);delete data.tag;const id = await this.add(data);const relation = [];tags.forEach(val => {relation.push({content_id: id,meta_id: val});});think.model("relationship").addMany(relation);// 更新文章数量this.updateCount(data.category_id, tags);return id;}
}

这里代码没有截全,完整代码看github。

我们看到这个对象分为两部分,一个是get relation写的表映射关系。可以看到content表与meta表存在一对一关系(type: think.Model.BELONG_TO),这里key:category_id是content表里的字段,即外键,fkey:id是对应的meta表里的字段。查询时,会封装层user.category对象,对象属性就是field 定义的id,name,slug,description,count。content 与user也存在多对多关系(type: think.Model.MANY_TO_MANY),rfModel是多对多关系下,对应的关联关系模型名,默认值为二个模型名的组合,rfKey是多对多关系下,关系表对应的 key。

另一个是Model里的方法,相当于自定义的model方法,比如这里定义的insert,就可以在controller里通过this.model('content').insert()调用。

thinkJS的CRUD操作,不是直接写sql,而是在sql基础上封装一层,通过调用model的方法来操作。think.Model 基类提供了丰富的方法进行 CRUD 操作,具体如下:

查询数据
模型提供了多种方法来查询数据,如:find 查询单条数据
select 查询多条数据
count 查询总条数
countSelect 分页查询数据
max 查询字段的最大值
avg 查询字段的平均值
min 查询字段的最小值
sum 对字段值进行求和
getField 查询指定字段的值
同时模型支持通过下面的方法指定 SQL 语句中的特定条件,如:where 指定 SQL 语句中的 where 条件
limit / page 指定 SQL 语句中的 limit
field / fieldReverse 指定 SQL 语句中的 field
order 指定 SQL 语句中的 order
group 指定 SQL 语句中的 group
join 指定 SQL 语句中的 join
union 指定 SQL 语句中的 union
having 指定 SQL 语句中的 having
cache 设置查询缓存
添加数据
模型提供了下列的方法来添加数据:add 添加单条数据
thenAdd where 条件不存在时添加
addMany 添加多条数据
selectAdd 添加子查询的结果数据
更新数据
模型提供了下列的方法来更新数据:update 更新单条数据
updateMany 更新多条数据
thenUpdate 条件式更新
increment 字段增加值
decrement 字段减少值
删除数据
模型提供了下列的方法来删除数据:delete 删除数据
手动执行 SQL 语句
有时候模型包装的方法不能满足所有的情况,这时候需要手工指定 SQL 语句,可以通过下面的方法进行:query 手写 SQL 语句查询
execute 手写 SQL 语句执行

比如我们要查询content表数据,在Controller里通过thin.model('content').where(param).select()来查询。

thinkJs的Model层与之前用过的java的数据层框架hibernate比较相似,都是基于面向对象的思想对sql进行封装,表与Model(实体类),通过model方法进行CRUD操作,特别省sql。

三.插件机制的实现

参考的博主实现的插件机制还是很好用的,这里我就拿了过来。插件机制可以说是自定义的钩子函数。首先在src新建service文件夹,新建js文件(以cache.js为例)

module.exports = class extends think.Service {static registerHook() {return {content: ["contentCreate", "contentUpdate", "contentDelete"]};}/*** 更新内容缓存* @param  {[type]} data [description]* @return {[type]}      [description]*/content(data) {think.cache("recent_content", null);}
};

registerHook里content对应的数组表示钩子函数的调用名,具体调用的是下面的content方法。在controller里这么调用

 await this.hook("contentUpdate", data);

钩子函数的注册这里放到了worker进程里,thinkJs运行流程具体的可以看看官网在这里

work.js代码如下:

think.beforeStartServer(async () => {const hooks = [];for (const Service of Object.values(think.app.services)) {const isHookService = think.isFunction(Service.registerHook);if (!isHookService) {continue;}const service = new Service();const serviceHooks = Service.registerHook();for (const hookFuncName in serviceHooks) {if (!think.isFunction(service[hookFuncName])) {continue;}let funcForHooks = serviceHooks[hookFuncName];if (think.isString(funcForHooks)) {funcForHooks = [funcForHooks];}if (!think.isArray(funcForHooks)) {continue;}for (const hookName of funcForHooks) {if (!hooks[hookName]) {hooks[hookName] = [];}hooks[hookName].push({ service, method: hookFuncName });}}}think.config("hooks", hooks);
});

这里将service里定义的method遍历取出,按一定格式保存并存放到数组,最后放到think.config里面,项目启动后这些过程就已经执行了。

think.Controller本身没有hook方法,这里需要在extend里面加上controller.js,代码如下:

module.exports = {/*** 执行hook* @param  {[type]}    name [description]* @param  {...[type]} args [description]* @return {[type]}         [description]*/async hook(name, ...args) {const { hooks } = think.config();const hookFuncs = hooks[name];if (!think.isArray(hookFuncs)) {return;}for (const { service, method } of hookFuncs) {await service[method](...args);}}
};

这样自定义钩子函数就实现了,一些通用的后置方法就可以直接共用一个了。

四.路由

thinkJs路由写在config/router.js里,具体代码如下:

module.exports = [// RESTFUL[/\/api\/(\w+)(?:\/(.*))?/, 'api/:1?id=:2', 'rest'],[/\/font\/(\w+)\/(\w+)/, 'fontend/:1/:2'],['/:category/:slug', 'content/detail'],['/:category/:slug/comment', 'content/comment']
];

里面的数组的第一个元素是匹配url的表达式,第二个元素是分配的资源,如果是采用RESTFUL规范定义的接口,第三个元素要写作'rest'。本项目的后台接口基本都是采用RESTFUL规范,具体路由的详细讲解可以看官网链接

五.部署

项目线上部署采用PM2管理node进程,部署时把src,view,www,pm2.json,production.js放到服务器上。安装好pm2后运行

pm2 start pm2.json

注意pm2.json里需要修改cwd为服务器上你项目的目录。本项目前后端是一个服务,不存在所以没有用nginx代理。thinkJs部署相关可以看这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_813178.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝手机网站支付签约强开WAP支付,提示“系统综合评估签约条件不满足”或不满足国家法律法规或支付宝用户服务协议等的解决方案!支付宝H5支付开通方法详解

一、如何开通支付宝手机网站支付 正常来说,按照官方的指引要求填写相关资料,即可开通支付宝手机网站支付。但是,更多的时候我们的申请都会碰到一些阻力,常见的阻力就是“系统综合评估签约条件不满足,谢谢您的支持”&am…

支付宝app支付签约开通详解,快速开通支付宝APP支付手机网站支付过风险开通,支付宝App支付签约不通过的解决办法。

一、支付宝App支付简介(强开支付宝app支付进行中) App 支付适用于商家在 App 应用中集成支付宝支付功能。 商家 App 调用支付宝提供的 SDK,SDK 再调用支付宝 App 内的支付模块。如果用户已安装支付宝 App,商家 App 会跳转到…

大型网站架构技术模型

一 网站技术架构设计模式 1.1 分层 如下所示网站基本分层三层架构逻辑上可以部署在同一台物理机上,但随着网站业务的发展,必须要对已分层的模块进行分开部署,也就是三层结构分别部署在不同的服务器上。使网站拥有越来越多的计算资源以应对越来…

大型网站技术架构(一)--大型网站架构演化

转自 https://blog.csdn.net/chaofanwei/article/details/26865169 看完了有一本书,就应该有所收获,有所总结,最近把《大型网站技术架构》一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载…

大型网站技术架构之性能

1.1 网站性能测试 1.1.1 用户视角下的网站性能 用户在浏览器上直观感受的网站响应色度的快慢,用户感受到的时间,包括用户计算机和网站服务通信的时间,网站服务处理的时间,用户浏览器构造请假解析响应的时间。浏览器,带…

高性能网站实用技巧之消息队列

什么是消息队列? 消息队列( Message Queue )是一种进程间通信或同一进程的不同线程间的通信方式。进程或者线程之间通过 消息 进行通信,消息发送后可以立即返回,由消息系统来确保信息的可靠传递,消…

现实世界的Windows Azure:专访PrivacyCentral网站创始人、CEO Zoiner Tejada

作为现实世界Windows Azure博客系列中的一部分,我联系了PrivacyCentral网站创始人、CEO Zoiner Tejada,来探寻该公司是如何利用Windows Azure平台及Ruby语言来搭建其强大的在线隐私服务。点击这里来了解PrivacyCentral的成功案例。下面我们来看看Tejada先…

后台网站制作步骤

撰写时间:2019年5月14日 星期二 作者:邱锡纶 首先我们可以看见这个后台网站我已经做好了,现在我就来总结一下这个后台网站的制作步骤,这个网站是我慢慢的一步一步慢慢的想,慢慢的改,改出来的,…

网站的设计构思

(撰写时间:2019年5月20日星期一 作者:邱锡纶)网站的好坏,除了外观,还有所实现的功能。还有安全性等。一般的企业网站要 实现的功能较少,应该价格比较低。但因为是企业,所以做网…

如何制作一个好网站

(作者:邱锡纶 撰写时间:2019年7月10日星期三)根据我在网上查到“怎么制作一个高端的好网站”的结果是高端网站建设没有那么简单,需要做市场调研、营销策划、搜索引擎优化、品牌视觉设计,还有用户体验&am…

用php写的亲亲鲜花网站_文案写的好的大佬,原来是用了这14个文案网站?

越来越多的人在自媒体文案上有一定的造诣,文案功底越来越强,当然也是他们不断的学习和利用好的平台工具让自己站的更高,借力就可以四两拨千斤,原来是他们用对了文案网站和视频软,建议你也赶紧收藏,文案写作…

增加索引会锁表吗_网站百度排名,内容增量一定要是权重指标吗?

声明:本文来自于微信公众号 蝙蝠侠IT(ID:batmanit),作者:蝙蝠侠IT,授权站长之家转载发布。如果你在长期做百度SEO一定会有这样一个明显的感觉,通过每天大量的输出相关性的内容,实际上是有利于提高网站的抓取频率与整站的权重。而对…

mongodb上一篇下一篇_一篇SEO领域的文章,直接被送上首页了

前几天写了一篇关于SEO优化的文章,今天无意间发现,这篇文章居然被放到首页了。以下是截图:那么我是怎么做到的呢?这样做有什么好处呢?这样做好处就是,可以提高你的品牌词曝光率,有一定的几率会让…

代理ip网站的ip怎么来的_代理IP的三大功能

使用代理IP来工作的人越来越多,许多用户都体验到了代理IP的便利和优势,特别是它变换IP地址的功能,对很多网络行业都有着非常大的帮助。除了变换IP地址之外,代理IP还有哪些高端大气上档次的功能呢?下面就由天启代理IP来…

educoder java答案数组进阶_十个适用于Java高级开发人员的交流网站

下面这些是我收藏的适合高级Java程序员去的网站,这些网站的内容包括了IT新闻、问题解答和职业面试等信息。好网站的核心在于其高质量的内容。在我看来,这些都属于最优秀的网站。我在介绍这些网站的同时也会分享一些自己的学习方式。你可能会认为其实任何…

如何将瀑布流里的图片加链接_如何提高网站建设效率

互联网时代,当我们在进行项目开发的时候,我们都在注重效率的提升,毕竟时间就是金钱。如何在有效的时间内进行高效率的开发建设,是我们从业者应该重视的问题。我们很多时候都注重网站建设本身,想着如何进行界面、代码优…

网站建设中 模板_使用模板建设网站有哪些弊端?

在最近一段时间内,我们曾经收到过了好几位新客户的请求,在这些请求中有很多都是来要求我们去帮助他们修改现在的已有网站。首先来说我们公司主要是定制和开发网站。在我们公司里也拥有很多非常专业的程序人员,无论是前端的设计和开发还是在后…

850是什么意思_850万人被丑拒!想加入这个交友网站咋这么难?

美国有一个交友网站,特别特别看脸。其实在交友网站上,大家注重颜值是很正常的啦。但这个网站已经把“看脸”做到了极致,域名就显示了它的核心精神:beautifulpeople.com(美人)。很多人都被它主打的会员高颜值特点吸引过来&#xff…

Linux环境下网站部署常用命令

1. 查看当前文件夹下面文件夹的大小 分析:除了常规查看,还可以通过分析文件夹,磁盘不够可以清理缓存。 du -h --max-depth1 2. 拷贝文件到指定的文件夹下面 分析:移动文件,不多说。 cp -R /data/www/public/images…

PHP结合阿里云实现网站滑块验证码的具体实例

目录滑块验证码样例关于滑块验证码开发准备系统编码附录滑块验证码样例 关于滑块验证码 滑块验证码主要的作用是方便用户进行快捷验证操作,但是同时要合理的辨别到底是机器操作还是人工操作,这一点显得难度比较大,是属于人机识别的智能开发范…