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

news/2024/4/27 8:51:15/文章来源:https://blog.csdn.net/weixin_34255055/article/details/88602661

一.简介

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

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

相关文章

网站缩略图工具介绍

为什么80%的码农都做不了架构师?>>> 网站缩略图工具介绍 1. ShrinkTheWeb 功能很强大的缩略图生成网站。 2. websnapr 功能还算一般,最不方便的就是不提供API接口。 3. Super Screenshot 把页面以图片形式抓取下来,并可保存为…

网站策划:如何确定网站的用户群体

不管是商业性网站还是非商业性网站,只要是面对公众的网站,都需要一个目标用户群体。网站需要明确为哪个群体服务。尤其是商业性网站,有了目标用户群,才能创造真正的市场空间。 网站的目标用户群与网站的定位直接相关。不同的定位意…

[转10大全球设计师SNS社区网站]

国内sns有一定的发展,但专业的sns还未有成果,设计领域,各大门户各自为政,蓝色的sns稍有起色,其他的还未见雏形!这里收集了10大设计师的sns社区网站!希望对国内同仁有所启迪!Aniboom …

网站架构之缓存应用(2)实现篇

上一篇我主要总结了网站缓存中的一些基本概念,以及我对于网站架构缓存应用的架构实现思路,这篇主要分享下如何利用微软企业库来实现一二级缓存的缓存服务。 为了能够有效的管理缓存,需要对使用缓存方法上做一些规范,即要…

seo技术_基础知识_网站pr值的意义_如何提升网站权重和PR值?

点击关注 不迷路如何提升网站权重和PR值网站权重是什么?类似于一个人的人品或威望一样,网站在搜索引擎那边也有一个威望的衡量指标,叫做网站权重。可以简单说,网站权重就是指网站的重要性。如何查看网站权重?01网站权重是什么?类似于一个人…

十个帮助你提高字体使用和排版技巧的网站

我一直觉得掌握字体的使用和排版技巧是很难的。之前和大家分享了很多的字体资源,有英文手写字体、复古字体、广告字体、LOGO字体等等很多的字体资源,在这么多的字体中,如何把合适的字体用在合适的地方是很有学问的。下面收集了十个字体使用技…

mapreduce编程初级实践_2020年学习编程最好的10个网站

程序员书库(ID:CodingBook) 猿妹编译链接:https://levelup.gitconnected.com/its-time-to-start-learning-coding-top-20-best-websites-to-learn-programming-in-2020-9c5105c76c96编程领域的人才增长率是21%(比其他领域都要高),很明显&…

centos服务端ftp的搭建_如何使用8元搭建一个网站

如何使用8元搭建一个网站(我也是第一次)首先你需要如下: 一台服务器(建议使用香港地区的服务器,不需要备案),一个域名(要不要都可以)还有一双手(我相信大家都…

浅谈移动互联网时代中小企业该如何革命?---手机网站

中国移动通信集团公司董事长奚国华表示“创新是技术发展的原动力。我们在技术上能够提供宽带业务,关键是互联网企业加强开发出老百姓喜闻乐见的各种各样的应用。”CBSi(中国)高级副总裁刘小东同样表示,“将旧有的互联网服务简单的照搬到移动互联网上并不…

【转】IIS网站访问需要输入用户名和密码

xp系统下安装IIS5,并设置好网站路径,但是访问网站时需要输入用户名和密码,这个问题极大可能是因为你网站放置在一个文件系统为NTFS的盘符上,而IIS默认的访问用户时IUSR开头的来宾账户,而此IUSR开头的账户对放置网站的那…

Ubuntu 网站服务器环境搭建

如果想用Ubuntu作为网站的服务器,一些基本的服务是必备的。本文对环境的搭建做一个简单的整理。 Appach Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的…

Docker学习のDocker中部署静态页网站

前言:部署一个静态页网站,我们需要 常见映射80端口的交互式容器安装Nginx(或其他服务器)安装文本编辑器vim创建静态页面修改Ngnix的配置文件运行Ngnix验证网站的防高温一、设置容器的端口映射 访问网站需要开放端口,因…

使用Bootstrap 3开发响应式网站实践02,轮播

本篇体验图片轮播。html部分为&#xff1a;<div class"carousel slide" id"myCarousel" ><!--Indicators--><ol class"carousel-indicators"><li class"active" data-slide-to"0" data-target"#…

百度商桥放在php网站哪里_什么是营销型网站,你是真的知道吗

营销型网站和展示型网站差别不大&#xff0c;偶买噶&#xff0c;那你就错了&#xff0c;大错特错了&#xff0c;你老板也该哭了&#xff0c;花钱买了假货营销型网站会比展示型网站往往贵出1倍甚至10倍&#xff0c;其实&#xff0c;我个人觉得现在的销售为了签单&#xff0c;总是…

复制网站部分内容_个人网站项目之范文网站运营可行性和盈利模式

我们在上学的时候有没有寻找个人简历模板和自荐信参考范文&#xff1f;我们在工作的时候有没有寻找年终总结和工作计划范文&#xff1f;我们参与演讲的时候有没有找到演讲稿&#xff1f;时时刻刻我们在工作和学习中都会寻找和参考范文&#xff0c;所以我们遇到范文需求参考的时…

url获取网站信息不包含网页源文件内的标签_今天教大家一招最简单的爬虫!利用urllib进行简单的网页抓取!...

(1)protocol&#xff1a;第一部分就是协议&#xff0c;例如百度使用的就是https协议&#xff1b;(2)hostname[:port]&#xff1a;第二部分就是主机名(还有端口号为可选参数)&#xff0c;一般网站默认的端口号为80&#xff0c;例如百度的主机名就是www.baidu.com&#xff0c;这个…

在线音乐网站【04】Part two 功能实现

今天把剩余功能的具体实现补充总结&#xff0c;如果你想对整个小项目有清楚的了解&#xff0c;建议去看下前几篇博客。 1.在线音乐网站&#xff08;1&#xff09;需求和功能结构 2.在线音乐网站&#xff08;2&#xff09;数据库和开发环境 3.在线音乐网站&#xff08;3&#xf…

js外链跳转_贴吧外链,百度贴吧推广对SEO有用吗?

对于SEO而言&#xff0c;我们的兴趣爱好更多的是大于工作&#xff0c;因此&#xff0c;在很长一段时间里&#xff0c;我会花费大量的时间去测试与研究&#xff0c;相关的优化策略是否具有实际的操作价值。特别是在外链增长这一块&#xff0c;虽然&#xff0c;搜索引擎一在试图调…

centos删除mysql服务器上,centos如何删除mysql_网站服务器运行维护,centos

docker如何运行项目_网站服务器运行维护docker运行项目的方法是&#xff1a;1、进入存放自己项目war的目录&#xff1b;2、build镜像&#xff1b;3、运行docker容器&#xff1b;4、执行命令【192.168.1.178:8888/myproject】访问项目即可。彻底卸载mysql&#xff1a;卸载mysql安…

php fpm独立用户,PHP网站简单架构 – 单独跑php-fpm

这个架构比较简单,不做过多的说明前端1台Nginx&#xff1a;负载均衡nfs中间2台php&#xff1a;php-fpm后端1台数据库&#xff1a;MySQL安装略&#xff0c;参考《lnmp最新源码一键安装包》192.168.112安装Tengine192.168.1.113/192.168.1.115安装php192.168.1.114安装MySQLnfs配…