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

news/2024/4/28 4:44:53/文章来源:https://blog.csdn.net/weixin_33824363/article/details/88602658

一.简介

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

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

相关文章

红帽/centos系统使用本地yum仓库安装httpd搭建简易网站

确保yum仓库正常 安装httpd服务 yum install httpd 输入Y继续安装依赖包 本人使用虚拟机环境的话需要先安装完httpd后创建快照!!!!方便还原状态! 2:启动httpd服务,默认未启动 systemctl start httpd //启…

红帽/centos系统使用httpd搭建域名网站-第二篇

继续上一篇,恢复快照上篇文章快照 点击右下角网络设置 查看是否是NAT 如果是的话,使用root账户登陆系统!!!! 查看分配的ip多少,进入设置ipv4,改为手动,ip网关等都改为前面…

安利phpEnv,用于本地开发测试的网站搭建环境集成神器

好在哪里? 不需要单独安装apache 不需要单独安装mysql 不需要php(也不需要配置) 不需要安装phpmyadmin 环境集成,小白利器,类似服务器面板(宝塔面板这种的集成环境) 安装主程序phpEnv&…

红帽linux/centos系统使用本地yum仓库安装httpd搭建简易网站

确保yum仓库正常:点我查看配置yum仓库 安装httpd服务 yum install httpd 输入Y继续安装依赖包 本人使用虚拟机环境的话需要先安装完httpd后创建快照!!!!方便还原状态! ![来源:麻木博客]](htt…

文档网站源码_[源码和文档分享]基于JAVA FX实现的酒店预订系统网站

1 产品概述参考酒店预订系统用例文档和酒店预订系统软件需求规格说明文档中队产品的概括描述。酒店预订系统主要是应用于网上预定远程酒店订单的在线系统。2 用户界面层的分解根据需求,系统存在30个用户界面:客户界面,酒店工作人员界面&#…

multiple root tags怎么解决_沈阳SEO外包服务-网站内链优化怎么做

搜索引擎算法已经调整,降低外链对于网站优化的作用,把优化的要点放在了网站本身,除了网站内容的质量之外,还有就是网站内部链接,做好内链优化也是网站优化工作的重中之重,良好的网站内链结构,利…

网站服务器怎么安装gzip,iis网站如何设置gzip压缩?

很多朋友对于“gzip网页压缩”还是比较陌生的,其实对于做seo的我们来说应该会对他有一定的认识,大家都知道网站压缩后对于搜索引擎的收录也是有一定好处的,对于用户体验也是有好处的。那么到底什么是gzip网页压缩?工具/原料网站管理权限远程…

Web服务器群集--Nginx网站服务(运行控制,访问状态统计,基于授权和客户端的访问控制,基于域名,端口,IP的虚拟web主机访问)

文章目录前言一:Nginx服务基础1.1:Nginx概述1.2:Nginx编译安装(过程)1.3:运行控制(实验过程)1.4:配置文件nginx.conf1.5:Nginx的访问状态统计(实验…

tomcat上部署网站的三种方式

一、利用webapps文件夹自动部署 这是最简单的方式,只要将网站直接拷贝到:tomcat根目录下的webapps文件夹里 举例:helloworld文件夹下创建里index.html文件,然后把helloworld文件夹移动到tomcat根目录下webapps文件夹里&#xff…

使用Python爬取itcast网站的视频

一:准备工作 安装requests模块确定目标的url二:完成代码 requests的模块的get方法中,stream参数设置为True,对于获取响应的res,就可以使用iter_content函数iter_conten()函数能返回可以迭代的内容该方法多用于抓取视频&#xf…

网站优化seo最终详解_上海网站seo优化公司,网站seo优化推广外包

SEO搜索引擎优化是一种利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式。seo搜索优化具体长期稳定流量,推广费用极低的优势,所以长久以来seo一直被各大企业网站所青睐,把网站关键词搜索排名做好了,后面就可…

google搜索从入门到精通v4.0_SEO新手,如何提升关键字的Google排名

在做Google SEO的过程中,有一些刚入门的SEOer经常会查询某个关键字看自己网站有没有排名,可是结果都是让人失望,在这个关键字排名里根本看不到自己网站。 明明自己每天都在很努力地去做SEO了,可当你在搜索这个关键词的时候却没有自…

红帽启动mysql_启动与停止 - 红帽企业版Linux3下Mysql5数据库的安装方法_数据库技术_Linux公社-Linux系统门户网站...

启动与停止1、启动MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可。[roottest1 init.d]# /etc/init.d/mysql start2、停止/usr/bin/mysqladmin -u root -p shutdown3、自动启动1)察看mysql是否在自动启动列表中[roottest1 local]# …

Java水果商城PPT_java毕业设计_springboot框架的水果销售购物商城网站

这是一个基于java的毕业设计项目,毕设课题为springboot框架的水果销售购物商城网站, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jspspringbootmybatis, 水果销售购物商城网站采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该水果销售…

C/C++/Linux「学习必备」珍藏多年的学习网站分享 | 工欲善其事必先利其器

这里分享的是C/C学习阶段所需网站,经博主自用使用频率较高的几个网站。废话不多说,直接看正文。 ps:初学者可以从菜鸟教程、w3school 在线教程等网站学习一遍基础知识,再结合本篇文章提供的网站食用更佳。 文章目录一、参考手册C…

很好的英文资料书籍下载网站

https://freebookcentre.net/ 很好的英文资料书籍下载,

自学宝典:10个学习Android开发的网站推荐

本文作者Tikitoo总结自己在学习Android开发过程中发现的好网站,包括Android Developers、GitHub等,以给初学者一些建议,少走一些弯路。1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计&am…

从云服务器购买到宝塔linux搭建web服务到域名绑定到HTTPs绑定再到可视化网站搭建,零基础教程一文搞定(图文解说)

简介 由于疫情原因,二狗子被困家中已经数月,不过二狗子发现了疫情期间的诸多优惠政策,于是便有了今天这篇文章。对于想要拥有个人网站又没有硬核技术与经济实力的草根群众而言,本文可以在很大程度上提供零基础教程和基本思路&…

centos php 网站配置,centos PHP环境配置

‍‍‍‍1、检测系统是否已经安装Apache‍‍ #rpm -qa|grep httpd出现如下:‍‍‍‍ 卸载:rpm -e httpd-2.2.3-43.el5.centos --nodeps‍‍‍‍ 注:--nodeps 是强制卸载‍‍‍‍2、请保证你的 Linux 系统中安装了 gcc、g 编译器检查是否安…

icomoon图标_轻松玩转PPT图标,让PPT更精致,还有7大免费图标网站赠送

图标是具有指代意义的具有标识性质的图形,它不仅是一种图形,更是一种标识,它具有高度浓缩并快捷传达信息、便于记忆的特性。而且应用极为广泛。软硬件、网页、社交场所还有公共场所中,可谓无处不在。公共场所的各种标志和交通标志…