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

news/2024/4/28 15:21:09/文章来源:https://blog.csdn.net/weixin_34102807/article/details/88602662

一.简介

这个个人博客网站最初制作的目的就是练习使用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_829419.aspx

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

相关文章

apache配置网站访问统计awstats

1、解压缩awstas软件2、建立配置文件3、在屏幕最下面输入/usr/local/httpd/conf/httpd.confyy4、修改站点统计配置文件修改下面的两项建立数据目录5、执行日志分析6、为了及时更新和更新方便,创建计划任务在客户机上访问日志分析系统http://www.google.com/awstats/…

谷歌惩罚过度使用SEO技术网站 希望公平竞争

3月18日消息 据国外媒体报道,科技博客网站Search Engine Land报道称,谷歌计划惩罚过度使用搜索引擎优化(以下简称”SEO“)技术的网站。 谷歌工程师马特库兹(Matt Cutts)在最近的South by Southwest会议上讨…

网站翻译功能

功能分两块:1、获取页面上要翻译的内容; 2、将内容从自定义的资源包中匹配; 我的网站翻译就是在创建html页面的时候,重写其中的一个方法, 第一步:获取页面上要翻译的内容: 在MVC中由这么一个类&…

使用搜索引擎在指定网站内搜索指定内容

转载于:https://my.oschina.net/ZhenyuanLiu/blog/1819737

整理了20个最全的设计师学习网站,推荐收藏!

2019独角兽企业重金招聘Python工程师标准>>> 设计师都喜欢浏览一些设计网站,那么什么样的网站是对我们平时的工作学习有一定的帮助的呢?今天小编给大家整理了20个设计网站,用途不同,觉得有用的小伙伴可以收藏学习。 设…

40个漂亮的单页网站设计案例(上篇)

有很多人喜欢单页网站,这种网站只有一个页面,设计都很精美,通过锚记进行平滑的导航。不过,并不是每个网站都适合做成单页,一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站…

zblog换了服务器网站打不开,龙三公子博客-ZBlog固定网站域名开启导致网站打不开的解决办法...

在操作给本博客网站实现https时,遇到了一个问题,就是zblog网站后台有一个固定网站域名的功能,因为开启这个功能前没修改,https实现后,网站后台登入出现了问题,能进入,但不能保存提交。因为该功能…

35个国外优秀的网页设计工作室和作品集展示网站

设计工作室和设计公司为了能充分展现他们团队的设计水平,都会竭尽全力去设计他们自己的网站,并把最优秀的设计作品展示出来。下面分享的这些精美网站都是收集的非常优秀的网页设计工作室和作品集展示网站,一起欣赏。 您可能还喜欢 30个漂亮的…

百度对网站改版及301设置的说明

根据调研发现,部分网站在改版时由于改版的情况不同,会遇到新旧网站收录的问题,对网站的流量带来一定的损失,在目前情况下建议网站不要频繁的进行改版,若需改版建议在改版时采用新旧内容并存一段时间之后再设置301跳转的…

域名解析 cdn网站_一文搞懂CDN加速原理

点击上方蓝字设为星标每天傍晚18:00一起成长!原文来自:https://www.jianshu.com/p/1dae6e1680ff一、什么是 CDNCDN 的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0…

java expected_「expected」JAVA常见错误之 expected - seo实验室

expected例1:public class line1{int test1666;line2 l2new line2();l2.ShowIt(test1);}例2:public class line1{int test1666;line2 l2new line2();line1(){l2.ShowIt(test1);}}编译前者会出现如下错误:原因所写的调用方法的语句放在类中的位置不对,必须…

ea分析php类,PHP解析读取gridea静态博客RSS整合到网站首页

最近在更新typecho个人网站和gridea静态博客,需要在网站首页展现博客的动态,因为Gridea静态博客,没有数据库,前期都是手工将博客的标题和链接添加到网站的首页,今天启用了博客的RSS聚合系统,可以通过RSS实现…

[转]网站优化-IIS7下静态文件的优化

本文转自:http://www.cnblogs.com/Leung/archive/2009/10/26/1590256.html 在网站开发过程中,通常我们会对网站的静态文件做处事,像图片文件,CSS,JS文件,其实以前也写过类似的文章,现在只是做一个针对性的总结下. JS文件处理: 网站优化来说,其实是见议我们放在网页最…

我是如何对网站CSS进行架构的

一、写在前面的 都是自己积累形成的一些东西,可能带有明显的个人印记。不是专业内容,不是权威指南,只是展示一点自己的观点,借此希望能与各位优秀的同行交流看法,见解。以得到进步与提高。 二、我所知的一些过往的做法…

文字图片转换成html代码,IMG4Me 网站在线把文字转换为图片

IMG4Me网站首页截图文字做成图片,很简单的操作,但今天所介绍的网站IMG4Me.com所要做的并非简单地输入文字就直接生成图片,而希望借助这种方式,来防范垃圾邮件。如果你有过这样的经历——不小心留下自己的邮件地址或其他信息&#…

网站安全狗apache V3.1新版来啦 抵御网络攻击

2019独角兽企业重金招聘Python工程师标准>>> 当当当~~~网站安全狗apache V3.1新版来啦~~~大家是不是也一直在期待apache的新版呢?还等什么~~~到安全狗官网下载安装个吧~~ 安全狗官网地址http://www.safedog.cn/website_safedog.html 此次版本主要更新的…

【matlab教程】07、资源共享网站 file exchange

地址:https://ww2.mathworks.cn/matlabcentral/fileexchange/ 里面可能会有用得上的函数,比如我想找读obj的函数 readobj 下载-解压-把函数放入自己的代码文件夹中就行

生产环境-linux-网站被挂******经历

安全与方便始终是对立的,然而运维人员忽视系统安全方面的建设,带来的后果将是非常严重的,以下是一台未上线服务器***后的***经历。一、出现异常,排查原因发现异常是通过远端监控脚本发现访问网站时断时续,使用ssh工具连…

dhclient获取不到ip_网站接入CDN后如何设置获取真实的用户IP地址信息

一般我们在使用WordPress程序的时候,在评论后台是可以看到用户留言的信息的,包括用户的IP地址。当然也包括我们在使用的日志查看用户日志信息的。但是,如果我们启用CDN内容分发功能之后,获取到的IP地址信息都是CDN 的IP地址&#…

在线正则表达式网站

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/xiechaoyong/blog/413804