- 博客(53)
- 收藏
- 关注
原创 向全栈迈进——Angular+Tornado开发树洞博客(十一)
在上一篇博客中,我们开发了评论系统的前端部分,介绍了angular中模板的概念。在这篇博客中,我们将继续开发评论系统的前端部分,并介绍组件间通信的相关内容。打开comments.component.ts文件,输入以下内容://comments.component.tsimport { Component, Input, OnInit } from '@angular/core';import { CommentService } from 'src/app/service/comment.servi
2021-11-21 16:51:53
1684
原创 向全栈迈进——Angular+Tornado开发树洞博客(十)
在上一篇博客的结尾,我们简要介绍了评论系统的思路。现在让我们来真正开发这个评论系统。2 评论系统前端部分我们评论系统由两个组件组成:comments和commentform。comments组件会显示所有评论以及发布评论的表单;而commentform就是我们发布评论的表单。我们打开cmd窗口,输入以下命令,建立comments组件以及commentform组件:ng g c comments -m storyng g c commentform -m story这样我们就在story目录下得
2021-11-07 21:33:59
298
1
原创 向全栈迈进——Angular+Tornado开发树洞博客(九)
在上一篇博客中,我们建立了story模块,并在其中完成了书写故事功能的开发。在这篇博客中,我们将实现首页上展示的故事列表,并开始开发评论功能。十二 故事列表的开发1 前端部分我们需要建立一个home组件作为我们呈现故事列表的地方。我们打开cmd,输入以下命令,建立一个home组件:ng g c home然后,我们在app.module.ts中引入NG-ZORRO提供的标签组件,以便在之后对故事进行分类展示://app.module.ts//...import { NzTabsModule
2021-10-06 15:37:56
846
原创 向全栈迈进——Angular+Tornado开发树洞博客(八)
在上一篇博客中,我们实现了用户登录功能,并介绍了如何在angular中使用cookie,以及angular中路由事件的使用。在这期博客中,我们将开始开发我们的核心功能——故事系统与评论系统。我们的故事系统和评论系统如下图所示:故事系统由一个简单的表单组成,包括标题栏和内容栏,内容栏我们会使用之前安装好的ngx-quill富文本框插件来实现,以支持富文本功能。我们的评论系统如下图所示:用户可以对每篇故事发表评论,且可以对故事下的每篇评论再次评论,形成一个评论树。下面,就让我们看看该如何实现这两个
2021-09-20 20:50:10
368
原创 向全栈迈进——Angular+Tornado开发树洞博客(七)
在上一篇博客中,我为大家介绍了angular调用服务的原理,以及实现了用户登录功能的前端部分。在这期博客中,我们将继续实现用户登录的后端部分,以及介绍angular的路由事件。十 用户登录功能的开发2 后端部分我们打开util/users/userutil.py文件,实现loginuser函数:# util/users/userutil.pydef loginuser(username,password): password = encryption(password) user
2021-09-04 21:01:43
248
原创 向全栈迈进——Angular+Tornado开发树洞博客(六)
在上一篇博客中,我们完成了用户注册功能的开发,实现了第一个完整的功能。在这篇博客中,我们将介绍angular通过服务访问后端服务器的原理,以及开始开发用户登录功能。九 angular中的Service原理1 可观察对象Observable首先,让我们复习一下我们的服务是怎么写的:import { Injectable } from '@angular/core';import { HttpClient } from '@angular/common/http';import { register
2021-08-29 22:04:22
240
原创 向全栈迈进——Angular+Tornado开发树洞博客(五)
在上一篇博客中,我们实现了注册组件的前端部分,使用了angular提供的表单系统,并构造了一个服务来访问后端服务器。在这篇博客中,我们将搭建后端部分的框架,并继续实现注册功能的后端部分。八 用户注册功能的开发3 后端部分3.1 后端框架介绍如我们在这个系列第一篇所言,我们的后端部分采用tornado框架,搭配sqlalchemy和alembic这款ORM框架,来组成我们的后端server。而我们的数据库部分采用sqlite3这种轻量型的数据库。tornado是一款异步非阻塞的web框架,其既是we
2021-08-15 17:04:18
457
1
原创 向全栈迈进——Angular+Tornado开发树洞博客(四)
在上一篇博客中,我们实现了第一个angular组件,并把它作为了我们的主页面。在这期博客中,我们将实现用户注册功能的前端以及后端功能的实现,真正进入到全栈开发。八 用户注册功能的开发这个功能的实现分为两部分:前端部分和后端部分。前端部分包括angular组件的建立以及服务的建立,而后端部分为tornado服务器部分以及对应的数据库表的建立。我们之后的每个功能都会如下分别介绍前端和后端部分。1 前端部分1.1 注册组件的建立我们打开cmd页面,输入如下命令建立register组件:ng g c r
2021-08-01 17:57:41
463
原创 向全栈迈进——Angular+Tornado开发树洞博客(三)
在上一期博客中,我们建立了第一个angular项目,并介绍了angular项目中的重要文件。在这期博客中,我们开始安装重要的第三方插件,并开始编写我们的第一个angular组件。六 使用npm命令安装第三方组件我们首先来安装NG-ZORRO,这是一个遵循Ant Design设计规范的Angular UI组件库,提供了非常多的常用组件,任何组织、企业和个人均可免费使用。我们在cmd中进入到项目目录,输入以下命令来安装NG-ZORRO:npm install ng-zorro-antd@11 --save
2021-07-25 22:18:04
672
原创 向全栈迈进——Angular+Tornado开发树洞博客(二)
在上一篇博客中,我向大家介绍了这个系列要开发的博客的技术栈以及总体架构图,相信大家对我们要开发的东西已经有了一个初步的了解。在这期博客中,就让我们把相关的软件工具安装好,并开始我们第一个angular项目。三 软件工具的安装1 node.js的安装从node.js官网https://nodejs.org/zh-cn/download/下载node.js的LTS版本(当前为14.17.3),下载好后选好安装路径,一路next即可。安装完成后,打开cmd界面,输入node -v命令,若能显示版本号,
2021-07-12 22:09:22
521
1
原创 向全栈迈进——Angular+Tornado开发树洞博客(一)
在写了Django和Tornado两个纯后端系列的博客后,我决定在前端方面也提升一下自己的技术,不再用原生的html凑合写个页面来支持后端的开发了。正好最近公司正在推动angular框架技术,因此我将前端学习的重点放在了angular框架上。这个系列将为大家带来angular+tornado这一组合,我们将使用这个组合来实现一个树洞博客。所谓树洞博客,就是一个大家可以匿名倾诉秘密的地方,大家可以把内心想说出的东西匿名发布在网络上,从而疏解内心的压力。我们的树洞博客雏形如下:在首页中可以看到用
2021-07-06 22:11:29
522
1
原创 使用VMware体验Win11
昨天,微软正式官宣了下一代操作系统Win11。出于尝鲜的目的,我决定在VMware里体验一下这个新系统,顺便把安装过程也分享下。工具:VMware,Win11镜像。首先打开VMware,创建虚拟机。这里我选择最后一项,稍后再加载。这里选64位的Win10,然后设置存放位置和虚拟机名称,再指定磁盘大小。我是选了120G。这里点击自定义硬件,选到CD/DVD一项,右边把Win11的镜像加载进去,然后点关闭。点完成,启动虚拟机。看到这行字的时候,连点回车键...
2021-06-25 22:01:22
903
1
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(十一)
在上一篇博客中,我们实现了填写假单以及查看假单的功能。在这篇博客中,我们将实现审批假单的功能,以及构建用户权限系统,防止用户执行没有权限的功能。十五 审批假单审批假单的界面如下所示:在这个页面,用户可以看到他所有下级提交的假期申请,并对其进行操作批准或拒绝。打开util/users/timesheetutil.py,实现util函数:# util/users/timesheetutil.pydef changevacationapplystate(vacationId,state
2021-03-20 21:41:46
244
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(十)
在上一篇博客中,我们完成了请假系统的数据库部分设计,现在让我们来实现后端和前端的功能。十三 填写假单我们打开base_nav.html,在其中添加新的展开栏,用于放置请假相关功能:<!--base_nav.html--><!--之前代码略,总之就是左侧导航栏继续往下加就是--> <li> <a href="#" data-toggle="colla
2021-02-21 20:31:32
214
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(九)
在上一篇博客中,我们完成了考勤系统的基本功能。现在,让我们继续开发请假系统。十一 构建事件种类还记得我们之前建立的考勤事件么?在当前的设计中,考勤事件有两个字段:事件代码和事件名称,现在我们决定给考勤事件增加一个种类的字段,来表明该事件属于何种事件。我们需要建立一个新表来存储考勤事件的种类,就叫它TimeSheetEventCategory吧。在database目录下建立tbltimesheeteventcategory.py,输入以下代码:# database/tbltimeshee
2021-01-24 20:37:30
223
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(八)
在上一篇博客中,我们补全了一些用户系统的相关功能,这期让我们来实现用户的上下级关系以及考勤审批十 用户上下级和考勤审批在我们的系统中,每个用户只有一个上级,但每个用户可以有多个下级。因此,我们需要给User表加一个名为supervisor的字段,表明该用户的上级是谁。一个用户的可以审批其所有下级的考勤,他自身的考勤也只能被他的上级审批。我们migrate目录下打开Powershell,输入以下命令:alembic revision -m "add supervisor on user ta
2021-01-17 20:54:50
241
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(七)
在上一篇博客中,我们对项目结构进行了一些调整,并且实现了查看考勤功能。今天我们来补全一些用户系统的功能:用户管理、批准用户、注销用户、用户登出这4个功能。9 用户管理、批准、注销及登出此功能的作用是批准用户的注册,并同时调整其用户组。只有得到了批准的用户在之后的权限系统中才能使用相关功能。该功能的页面如下:在这个页面,我们可以看到所有的用户(除了Root用户外),也会显示出每个用户的邮箱、所属用户组、状态、注册时间和最后登录时间。在每行的最后,可以对用户进行注销或批准的操作。从图上可知,te
2021-01-10 20:47:52
324
原创 Tornado笔记——用Tornado搭建假单统计考勤系统(六)
这篇和上一篇博文隔的时间有点远了,希望大家还记得我们这个系统之前都做了什么。在上一篇博客中,我们构造了一个复杂的表单和calendar类来实现填写考勤的功能。现在,我们要实现查看考勤以及审批考勤的功能。6 项目目录结构的调整现在我们的项目已经有了很多的RequestHandler,把这么多RequestHandler都放在一个main.py文件里会很不好管理,因此,我们需要对项目的结构做一点调整,把这些RequestHandler按功能放到不同的目录里。调整后的目录结构如下:我们主要调.
2021-01-09 20:49:53
269
原创 Tornado笔记——用Tornado搭建假单统计系统(五)
在上篇博客中,我们搭建了考勤部分的主页,提供填写考勤和查看考勤的入口。在这篇博客中,将继续为大家带来填写考勤和查看考勤部分的代码。目前,本系列博客的所有代码都已上传到github,库地址为git@github.com:CapLiu/LeaveManage.git,大家可以上去查看,之后的代码也将更新到这个库中。5 填写考勤在介绍填写考勤部分之前,我们先对上篇博文中提到的Calendar类做一点小改动。这是我们上篇博客的图,可见这个日历是从周三开始的,而不是从周一开始的。事实上,在之前的Cal
2020-11-29 21:04:08
267
原创 Tornado笔记——用Tornado搭建假单统计系统(四)
目前,我们已经实现了基本的用户系统,现在让我们进入考勤部分的开发。十 考勤管理1 考勤系统总览我们初步实现如下几个功能:创建考勤事件、考勤填写以及考勤查看。创建考勤事件可以让我们创建不同的考勤事件,如正常出勤、事假、病假等;考勤填写顾名思义,是用来填写考勤的;而考勤查看用于查看已经填写好的考勤。我们的考勤系统为月度考勤,即每次填写一个月的考勤记录。可以看到,我们左边的导航栏发生了一些变化:原本的创建用户组和查看用户组现在被放在了用户组管理的一级菜单下;原本的用户管理现在也变成了一个新的一级菜
2020-11-15 20:26:48
270
原创 Tornado笔记——用Tornado搭建假单统计系统(三)
在上一篇博客里,我们实现了建立用户组的功能,现在让我们来注册我们的第一个用户,并实现一个初始化系统的功能。七 用户注册我们的用户注册界面长这个样子:这个页面包含一个简单的表单,可供用户输入用户名、密码、Email以及选择用户组。这次我们先写后端函数,我们需要两个util函数来完成用户注册功能:createuser和encryption。前者用于根据参数来创建用户,而后者实现对密码的加密功能,最终存放在数据库中的是加密后的密码。# util/users/userutil.py# .
2020-10-17 20:56:20
288
原创 Tornado笔记——用Tornado搭建假单统计系统(二)
在上一篇博客里,我们用Tornado初步搭好了这个系统的架子,现在让我们开始往里填充一些内容。五 Tornado基础介绍首先让我们复习一下这个架子的后端代码:# server/main.py import sysimport platformimport osimport tornado.ioloopimport tornado.webfrom tornado.web import urlfrom setting.globalsettings import getconfig,
2020-10-11 16:36:39
476
1
原创 Tornado笔记——用Tornado搭建假单统计系统
距离上一次写博客已经有些日子了,之前的阎王殿工程由于未能明确脑洞的方向无疾而终,但相关的技术已转为了我的技术储备。在这半年里,我使用Tornado搭建了工作中所用的内部网站,对于Tornado的相关开发也有了一定的体会。因此,我决定再写一个关于Tornado的系列建站教程,这次我们要搭建一个假单(出勤)统计系统,可以统计员工每周的请假和出勤情况。一 框架和工具在这个系列中,我将选择以下工具和框架作为后端开发工具:Web框架:Tornado ORM框架:SQLAlchemy+Alembic 数
2020-10-07 17:40:08
545
1
原创 生死簿后台管理系统(一)——使用Docker构建开发环境
最近有个段子非常火,说有个程序员梦见自己被阎王召见,让他帮忙开发一个后台管理系统。在一笑而过之后,我觉得如果要是能把这个系统做出来,应该颇具娱乐性,也顺便了解一下高并发以及大数据的相关技术——每天要上生死簿的人估计不会少。于是,本着娱乐大众的目的,我抓来了一个mysql的DBA@BigCat_X还有一个前端@MC,开始构建这个系统。我们初步决定的技术路线为:数据库使用mysql,web服务器使...
2019-06-07 16:16:12
6573
5
原创 技术笔记外传二——用elasticsearch搭建自己的搜索框架(四)
五 esengine的视图表单类在上一篇博客中,我们实现了高级搜索的后台部分。高级搜索可以使我们组合各种条件来进行搜索,从而得到更精确的结果。在这篇博客中,我将为大家介绍esengine的视图表单类,以及一个自定义django标签highlightresult。通过自定义标签,用户可以在前端对搜索结果进行自定义。esengine的表单与之前的whoosh版框架表单大同小异,这里主要介绍它的...
2019-03-24 16:21:18
671
原创 技术笔记外传二——用elasticsearch搭建自己的搜索框架(三)
四 esengine的高级搜索这篇博客中,我们将介绍esengine的高级搜索,如下图所示:在图中右上角是一个多字段搜索表单,以及一个通向高级搜索功能的链接。点击高级搜索,会进入到高级搜索页面中:在高级搜索页面中,esengine提供一个复杂的表单来设置搜索的各种条件,包括要包含的关键字以及要排除的关键字,还有在指定的范围内进行搜索;在得到搜索结果后,我们可以在页面右上角的表单...
2019-03-16 22:34:27
552
原创 技术笔记外传二——用elasticsearch搭建自己的搜索框架(二)
三 ElasticSearch的搜索功能以及esengine搜索的实现在上期博客中,我们用elasticsearch为我们的博客建立了索引,为我们的框架提供了数据基础。这期博客中,我们将介绍elasticsearch中的核心功能——搜索,并实现框架中的单字段搜索以及多字段搜索功能。在实现了框架中的搜索功能后,我们可以得到以下结果:页面右上角出现了一个带有复选框的搜索表单,我们可以对...
2019-03-09 21:21:05
427
原创 技术笔记外传二——用elasticsearch搭建自己的搜索框架(一)
在上一个系列的外传中,我们实现了用whoosh搭建的搜索框架。Whoosh作为纯python的搜索库,其使用方便简单,适合作为搜索方面的入门库。然而,elasticsearch由于其强大的分布式设计,以及易于扩容的特性,被更广泛地应用在各个商业场景中。在这个系列中,我们将使用elasticsearch来搭建我们的搜索框架,主要会涉及到以下方面:elasticsearch的安装及运行;建立elast...
2019-01-20 19:51:05
1000
原创 技术笔记外传——用whoosh搭建自己的搜索框架(四)
在上一篇博客中,我对这个搜索框架的搜索功能进行了扩展,使其能搜索模型中外键字段的内容,大幅增强了搜索能力。这篇博文中,我将继续介绍这个搜索框架中最后两部分:表单和视图类。五 blogsearchengine的表单与视图类如haystack一样,我们的blogsearchengine框架也提供了基本的表单类和视图类,以供用户快速实现他们自己的搜索功能。blogsearchengine框架提供...
2018-12-01 21:25:24
603
2
原创 技术笔记外传——用whoosh搭建自己的搜索框架(三)
四 blogsearchengine的高级模式在上一篇博文里,我们实现了我们搜索框架的核心功能——建立更新索引,以及搜索功能。在这篇博文里,我们将实现一个高级模式,此模式允许我们对模型的外键建立索引。在我们之前的代码中,我们建立的索引仅针对模型本身的字段,而不会对该模型涉及的外键模型进行索引。这样就引出了一个问题:我们的blogs模型的auther字段是连接到User模型的外键,在我们现有...
2018-11-24 16:56:07
396
原创 技术笔记外传——用whoosh搭建自己的搜索框架(二)
在上一篇博客中,我们为我们的搜索框架实现了建立索引schema以及初始化索引的工作。对于一个搜索引擎来说,应该可以跟踪搜索对象的更新,确保永远将最新的内容保存在索引中,因此我们需要一个更新算法以确保我们搜索的内容永远是最新的。我们向engine.py文件中添加如下代码,实现对搜索内容的增量更新:# blogsearchengine/searchengine.pyclass search...
2018-11-17 21:13:36
1316
1
原创 技术笔记外传——用whoosh搭建自己的搜索框架(一)
在之前的博文中,我对haystack进行了诸多方面的吐槽,因此就产生了摆脱haystack的想法,而是利用whoosh搜索库自己实现搜索功能。为了提升搜索功能的通用性,我将其也设计成一个即插即用的app,算是自己实现了一个简单的搜索框架——blogsearchengine。由于这个搜索框架目前的服务对象是基于我们的个人博客,因此将其命名为blogsearchengine。然而,作为一个具备通用...
2018-11-11 16:31:14
2158
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十五)
这篇博客中,我们继续研究haystack的使用。在上一篇博客中,我们对haystack提供的SearchView类进行了扩展,建立了我们自己的blogSearchView类用于添加我们自己的额外数据。然而,基于类的view在使用上还是有诸多不便,比如我们无法通过request对象拿到当前登录的user,并将user相关的信息返回到搜索结果页面上,造成页面内容的缺失:上图中的"用户:"后面为...
2018-10-29 22:21:52
379
1
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十四)
上一篇博客中,我们将博客系统的用户系统全部迁移到了auth.User模型下。本来打算介绍下使用BootStrap框架美化前端的内容,然而感觉个人的前端技术实在是粗糙,且对js/css一点好感都没有,因此这里只放个改版之后的图片好了:可以看到,在导航栏的最右侧出现了一个搜索栏,在此输入关键字,我们可以在搜索结果页面中看到高亮的关键字:这就是我们在此篇博客中要介绍的内容——使用hays...
2018-10-14 22:03:32
308
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十三)
在上一篇博文中,我们使用django自带的auth.user重写了users App的所有相关功能,并且将旧模型的user全部迁移到了新的model下。在这篇博文中,我们继续将blog App中与user相关的功能迁移到auth.User中。这样,在这篇博文结束时,我们整个博客的用户系统均会迁移到auth.User下。首先是对数据模型的更改。blog App涉及到user相关的数据模型为Blo...
2018-08-20 21:33:58
472
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十二)
这个系列好久没有更新了,主要是因为之前没有找到下一步开发的方向。这几天又看了看django的文档,决定研究下django的权限和用户系统,并采用django的用户系统重写之前的users app,将以前涉及到users的功能全部替换为django的User类。这篇博文主要介绍以下内容:1. django的auth.User的基本功能使用;2. 将原本注册在users类的user数据迁移到aut...
2018-07-29 21:16:48
330
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十一)
在这篇博客中,主要内容为基于Redis的博客点赞功能以及基于cookies的博客阅读数统计。本篇可以当成上一篇的续集来看,因为本篇的内容原本是想和上一篇一并写出来,但看了看篇幅还是决定把这两部分内容单独拿出来比较好,上一篇讲消息系统的实现篇幅已经很长了。
2018-04-07 21:42:56
268
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(十)
在本篇博客中,我们将使用redis实现一个简单的用户消息系统。当博客被评论或被点赞时,作者将收到对应的消息,并可以在主页中收到未读消息的提示。在用户管理界面,我们将添加消息箱,用于查看未读消息,以及将全部消息设置为已读。
2018-04-06 20:47:24
282
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(九)
这个系列好久没有更新了,主要是之前在实现了那么多功能后处于一个迷惘期,不知道下一步开发/学习的方向是什么。在参考了一些相关资料后,决定给这个博客加上基于redis的缓存机制,点亮Redis这个技能。在这篇博文中,我们将给博客的相关数据加上Redis缓存,以便用户在访问博客时可以更快加载。Redis是一款基于内存的key-value型数据库,广泛用于缓存服务。由于它将数据存储在内存中,使得其加载数据...
2018-03-25 21:06:36
290
原创 技术笔记——Django+Nginx+uwsgi搭建自己的博客(八)
在这篇博客中,我们开始为我们的博客开发Blogs App和Users App相关的管理功能,以便每个用户都能管理自己的博客以及评论。目前,Users App的管理功能相对简单,主要功能为查看用户资料以及切换到博客管理页面,如下所示:在点击了博客管理后,页面将跳转到管理页面,在此可进行对博客的各种管理:我们的博客管理操作支持对博客的编辑、删除,对草稿的编辑、删除和对评论的删除
2018-01-16 22:00:31
430
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人