Slog28_支配vue框架初阶项目之博客网站-文件结构调整

news/2024/4/28 13:24:47/文章来源:https://blog.csdn.net/weixin_33951761/article/details/88743193
  • ArthurSlog
  • SLog-28
  • Year·1
  • Guangzhou·China
  • Aug 1th 2018

关注微信公众号“ArthurSlog”

  • GitHub
  • 掘金主页
  • 简书主页
  • segmentfault

当你头脑发热的时候 手足无措的时候 记得 先面对遇到的事情和问题 先看清自己 认清问题 然后把解决方法一个一个记下来 最后选择一个合适的方法去解决


开发环境MacOS(High Sierra 10.13.5)

需要的信息和信息源:

  • Slog1_如何使用nodejs与mysql进行数据交互
  • Slog4_使用后端框架KOA实现静态web服务器
  • Slog6_使用vue前端框架实现单页应用(SPA)
  • Slog24
  • Slog25
  • Slog26
前端部分:
  • 统计页面-计算属性和侦听器、https://cn.vuejs.org/v2/guide... 主页:index.html
  • 注册界面-条件渲染、https://cn.vuejs.org/v2/guide... :signup.html
  • 登陆界面 :signin.html
  • 后台用户管理的界面-列表渲染、https://cn.vuejs.org/v2/guide... 用户界面: account.hmtl
  • 调查问卷-文本、多行文本、复选框、单选按钮、选择框、https://cn.vuejs.org/v2/guide... : form.html
  • 离开页面提醒-事件处理、https://cn.vuejs.org/v2/guide...
  • 移动端样式兼容-Class与Style绑定、https://cn.vuejs.org/v2/guide...
后端部分:
  • 数据库数据交互模块-部署、配置
  • 静态web服务器
  • 用户注册模块
  • 用户登陆模块
  • 统计分析模块
  • 用户状态模块-超时、无效、非法
关键思路
  • vue框架属于前端的js,需要与后端koa框架的nodejs进行交互,这是怎么做到的?
  • 直接能想到的,就是nodejs直接通过io去动态修改前端的vue文件的js代码,这样当浏览器打开html文件的时候,html文件会去加载vue的js文件,这样看起来就实现了前后端js数据的交互
  • 如果按照上面的思路,需要先等待koa后端js执行完之后,vue的js文件修改完成了之后,koa的js文件再执行重定向,调用浏览器打开修改好的html文件
  • 这样就完成了一个操作流程
  • 这里有个点?!
  • 后端框架koa使用nodejs,在操作系统纸上运行各种服务;而前端vue框架使用js,在浏览器上执行路由等各种功能,浏览器js的边界在哪里?;
  • 这就意味着,vue框架的使用范围在被限制在浏览器里了,而koa实际上是nodejs的代码集合,可以操作到vue框架也就是浏览器里的js代码;那么,可以把vue代码直接放进koa代码里,让vue的代码成为koa代码的数据的一部分(这里指的是“指令与数据”里面的数据),把vue的代码作为数据交给koa操作
  • 这里可能有两种情况:
  1. 当在浏览器点击按钮的时候,浏览器里的js向后端发去一条信息,后端的nodejs写的服务接收到这条信息之后,对这条信息进行解析和响应或执行,把执行完的结果返回给前端浏览器的js,前端浏览器的js一直在等待着返回的信息,现在收到信息后,对信息进行解析和重组,渲染成我们最终看到的页面
  2. 当在浏览器点击按钮的时候,浏览器里的js向后端发去一条信息,后端的nodejs写的服务接收到这条信息之后,对这条信息进行解析和响应或执行,把执行完的结果进行重组,最后保存为一份js文件或者html文件,然后返回一条信息给前端浏览器的js,提醒前端浏览器的js去信息里的地址里下载对应的文件,前端浏览器的js一直在等待着返回的信息,现在收到信息以及信息里的提醒后,会下载对应的文件,再把下载好的文件渲染成我们最终看到的页面
  • 有什么区别吗!?
  • 额,有的,因为这些区别,导致后面搞出来复杂的东西:
  • vue框架的诞生,就是第一种情况孕育出来的畸形产物,而vue框架实际上就是一堆js代码的集合,这些代码做了什么事情呢?这些代码把后端返回的信息进行解析和重组,生成新的html或者js或者css文件,这些文件再重新渲染浏览器界面;后来,所谓的vue服务端渲染,也就是使用后端的nodejs代码写一些服务,在服务器上把原来要直接返回前端的信息截下来,然后进行解析和重组,在服务器上生成新的html或者js或者css文件,然后提醒前端浏览器下载这些文件,浏览器下载好了,再重新加载这些文件,对浏览器界面重新进行渲染,这样前端不用再去解析和重组信息了,但。。。。事实往往是更复杂的,前端的解析和重组部分还是会继续存在,后端增加了解析和重组模块,现在,模块更多了,可以把工作分的更细了,呵呵
  • 为了实现上面的操作,需要是用nodejs写出更多的代码来支撑,这些代码就是 Vue.js 服务器端渲染指南
  • 你需要用npm安装下面这些中间件,这些中间件也就是nodejs代码的集合,用来解析和重组处理过的信息,生成html或者js或者css或者所谓的“模版”文件,在提醒前端浏览器下载,最后在浏览器中渲染出我们所看到的页面:
  1. vue & vue-server-renderer 2.3.0+
  2. vue-router 2.5.0+
  3. vue-loader 12.0.0+ & vue-style-loader 3.0.0+
  • 说到这里,上面 vue这个体系的操作使用方式 已经与入门学习脱离太远了 呵呵
  • 回到目前的项目教程,我们回归单机开发的思路,就是完全编写浏览器的js代码作为前端,编写nodejs代码作为服务器后端服务
  • 我们现在在设计一个用户管理模块,设计到用户管理前端页面 和 用户管理后端服务模块
  • 前端页面使用vue,使用js编写,这样,就很明了了,我们创建两个层次,一个层次放好服务端的js代码和其他服务端的资源和文件,另一个层次放前端代码,供客户端浏览器下载,渲染
  • 创建 server文件夹 和 client文件夹,作用就是上面所说的
  • 安排好文件结构,当前的文件结构如下
cd server

ls

server client README.md
  • server 中的文件结构是:
cd ..

cd client

ls

index.js node_modules package-lock.json package.json
  • client 中的文件结构是:
cd ..

cd client

ls

index.html signin.html signup.html form.html account.html css
  • 文件结构重新调整好后,需要检查和调整各个文件的引用路径
  • 从 server 开始检查:
  • 调整 index.js 代码

index.js

const serve = require('koa-static');
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();// $ GET /package.json
app.use(serve('../client'));//
router.get('/signin', async (ctx) => {var mysql = require('mysql');var connection = mysql.createConnection({host: 'localhost',user: 'root',password: '88888888',database: 'my_db'});connection.connect(function (err) {if (err) {console.error('error connecting: ' + err.stack);return;}console.log('connected as id ' + connection.threadId);});var response = {"name": ctx.query.name,"password": ctx.query.password};var addSql = 'SELECT * FROM ArthurSlogAccount WHERE AccountName=?';var addSqlParams = [response.name];var datas = await new Promise((resolve, reject) => {connection.query(addSql, addSqlParams, function (err, result) {if (err) {reject(err);console.log('[SELECT ERROR] - ', err.message);return;}if (result[0].Password == response.password) {resolve(result[0]);console.log('Welcome~ SingIn Successul ^_^' + '\\' + 'Level: ' + result[0].Level + ' Houses: ' + result[0].Houses);}if (result[0].Password != response.password) {reject('SingIn Fault ^_^!');console.log('SingIn Fault ^_^!');}});});if(datas){ctx.redirect('account.html');}connection.end();  
});//
router.get('/signup', async (ctx) => {var mysql = require('mysql');var connection = mysql.createConnection({host: 'localhost',user: 'root',password: '88888888',database: 'my_db'});connection.connect(function (err) {if (err) {console.error('error connecting: ' + err.stack);return;}console.log('connected as id ' + connection.threadId);});var response = {"name": ctx.query.name,"password": ctx.query.password,"firstname": ctx.query.firstname,"lastname": ctx.query.lastname,"birthday": ctx.query.birthday,"sex": ctx.query.sex,"age": ctx.query.age,"wechart": ctx.query.wechart,"qq": ctx.query.qq,"email": ctx.query.email,"contury": ctx.query.contury,"address": ctx.query.address,"phone": ctx.query.phone,"websize": ctx.query.websize,"github": ctx.query.github,"bio": ctx.query.bio};var  addSql = 'INSERT INTO ArthurSlogAccount(AccountName, Password, Firstname, Lastname, Birthday, Sex, Age, Wechart, Qq, Email, Contury, Address, Phone, Websize, Github, Bio) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';var  addSqlParams = [response.name, response.password, response.firstname, response.lastname, response.birthday, response.sex, response.age, response.wechart, response.qq, response.email, response.contury, response.address, response.phone, response.websize, response.github, response.bio];ctx.body = await new Promise((resolve, reject) => {connection.query(addSql,addSqlParams,function (err, result) {if(err){reject(err);console.log('[INSERT ERROR] - ',err.message);return;}resolve('Singup Successful!');});});connection.end();
});app.use(router.routes());app.listen(3000);console.log('listening on port 3000');
  • 调整部分

index.js

// $ GET /package.json
app.use(serve('../client'));
  • 切换至 server 路径下,启动静态web服务器
node index.js
  • 打开浏览器,输入 127.0.0.1:3000,测试一下网站各个功能是否正常

开始编码

  • 至此,我们重新对文件结构进行调整。

欢迎关注我的微信公众号 ArthurSlog

ArthurSlog

如果你喜欢我的文章 欢迎点赞 留言

谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_746871.aspx

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

相关文章

20个神奇的伪Flash网站

为什么80%的码农都做不了架构师?>>> 不要以为下面的这些网站是使用Flash做的,它们实际上是使用老式的HTML和CSS构建,也会有少许的JavaScript,同样也能达到出乎意料的动画效果。 1. Emilie Crssrd 该网站做了很多设计…

大型网站的HTTPS实践一:HTTPS协议和原理三

4.1.2 对称内容加密非对称密钥交换过程结束之后就得出了本次会话需要使用的对称密钥。对称加密又分为两种模式:流式加密和分组加密。流式加密现在常用的就是 RC4,不过 RC4 已经不再安全,微软也建议网站尽量不要使用 RC4 流式加密。一种新的替…

Linux中什么是动态网站环境及如何部署

2019独角兽企业重金招聘Python工程师标准>>> 当谈论起网站时,我们可能听说过静态和动态这两个词,但却不知道它们的含义,或者从字面意思了解一些却不知道它们的区别。 这一切可以追溯到网站和网络应用程序,Web应用程序是…

安全狗发布网站后门查杀引擎“啸天”变形网马无处可匿

2019独角兽企业重金招聘Python工程师标准>>> “啸天”——安全狗旗下产品网站安全狗新版本中加入的全新引擎,是安全狗研发团队历时数月精心打造的革命性产品,并已经通过西海岸赛可达实验室测试对比并认证,堪称国内最强网站后门查杀…

利用Serverless架构下函数计算实现网站文件处理的最佳实践

本文介绍如何通过函数计算实现网站文件管理的最佳实践,包括以下几个功能:•特定图片更新后,自动更新这些特定文件之前的压缩包(compress函数)•自动获取压缩包文件的md5值(get-object-md5函数)•…

[分享黑科技]纯js突破localstorage存储上线,远程抓取图片,并转码base64保存本地,最终实现整个网站所有静态资源离线到用户手机效果却不依赖浏览器的缓存机制,单页应用最新黑科技...

好久没有写博客了,想到2年前答应要放出源代码的也没放出来,最近终于有空先把纯js实现无限空间大小的本地存储的功能开源了,项目地址https://github.com/xueduany/localstore,demo见http://xueduany.github.io/localstore/&#xf…

铁道部回应购票网站登录难:将增加带宽

昨日,北京站东售票厅,市民在自动取票机上领取在网上预订的车票。 1月1日起,全国各铁路局电话订票和互联网售票的预售期变更为12天,提前于车站窗口和代售点。但连续两日来,不少旅客反映,因12306订票网站访问…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能,通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

推荐一下:500个符合web标准的网站模板

链接地址:http://bolm.cn/xhtml/从朋友的blog上看到了.他说是500Xhtml模板,符合web标准。我看了其中几个,基本都符合我认为的web标准.付截图如右。其实有的朋友感觉web标准很难。主要是现在的浏览器标准不同造成的。甚至ie6和ie7的标准都不一样。所以导致了这种误解。其实&…

如何在XAMPP中设置多个网站

xampp 是一个非常方便的本地 apache php mysql 的调试环境,在本地安装测试 WordPress 等各种博客、论坛程序非常方便。今天我们来给大家介绍一下,如何使用 XAMPP 在本地进行安装多个网站。 一般情况下,我们只需要网站程序放到 xampp/htdoc …

大型网站后端架构设计

2019独角兽企业重金招聘Python工程师标准>>> 后端架构设计涉及很多方面,并且跟网站规模有很大关系,规模越大涉及技术越多,下面介绍一下超大型网站后端架构设计,以及包含哪些核心技术。 分层是架构设计一种重要方式&…

自定义Angular插件 - 网站用户引导

最近由于项目进行了较大的改版,为了让用户能够适应这次新的改版,因此在系统中引入了“用户引导”功能,对于初次进入系统的用户一些简单的使用培训training。对于大多数网站来说,这是一个很常见的功能。所以在开发这个任务之前&…

ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化

首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化(Deser…

新站推荐3-中国版的Smarterer“一问一答”网站

过去的一年,我们曾连续报道了美国的在线技能测试平台Smarterer。用户可在60秒时间内回答一定数量的问题,从而向雇主证明自己所擅长的技能。 受它的启发,北京的HiAll团队近日推出了中国版的Smarterer“一问一答”网站,并增加了在线…

网站导航(TreeView 控件)

TreeView 是让人印象最深刻的导航控件之一,不仅因为它允许呈现富树视图,还因为它支持按需填入树的部分(不需要刷新整个页面)。但最重要的是,它支持很多样式来改变它的外观。 通过几个基本的属性,可以把 Tre…

ASP.NET MVC 学习网站

转载于:https://www.cnblogs.com/nlsoft/archive/2013/03/24/2978563.html

大流量网站性能优化:一步一步打造一个适合自己的BigRender插件(转)

BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片的延迟加载。一个庞大的页面…

运行Silverlight3 的网站弹出 IE 安全确认框

问题贴:http://social.microsoft.com/Forums/zh-CN/partnercndevsilverlight/thread/b2a133a3-05ab-4698-ba91-2db6a5e1d736 Q: 程序用Silverlight3写的!但是客户端安装了 Silverlight4, 有时候会弹出下面确认框. 如果在安装Silverlight3的客户端访问则不会出现上面…

Python的scrapy之爬取boss直聘网站

在我们的项目中,单单分析一个51job网站的工作职位可能爬取结果不太理想,所以我又爬取了boss直聘网的工作,不过boss直聘的网站一次只能展示300个职位,所以我们一次也只能爬取300个职位。 jobbossspider.py: # -*- coding: utf-8 -*…

ASP.NET网站部署问题集

这几天为了给客户演示我们的项目,发现原来程度在开发环境和部署环境中还不太一样,原本在开发环境中程度运行的好好的,而部署后装在服务器则可能产生不少的错误。因此记录下所遇到的问题,方便以后查询同时也希望能帮遇到相关问题的…