| 作者 |
| 步磊峰钱游 |
| 丛书名 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782001061050 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------TypeScript图形渲染实战:基于WebGL的3D架构与实现--------------------------- 为了让广大3D图形爱好者能能够快速地学习WebGL图形编程,本书按照循序渐进的方式,由浅入深地讲解了WebGL图形编程的相关知识点。3D图形编程是一个庞大的主题,从宏观角度,笔者将整个3D图形编程分为三个层次,也即画出来、画的美和画的快。本书定位于画出来,目的是让读者使用TypeScript语言及WebGL 3D API编写一个WebGLApplication应用程序框架及WebGLUtilLib封装库,来渲染id Software公司的Quake3及Doom 3这两个引擎的场景和骨骼动画格式。 ---------------------------Python Flask Web开发入门与项目实战--------------------------- 本书从Flask框架的基础知识讲起,逐步深入到使用Flask进行Web应用开发实战。其中,重点介绍了使用Flask+SQLAlchemy进行服务端开发,以及使用Jinja 2模板引擎和Bootstrap进行前端页面开发的方法,不但可以让读者系统地学习用Python微型框架开发Web应用的相关知识,而且还能对Web开发中基于角色访问权限控制的方法等相关知识有更为深入的理解。本书提供了大量的实战案例引导读者由浅入深地学习Flask Web应用开发,可以让读者的开发水平有质的提升。 本书共16章,分为3篇。第1篇为Flask基础知识,介绍了Flask开发的环境部署及入门知识,内容涵盖了Flask程序的基本结构、Jinja 2模板、Web表单、SQLAlchemy管理数据库、装饰器的定义和使用、Memcached缓存技术等;第2篇为CMS新闻系统开发,介绍了数据库设计、数据库迁移、无限级分类的实现、登录日志、角色的访问权限控制等内容;第3篇为网站上线准备及部署,介绍了Web程序上线部署前必须要进行的单元测试、性能优化和环境部署等内容。 本书内容通俗易懂,案例丰富,实用性强,特别适合Python Web开发的入门读者和进阶读者学习,也适合PHP程序员和Java程序员等其他Web开发爱好者阅读。另外,本书可以作为相关培训机构的教材用书。 |
| 目录 |
---------------------------TypeScript图形渲染实战:基于WebGL的3D架构与实现--------------------------- 前言 第1篇 数据结构基础 第1章 SystemJS与Webpack 2 1.1 准备工作 3 1.1.1 安装Node.js 3 1.1.2 安装Viusal Studio Code 4 1.2 安装和配置SystemJS 5 1.2.1 安装SystemJS 5 1.2.2 使用SystemJS 7 1.2.3 第一个TypeScript程序 8 1.3 安装和配置Webpack 9 1.3.1 安装Webpack 9 1.3.2 配置Webpack 11 1.3.3 调用build命令 12 1.3.4 配置tsconfig.json文件 12 1.3.5 调用build和dev命令 13 1.3.6 使用watch命令 14 1.3.7 联合使用watch和dev命令 15 1.3.8 使用Webpack压缩打包源码 16 1.4 SysemJS VS. Webpack 16 1.5 编译(Compile)VS.转义(Transpile) 18 1.6 断点调试 19 1.6.1 安装及配置Debugger for Chrome扩展 19 1.6.2 断点调试TypeScript程序 20 1.6.3 VS Code Debug快捷键 21 1.7 本章总结 21 第2章 TypeScript封装和实现常用容器 22 2.1 ArrayBuffer、DataView及类型数组实现原理 23 2.1.1 C/C++模拟JS/TS中的ArrayBuffer对象 23 2.1.2 C/C++模拟JS/TS中的DataView对象 24 2.1.3 C/C++版CDataView VS. JS/TS版DataView 25 2.1.4 C/C++模拟JS/TS中的Float32Array对象 26 2.1.5 C/C++版CFloat32Array VS. JS/TS版Float32Array 28 2.1.6 JS/TS中的类型数组对象 30 2.2 封装动态类型数组 31 2.2.1 TypedArrayList的成员变量及构造函数 31 2.2.2 TypedArrayList的push方法 32 2.2.3 TypedArrayList的slice方法和subarray方法 33 2.2.4 TypedArrayList的其他方法和属性 35 2.2.5 capacityChangedCallback回调函数 36 2.3 封装关联数组 36 2.3.1 JS/TS中的关联数组 37 2.3.2 TypeScript索引签名 37 2.3.3 ES 6 Map对象 38 2.3.4 封装成Dictionary字典对象 39 2.3.5 测试Dictionary对象 42 2.3.6 红黑树还是哈希表 42 2.4 实现SGI STL风格双向循环链表 44 2.4.1 泛型的ListNode结构 45 2.4.2 List中的头节点 45 2.4.3 双向循环概念 46 2.4.4 List的查询与遍历操作 46 2.4.5 List的插入操作 48 2.4.6 List的删除操作 50 2.4.7 List的push / pop / push_front / pop_front操作 51 2.5 封装队列与栈 51 2.5.1 声明IAdapter泛型接口 52 2.5.2 实现AdapterBase抽象基类 52 2.5.3 实现Queue子类和Stack子类 53 2.6 实现通用树结构 54 2.6.1 树结构的内存表示 54 2.6.2 树节点添加时的要点 55 2.6.3 树节点isDescendantOf和remove方法的实现 56 2.6.4 实现addChild等方法 58 2.6.5 查询树结构的层次关系 59 2.6.6 广度/深度优先遍历算法 60 2.6.7 队列及栈在广度/深度优先遍历中的应用 62 2.6.8 广度/深度线性遍历枚举器 63 2.6.9 树结构枚举器的实现 63 2.6.10 测试树结构迭代器 67 2.6.11 深度优先的递归遍历 71 2.7 本章总结 73 第2篇 WebGL图形编程基础 第3章 WebGLApplication框架 76 3.1 Application体系结构概述 77 3.2 第一个WebGL Demo 78 3.2.1 技术要点描述 78 3.2.2 Demo的成员变量与构造函数 80 3.2.3 资源同步加载 82 3.2.4 立方体、坐标系、三角形及文字渲染 83 3.2.5 更新操作 85 3.2.6 键盘输入事件处理 86 3.2.7 总结Application框架的使用流程 87 3.3 Application框架实现 87 3.3.1 成员变量与构造函数 88 3.3.2 启动/查询/停止Application 89 3.3.3 不间断地更新操作 90 3.3.4 CanvasInputEvent及其子类 92 3.3.5 DOM中的getBoundingRect方法 93 3.3.6 实现viewportToCanvasCoordinate方法 94 3.3.7 将DOM Event事件转换为CanvasInputEvent事件 95 3.3.8 实现EventListenerObject接口进行事件分发 96 3.3.9 让事件起作用 97 3.3.10 定时器Timer系统 97 3.3.11 增删定时器对象 98 3.3.12 触发多个定时任务的操作 100 3.3.13 WebGLApplication子类 101 3.3.14 CameraApplication子类 102 3.4 HTML页面系统 103 3.4.1 HTML页面系统简介 103 3.4.2 HTML页面源码 104 3.4.3 入口文件main.ts 105 3.5 异步资源加载及同步操作 107 3.5.1 使用Promise封装HTTP异步请求 107 3.5.2 实现AsyncLoadTestApplication类 109 3.5.3 异步run函数的覆写(override)与测试 110 3.5.4 Promise.all异步并发加载及同步操作 111 3.5.5 本书后续的资源加载及同步策略 114 3.6 本章总结 114 第4章 WebGL基础 116 4.1 WebGL中的类 116 4.2 准备工作 117 4.2.1 创建WebGLRenderingContext对象 117 4.2.2 WebGLContextAttributes对象与帧缓冲区 118 4.2.3 渲染状态 120 4.2.4 WebGLContextEvent事件 121 4.3 基本几何图元绘制Demo 122 4.3.1 视矩阵、投影矩阵、裁剪和视口 122 4.3.2 GLSL ES着色语言 123 4.3.3 WebGLShader对象 126 4.3.4 GLSL ES精度限定符与WebGLShaderPrecisionFormat对象 128 4.3.5 WebGLProgram对象 130 4.3.6 WebGLActiveInfo对象 132 4.3.7 WebGLUniformLocation对象 134 4.3.8 WebGLBuffer对象 137 4.3.9 渲染数据存储思考 140 4.3.10 Interleaved数组的存储、寻址及绘制 141 4.3.11 drawArrays绘制基本几何图元 144 4.3.12 详解基本几何图元 146 4.3.13 drawElements绘制方法 149 4.4 本章总结 152 第5章 WebGLUtilLib渲染框架 153 5.1 WebGLUtilLib框架类结构体系 153 5.2 GLAttribState类的实现 155 5.2.1 预定义顶点属性常量值 156 5.2.2 GLAttribState类的bit位操作 157 5.2.3 getInterleavedLayoutAttribOffsetMap方法 158 5.2.4 getSequencedLayoutAttribOffsetMap方法 160 5.2.5 getSepratedLayoutAttribOffsetMap方法 161 5.2.6 getVertexByteStride方法 162 5.2.7 setAttribVertexArrayPointer方法 163 5.2.8 setAttribVertexArrayState方法 164 5.3 GLProgram相关类的实现 166 5.3.1 常用的VS和FS uniform变量 166 5.3.2 GLProgram的成员变量和构造函数 167 5.3.3 loadShaders方法 168 5.3.4 绑定和解绑GLProgram 169 5.3.5 载入uniform变量 170 5.3.6 GLProgramCache类 171 5.3.7 GLShaderSource对象 172 5.3.8 初始化常用的着色器 173 5.4 GLMesh相关类的实现 174 5.4.1 VAO对象与GLMeshBase类 174 5.4.2 GLStaticMesh类实现细节 175 5.4.3 GLMeshBuilder类成员变量 178 5.4.4 GLMeshBuilder类构造方法 179 5.4.5 GLMeshBuilder类的color、texcoord、normal和vertex方法 181 5.4.6 GLMeshBuilder类的begin和end方法 184 5.5 GLTexture类的实现 187 5.5.1 GLTexture的成员变量和构造函数 187 5.5.2 GLTexture类的upload方法 188 5.5.3 mipmap相关的静态方法 189 5.5.4 GLTexture的bind / unbind、wrap和filter方法 190 5.5.5 GLTexture的createDefaultTexture静态方法 191 5.6 本章总结 192 第6章 3D图形中的数学基础 193 6.1 坐标系 193 6.1.1 OpenGL / WebGL中的坐标系 193 6.1.2 左手坐标系与右手坐标系 194 6.2 TSM数学库 196 6.3 向量 197 6.3.1 向量的概念 197 6.3.2 向量的大小(或长度) 198 6.3.3 两个向量之间的距离 199 6.3.4 单位向量 199 6.3.5 向量的加法 199 6.3.6 向量的减法 200 6.3.7 向量的缩放 201 6.3.8 负向量 202 6.3.9 向量的点乘 202 6.3.10 向量的叉乘 203 6.4 矩阵 204 6.4.1 矩阵的定义 205 6.4.2 矩阵的乘法 205 6.4.3 单位矩阵 206 6.4.4 矩阵的转置 207 6.4.5 矩阵的行列式与求逆 207 6.5 仿射变换 208 6.5.1 平移矩阵 209 6.5.2 缩放矩阵 209 6.5.3 绕任意轴旋转矩阵 210 6.6 视图矩阵与投影矩阵 211 6.6.1 视图(摄像机)矩阵 212 6.6.2 投影矩阵 213 6.7 四元数 214 6.8 平面 215 6.8.1 构造平面 216 6.8.2 平面的单位化 217 6.8.3 点与平面的距离与关系 217 6.9 矩阵堆栈 218 6.9.1 构造函数与worldMatrix属性 219 6.9.2 矩阵的入栈、出栈及load方法 219 6.9.3 仿射变换操作 220 6.10 摄像机 220 6.10.1 成员变量和构造函数 221 6.10.2 摄像机的移动和旋转 222 6.10.3 摄像机的更新 224 6.10.4 摄像机的相关属性 225 6.11 WebGLCoordSystem类 227 6.12 本章总结 228 第7章 多视口渲染基本几何体、坐标系及文字 230 7.1 使用GLMeshBuilder多视口渲染基本几何体 230 7.1.1 Demo的需求描述 230 7.1.2 Demo的成员变量和构造函数 231 7.1.3 drawByMatrixWithColorShader方法绘制流程 233 7.1.4 使用INTERLEAVED顶点存储格式绘制三角形 234 7.1.5 使用SEQUENCED顶点存储格式绘制四边形 235 7.1.6 使用SEPARATED顶点存储格式绘制立方体 236 7.1.7 创建多视口的方法 239 7.1.8 WebGL中的纹理坐标系 240 7.1.9 drawByMultiViewportsWithTextureShader方法绘制流程 240 7.1.10 绘制纹理立方体 242 7.1.11 实现Atlas纹理贴图效果 243 7.1.12 收尾工作 245 7.2 坐标系、文字渲染及空间变换Demo 246 7.2.1 Demo的需求描述 246 7.2.2 Demo的成员变量和构造函数 247 7.2.3 生成单视口或多视口坐标系数组 248 7.2.4 覆写(override)更新和渲染虚方法 249 7.2.5 覆写(override)键盘事件处理虚方法 250 7.2.6 drawFullCoordSystem方法 250 7.2.7 drawFullCoordSystemWithRotatedCube方法 252 7.2.8 DrawHelper类的drawFullCoordSystem方法 254 7.2.9 深度测试对坐标系绘制的影响 255 7.2.10 drawText方法 256 7.2.11 MathHelper类的obj2GLViewportSpace方法 258 7.2.12 3D图形中的数学变换流水线 258 7.3 本章总结 259 第3篇 开发实战 第8章 解析与渲染Quake3 BSP场景 262 8.1 Q3BspApplication入口类 262 8.2 解析Quake3 BSP二进制文件 264 8.2.1 Quake3BspParser类的常量定义 264 8.2.2 Q3BSPLump结构定义 265 8.2.3 解析BSP文件头 266 8.2.4 解析实体字符串数据 267 8.2.5 解析材质数据 269 8.2.6 解析顶点数据 270 8.2.7 解析顶点索引数据 273 8.2.8 解析渲染表面数据 273 8.2.9 Quake3与WebGL坐标系转换 276 8.3 渲染Quake3 BSP场景 277 8.3.1 Quake3BspScene的初始化 278 8.3.2 DrawSurface对象 278 8.3.3 封装Promise加载所有纹理 279 8.3.4 生成GLStaticMesh对象 280 8.3.5 绘制整个BSP场景 282 8.4 本章总结 283 第9章 解析和渲染Doom3 PROC场景 285 9.1 Doom3Application入口类 285 9.2 解析Doom3 PROC场景 286 9.2.1 Doom3词法解析规则 287 9.2.2 IDoom3Tokenizer词法解析器 287 9.2.3 Doom3 PROC文件格式总览 288 9.2.4 Doom3ProcParser的parse方法 289 9.2.5 Doom3Area、Doom3Surface及Doom3Vertex类 290 9.2.6 Doom3ProcParser的_readArea方法 292 9.2.7 Doom3ProcParser的_readSurface方法 293 9.2.8 Doom3ProcParser的_readPortals方法 295 9.2.9 Doom3ProcParser的_readNodes方法 297 9.3 使用Doom3ProcScene加载和渲染PROC场景 298 9.3.1 RenderSurface对象 299 9.3.2 Doom3ProcScene的draw方法 299 9.3.3 Doom3ProcScene类的loadTextures方法 300 9.3.4 Doom3ProcScene的parseDoom3Map方法 301 9.4 AABB包围盒 303 9.4.1 AABB包围盒与OBB包围盒的特点 304 9.4.2 构建AABB包围盒 304 9.4.3 计算AABB包围盒的9个顶点坐标值 306 9.4.4 计算变换后的AABB包围盒 307 9.4.5 AABB包围盒的两个常用碰检算法 307 9.5 摄像机视截体 308 9.5.1 摄像机视截体的概念 308 9.5.2 Frustum类的成员变量和构造函数 309 9.5.3 buildFromCamera方法的实现 310 9.5.4 让Camera类支持Frustum 312 9.5.5 Frustum与包围盒及三角形的可见行测试 313 9.5.6 让GLStaticMesh支持包围盒 314 9.5.7 更新Doom3ProcScene的draw方法 314 9.5.8 将Frustum绘制出来 315 9.5.9 Doom3ProcScene类增加包围盒绘制方法 316 9.6 本章总结 316 第10章 解析和渲染Doom3 MD5骨骼蒙皮动画 318 10.1 骨骼蒙皮动画原理 318 10.1.1 骨骼蒙皮动画效果演示 319 10.1.2 骨骼蒙皮动画中的各种坐标系 320 10.1.3 骨骼蒙皮动画数学关键点的问答 321 10.2 解析和渲染.md5mesh文件格式 322 10.2.1 .md5mesh文件解析流程 323 10.2.2 .md5mesh中的绑定姿态 324 10.2.3 解析绑定姿态 325 10.2.4 .md5mesh中的蒙皮数据 326 10.2.5 解析蒙皮数据 329 10.2.6 计算顶点最终位置 330 10.2.7 加载和生成纹理 331 10.2.8 绘制绑定姿态(BindPose) 332 10.3 解析和渲染.md5anim文件格式 333 10.3.1 .md5anim的解析流程 333 10.3.2 解析.md5anim中的关节层次信息 334 10.3.3 解析.md5anim中的包围盒数据 336 10.3.4 解析.md5anim中的baseframe数据 337 10.3.5 解析.md5anim中的frame数据 338 10.3.6 帧动作姿态结构 339 10.3.7 MD5Anim类的buildLocalSkeleton方法 340 10.3.8 MD5Anim类的updateToModelSpaceSkeleton方法 342 10.3.9 MD5SkinedMesh类的playAnim方法 342 10.3.10 MD5SkinedMesh的drawAnimPose方法 343 10.4 实现MD5SkinedMeshApplication Demo 344 10.5 本章总结 346 ---------------------------Python Flask Web开发入门与项目实战--------------------------- 前言 本书内容导图 第1篇 Flask基础知识 第1章 开发环境部署 2 1.1 Python的安装及配置 2 1.1.1 Python的安装 2 1.1.2 测试Python是否安装成功 7 1.2 虚拟环境的配置 8 1.3 PyCharm的安装及使用 11 1.3.1 PyCharm的下载及安装 11 1.3.2 在PyCharm中新建工程 14 1.3.3 在PyCharm中设置UTF-8编码自动创建 15 1.3.4 在PyCharm中使用已经设置好的虚拟环境 17 1.4 温故知新 20 1.5 习题 20 第2章 Flask快速上手 21 2.1 Web基础知识 21 2.2 第一个Flask Web程序 22 2.2.1 安装Flask框架 23 2.2.2 在Flask中输出Hello World 25 2.3 URL传递参数 28 2.4 URL反转 29 2.5 页面跳转和重定向 30 2.6 温故知新 31 2.7 习题 31 第3章 Jinja 2模板引擎 33 3.1 模板引擎概述及简单使用 33 3.2 向模板中传递参数 35 3.3 模板中的控制语句之if语句 38 3.4 模板中的控制语句之for语句 40 3.5 Flask的过滤器 42 3.5.1 常见过滤器 42 3.5.2 自定义过滤器 44 3.6 宏的定义及使用 46 3.6.1 宏的定义 46 3.6.2 宏的导入 47 3.6.3 include的使用 49 3.7 set和with语句的使用 50 3.8 静态文件的加载 52 3.9 模板的继承 54 3.10 温故知新 57 3.11 习题 57 第4章 Flask视图高级技术 58 4.1 app.route与add_url_rule简介 58 4.1.1 app.route的使用 58 4.1.2 add_url_rule的使用 59 4.2 Flask类视图 61 4.2.1 标准类视图 61 4.2.2 基于方法的类视图 63 4.3 Flask装饰器 66 4.3.1 装饰器的定义和基本使用 66 4.3.2 对带参数的函数使用装饰器 68 4.4 蓝图 71 4.5 温故知新 72 4.6 习题 73 第5章 Flask数据交互 74 5.1 使用Flask处理表单 74 5.1.1 使用Flask处理通用表单 74 5.1.2 使用Flask-WTF处理表单 76 5.2 使用Flask上传文件 80 5.2.1 使用Flask上传文件的简单实现 81 5.2.2 改进上传功能 84 5.3 Cookie的使用 86 5.3.1 Cookie的基本概念 86 5.3.2 Cookie的基本使用 87 5.3.3 设置Cookie的作用域 90 5.4 Session的使用 92 5.4.1 Session的基本配置 92 5.4.2 Session的基本使用 93 5.5 钩子函数的使用 95 5.6 温故知新 97 5.7 习题 97 第6章 访问数据库 98 6.1 MySQL数据库安装 98 6.1.1 下载及安装MySQL 98 6.1.2 测试MySQL是否安装成功 99 6.2 Python数据库框架MySQL-Python 100 6.2.1 MySQL-Python安装 100 6.2.2 通过Python操作数据库对象 101 6.3 通过MySQL-Python进行更新数据操作 105 6.3.1 增加数据 105 6.3.2 修改数据 106 6.3.3 删除数据 107 6.4 初识Flask-SQLAlchemy 108 6.4.1 SQLAlchemy的安装 108 6.4.2 对象-关系映射实质 110 6.4.3 为什么使用ORM 111 6.5 Flask-SQLAlchemy初始化 112 6.6 Flask-SQLAlchemy模型与表映射方法1 114 6.7 Flask-SQLAlchemy模型与表映射方法2 118 6.8 数据的增、删、改、查 119 6.8.1 数据添加 119 6.8.2 数据查询 121 6.8.3 数据修改 122 6.8.4 数据删除 123 6.9 使用Flask-SQLAlchemy创建一对一的关系表 124 6.10 使用Flask-SQLAlchemy创建一对多的关系表 126 6.11 使用Flask-SQLAlchemy创建多对多的关系表 128 6.12 Flask-Script工具的使用 130 6.12.1 安装Flask-Script并初始化 130 6.12.2 Command子类创建命令 131 6.12.3 使用Command实例的@command修饰符 132 6.12.4 使用Command实例的@option修饰符创建命令 132 6.13 Flask循环引用 133 6.14 使用Flask-Migrate实现数据库迁移 136 6.14.1 安装Flask-Migrate插件 136 6.14.2 使用Flask-Migrate的步骤 136 6.15 温故知新 139 6.16 习题 139 第7章 Memcached缓存系统 140 7.1 Memcached的安装 140 7.1.1 Memcached的基本概念 140 7.1.2 Memcached的安装 141 7.2 Memcached的基本使用 143 7.2.1 set和set_multi命令的使用 143 7.2.2 get和get_multi命令的使用 144 7.2.3 add命令的使用 145 7.2.4 replace命令的使用 146 7.2.5 append和prepend命令的使用 147 7.2.6 delete和delete_multi命令的使用 148 7.2.7 decr和incr命令的使用 149 7.3 Memcached的安全机制 150 7.4 温故知新 151 7.5 习题 151 第8章 Bootstrap的基本使用 152 8.1 Bootstrap简介 152 8.2 全局CSS样式 154 8.3 栅格系统 156 8.4 Bootstrap CSS代码 162 8.5 Bootstrap表格 165 8.5.1 基础表格 165 8.5.2 条纹状表格 167 8.5.3 带边框的表格 168 8.5.4 紧凑的表格和响应式表格 170 8.5.5 状态类 172 8.6 Bootstrap表单 173 8.6.1 垂直表单 174 8.6.2 内联表单 175 8.6.3 水平表单 180 8.6.4 支持的表单控件 181 8.7 Bootstrap按钮 182 8.8 温故知新 185 8.9 习题 186 第2篇 CMS新闻系统开发 第9章 CMS后台管理员登录实现 188 9.1 CMS系统基本蓝图 188 9.2 用户模型定义 190 9.2.1 建立数据库连接并创建用户模型 190 9.2.2 用户登录密码明文变密文的处理 193 9.3 管理员登录 194 9.3.1 登录页的渲染 194 9.3.2 初步实现用户的登录 196 9.3.3 优化登录-对表单进行过滤验证 199 9.3.4 优化登录-启用登录验证码 200 9.3.5 优化登录-记住我功能实现 205 9.4 限制用户访问 206 9.5 用户名注销功能实现 207 9.6 温故知新 209 9.7 习题 210 第10章 CMS后台文章模块基本功能实现 211 10.1 管理员信息展示 211 10.1.1 管理员个人详情页搭建 211 10.1.2 管理员个人详情页实现 214 10.1.3 管理员密码修改 215 10.2 文章栏目页的实现 220 10.2.1 栏目无限级分类添加进数据库 221 10.2.2 栏目的编辑功能 224 10.2.3 栏目的删除功能 233 10.3 文章的添加、修改、删除功能的实现 235 10.3.1 文章添加功能的基本实现 235 10.3.2 文章的列表显示 244 10.3.3 文章的编辑修改 247 10.3.4 文章的删除 252 10.4 温故知新 256 10.5 习题 256 第11章 CMS后台基本评论及登录日志等功能的实现 258 11.1 评论信息管理 258 11.1.1 评论信息管理页面搭建 258 11.1.2 评论的下架和发布功能实现 267 11.1.3 评论的删除功能实现 271 11.2 登录日志、操作日志等功能实现 273 11.2.1 登录日志功能的实现 273 11.2.2 登录日志批量删除功能的实现 280 11.3 温故知新 282 11.4 习题 283 第12章 基于角色的访问控制功能实现 284 12.1 权限、角色、用户的数据库设计 284 12.2 权限管理 286 12.2.1 添加权限 286 12.2.2 权限的列表显示 290 12.2.3 权限的编辑 294 12.2.4 权限的删除 295 12.3 角色管理 297 12.3.1 角色的添加 297 12.3.2 角色的列表显示 301 12.3.3 角色的编辑功能实现 303 12.3.4 角色的删除功能实现 305 12.4 基于角色的访问控制思想及实现 307 12.5 温故知新 310 12.6 习题 310 第13章 CMS网站前台功能实现 311 13.1 用户的注册和登录功能 311 13.1.1 用户注册页面的设计 311 13.1.2 用户注册功能的实现 315 13.1.3 用户登录功能的实现 318 13.2 网站首页的基本实现 324 13.3 文章详情页功能实现 326 13.4 网站404页面功能实现 329 13.5 温故知新 330 13.6 习题 331 第14章 CMS系统代码优化 332 14.1 CSRF攻击与防御 332 14.2 视图函数的一些优化 334 14.3 将验证码保存到Memcached中 336 14.4 温故知新 337 14.5 习题 337 第3篇 网站上线准备及部署 第15章 CMS系统性能测试与单元测试 340 15.1 慢查询SQL的检测与记录 340 15.2 Flask单元测试 342 15.3 温故知新 348 15.4 习题 348 第16章 网站部署 349 16.1 服务器部署 349 16.1.1 Gunicorn的安装配置及使用 350 16.1.2 Nginx的安装及使用 352 16.1.3 安装MySQL 354 16.2 网站部署 354 16.3 温故知新 356 16.4 习题 356 |