Slog44_支配vue框架初阶项目之博客网站-单页-客户端与服务端上传功能关联

news/2024/4/28 23:33:01/文章来源:https://blog.csdn.net/weixin_34274029/article/details/88418693
  • ArthurSlog
  • SLog-44
  • Year·1
  • Guangzhou·China
  • Aug 22th 2018

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

人们会渐渐爱上压迫 崇拜那些使他们丧失思考能力的工业产物


开发环境MacOS(High Sierra 10.13.5)

需要的信息和信息源:

  • HTTP概述
  • HTTP
  • 互联网是如何工作的
  • 万维网是如何工作的
  • 统一资源定位符(URL)
  • 什么是超链接
  • 创建超链接
  • AJAX是异步的JavaScript和XML(Asynchronous JavaScript And XML)
  • XMLHttpRequest
  • Using files from web applications

开始编码

  • 本篇实现 图片的上传 和 头像的修改
  • 上一篇,我们完成了下面的第一步,现在我们来完成第二步
  1. 点击选择按钮,弹出本地文件浏览框之后,选择我们要的图片,然后点击确认,锁定我们要的图片
  2. 点击上传图片,将我们锁定好的图片上传至服务器,显示上传的结果,客户端要做的事情了就到这里为止了
  • 参考 vue.js 框架的模版语法 v-on
  • 我们编写出一个按钮,当点击按钮的时候,把我们选择好的图片上传到服务端去:

client/app.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><link rel="stylesheet" type="text/css" href="./css/style.css"><!-- 开发环境版本,包含了有帮助的命令行警告 --><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><title>signin_ArthurSlog</title>
</head><body><div id="signup-container"><template class="container" v-if="pagestate === '0'"><div>This is index's page by ArthurSlog</div><br><button v-on:click="signin_index">Signin</button><br><button v-on:click="signup_index">Signup</button></template><template id="Signin" v-else-if="pagestate === '1'"><div>This is signin's page by ArthurSlog</div><p>Singin</p><form id="form1" v-on:submit.prevent="signin"><br><div>Account: {{ name_signin }}<br><input type="text" v-model="name_signin" placeholder="username"></div><br><br><div>Password: {{ password_signin }}<br><input type="text" v-model="password_signin" placeholder="password"></div><br><input type="submit" value="登陆"></form><br><button v-on:click="return_index">ReturnIndex</button></template><template id="Signup" v-else-if="pagestate === '2'"><div>This is signup's page by ArthurSlog</div><p>Singup</p><form id="form2" v-on:submit.prevent="addUser"><br><div>Account: {{ name }}<br><input type="text" v-model="name" placeholder="username"></div><br><br><div>Password: {{ password }}<br><input type="text" v-model="password" placeholder="password"></div><br><br><div>Again Password: {{ repassword }}<br><input type="text" v-model="repassword" placeholder="repassword"></div><br><br><div>First Name: {{ firstname }}<br><input type="text" v-model="firstname" placeholder="firstname"></div><br><br><div>Last Name: {{ lastname }}<br><input type="text" v-model="lastname" placeholder="lastname"></div><br><br><div>Birthday: {{ birthday }}<br><input type="text" v-model="birthday" placeholder="2000/08/08"></div><br><br><div><span>Sex: {{ currentSex }}</span><br><input type="radio" id="sex" value="male" v-model="currentSex"><label for="sex">male</label><br><input type="radio" id="sex" value="female" v-model="currentSex"><label for="sex">female</label></div><br><br><div><span>Age: {{ currentAge }}</span><br><select v-model="currentAge" id="age"><option disabled value="">Select</option><option v-for="age in ages">{{ age }}</option></select></div><br><br><div>Wechart: {{ wechart }}<br><input type="text" v-model="wechart" placeholder="wechart's name"></div><br><br><div>QQ: {{ qq }}<br><input type="text" v-model="qq" placeholder="12345678"></div><br><br><div>Email: {{ email }}<br><input type="text" v-model="email" placeholder="12345678@qq.com"></div><br><br><div>Contury: {{ contury }}<br><input type="text" v-model="contury" placeholder="China"></div><br><br><div>Address: {{ address }}<br><input type="text" v-model="address" placeholder="Guangzhou"></div><br><br><div>Phone: {{ phone }}<br><input type="text" v-model="phone" placeholder="138********"></div><br><br><div>Websize: {{ websize }}<br><input type="text" v-model="websize" placeholder="xxx.com"></div><br><br><div>Github: {{ github }}<br><input type="text" v-model="github" placeholder="Github's URl"></div><br><br><div>Bio: {{ bio }}<br><input type="text" v-model="bio" placeholder="This is the world~"></div><br><br><input type="submit" value="完成注册"></form><button v-on:click="addUser">addUser</button><br><button v-on:click="return_index">ReturnIndex</button><br></template><template id="returnResult" v-else-if="pagestate === '3'"><div><img id="ArthurSlog_icon" src="/image/ArthurSlog.png" alt="ArthurSlog_icon" /></div><div><div>Uploading {{ image }} files...</div><br><input type="file" v-on:change="filesChange"><br><button v-on:click="uploadfiles">uploadfiles</button></div><div id="signinResult"><div v-for="(value, key) in commits">{{ key }}: {{ value }}</div></div></template></div><script src="./js/signup.js"></script>
</body></html>
  • 更新的部分如下:
<br>
<button v-on:click="uploadfiles">uploadfiles</button>
  • 我们让 click事件 关联 uploadfiles函数,也就是说,当点击按钮的时候,会触发 js文件里的 uploadfiles函数

client/js/signup.js

var host = 'http://127.0.0.1:3000/';var signup_container = new Vue({el: '#signup-container',data: {name_signin: '',password_signin: '',name: '',password: '',repassword: '',firstname: '',lastname: '',birthday: '',sexs: ['male', 'female'],currentSex: 'male',ages: ['1', '2', '3', '4', '5', '6', '7', '8','9', '10', '11', '12', '13', '14', '15', '16', '17', '18'],currentAge: '18',wechart: '',qq: '',email: '',contury: '',address: '',phone: '',websize: '',github: '',bio: '',commits: null,pagestate: '0',image: ''},methods: {uploadfiles: function () {var xhr = new XMLHttpRequest()var fd = new FormData();var self = thisxhr.open('POST', host + 'uploadfiles', true)xhr.onload = function () {//self.commits = xhr.responseTextself.commits = xhr.responseText}fd.append('myFile', this.image);xhr.send(fd)},filesChange: function (event) {this.image = event.target.files[0]},return_index: function () {this.pagestate = '0'},signin_index: function () {this.pagestate = '1'},signup_index: function () {this.pagestate = '2'},signin: function () {//当点击登陆的时候,在页面上渲染从服务端返回的数据,把其他的部分隐藏掉this.pagestate = '3'var xhr = new XMLHttpRequest()var self = thisxhr.open('GET', host + 'signin?' + 'name=' + self.name_signin + '&password=' + self.password_signin, true)xhr.onload = function () {//self.commits = xhr.responseTextvar myObj = JSON.parse(xhr.responseText);self.commits = myObj}xhr.send()},addUser: function () {//当点击注册的时候,在页面上渲染从服务端返回的数据,把其他的部分隐藏掉this.pagestate = '3'var xhr = new XMLHttpRequest()/*xhr.open('GET', host + 'name=' + this.name + '&password=' + this.password + '&firstname=' + this.firstname + '&lastname=' + this.lastname + '&birthday=' + this.birthday+ '&sex=' + this.currentSex + '&age=' + this.currentAge + '&wechart=' + this.wechart+ '&qq=' + this.qq + '&email=' + this.email + '&contury=' + this.contury+ '&address=' + this.address + '&phone=' + this.phone + '&websize=' + this.websize+ '&github=' + this.github + '&bio=' + this.bio, true)xhr.send()*/var self = thisxhr.open('GET', host + 'signup?' + 'name=' + self.name + '&password=' + self.password + '&firstname=' +self.firstname + '&lastname=' + self.lastname + '&birthday=' + self.birthday+ '&sex=' + self.currentSex + '&age=' + self.currentAge + '&wechart=' + self.wechart+ '&qq=' + self.qq + '&email=' + self.email + '&contury=' + self.contury+ '&address=' + self.address + '&phone=' + self.phone + '&websize=' + self.websize+ '&github=' + self.github + '&bio=' + self.bio, true)xhr.onload = function () {self.commits = xhr.responseText}xhr.send()}}
})
  • 更新的部分如下:
uploadfiles: function () {var xhr = new XMLHttpRequest()var fd = new FormData();var self = thisxhr.open('POST', host + 'uploadfiles', true)xhr.onload = function () {//self.commits = xhr.responseTextself.commits = xhr.responseText}fd.append('myFile', this.image);xhr.send(fd)
}
  • ok,现在把客户端的部分解决了,接下来就是 服务端部分 去接收和处理了,我们更新一下 服务端 的代码,让服务端和我们上面写的函数关联起来:

server/index.js

const serve = require('koa-static');
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();
const fs = require("fs");
const koaBody = require('koa-body');// $ 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.body = datas;}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();
});router.post('/uploadfiles', async (ctx) => {console.log('客户端与服务端的 uploadfiles函数 已关联');});app.use(router.routes());app.listen(3000);console.log('listening on port 3000');
  • 现在,打开浏览器,输入 127.0.0.1:3000/app.html,点击 signin 按钮
  • 输入账号:ArthurSlog 密码:ArthurSlog,点击登陆
  • 成功登陆之后,点击 “选择文件” 按钮,选择一张你电脑里的图片,然后点击“打开”
  • 再点击 uploadfiles 按钮,观察 服务端终端,如果终端正常打印出字符串 “客户端与服务端的 uploadfiles函数 已关联”,说明客户端与服务端的 uploadfiles功能 已关联了起来
  • 至此,我们完成了 客户端与服务端之间 uploadfiles功能 的关联。

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

ArthurSlog

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

谢谢

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

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

相关文章

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

此篇已收录至《大型网站技术架构》读书笔记系列目录贴&#xff0c;点击访问该目录可获取更多内容。 首先&#xff0c;所谓网站的伸缩性&#xff0c;指不需要改变网站的软硬件设计&#xff0c;仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力。在整个互联网行…

(SpringMvc,BootStrap,Mysql)酒店旅游网站

【项目功能】 根据需求&#xff0c;确定系统采用JSP技术&#xff0c; SQL Server 2008作为数据库。整个系统要操作方便、易于维护、灵活实用。主要实现了个人中心、首页轮播管理、景区/线路管理、客户管理、酒店门票分类管理、酒店门票管理、帖子管理、帖子回复管理、售后维权…

我是计算机专业,技能一般,女生,大四,准备毕业设计,我想问是不是网站设计简单一些呢?

做网站吧。前端都是使用的htmljscss的方式做的&#xff0c;主要的区别来自于后台。后台可以选择语言比较多&#xff0c;java、python、php、asp其中php是最简单的。Php的环境搭建也简单&#xff0c;文件比较少。用php还不和java一样&#xff0c;java需要导包配置jdk等等&#x…

【计算机毕业设计】基于ssm家校通网站系统

源码交流、毕设帮助、技术指导&#xff0c;见文末。 随着网络技术的飞速发展&#xff0c;网络已渗透到全人类的各个方面&#xff0c;深刻影响着我们的生活和工作方式。家校通网站给教育带来了更广阔的发展空间。家校通网站有对部分类似网站进行分析&#xff0c;找到规律和方法…

【计算机毕业设计】基于springboot个人博客网站

所有的软件开发前都需要进行需求调研和分析&#xff0c;在个人博客系统系统中前台用户需要能够浏览已发布的博客文章&#xff0c;并能在文章底部进行评论互动&#xff0c;后台管理人员登录系统需要能够对系统功能方面的信息进行管理&#xff0c;针对个人博客系统的需求分析有以…

【计算机毕业设计】java ssm+jsp 旅游网站的设计与实现

本旅游管理系统主要包括系统用户管理模块、景点信息管理模块、变幻图管理、旅游线路管理、登录模块、和退出模块等多个模块。采用目前最流行的ssm框架结构和java中流行的ssm框架和myeclipse编辑器、MySQL数据库设计并实现的 。 本系统主要包含了等系统用户管理、景点信息管理…

【计算机毕业设计】java ssm+vue婚纱影楼摄影网站

源码交流及指导、毕设帮助 见文末 本站不同于其它摄影网站&#xff0c;本网站不但可以展示本店的摄影作品&#xff0c;更可以列出众多摄影套餐供用户选择预约&#xff0c;用户看中哪款套餐了&#xff0c;可以预约时间进行拍摄&#xff0c;即增加了店内本身的业务量&#xff0c;…

【计算机毕业设计】jsp+ssm某地区精准扶贫网站(可更改为任意地区)

本精准扶贫网站管理系统主要包括系统用户管理模块、捐赠信息管理模块、投诉信息管理、扶贫资讯管理、登录模块、和退出模块等多个模块,系统基于mvc设计模式,数据库选用的是Mysql数据库&#xff0c;采用Java语言中的SSM(springMvcspringMybatis)框架进行后端开发,JSP主要用于前端…

【计算机毕业设计】ssm+jsp二手车交易网站

毕设帮助、技术指导、源码交流&#xff0c;联系方式见文末。。 二手车交易网站采用B/S模式&#xff0c;促进了二手车交易网站的安全、质量、快捷的发展。传统的管理模式还处于手工处理阶段&#xff0c;管理效率极低&#xff0c;随着用户的不断增多&#xff0c;传统基于手工管理…

【计算机毕业设计】基于springboot的景区旅游网站

随着“互联网”加速与产业融合&#xff0c;数字经济已成为中国发展的新引擎。在旅游产业也不例外&#xff0c;相关数据显示&#xff0c;“互联网旅游”孕育一个新的庞大旅游市场。这个新型市场由网民购买力购买欲望组成。根据最新的互联网发展状况统计报告&#xff0c;截至今年…

【计算机毕业设计】基于java web的校友同学网站

校友资源是高校建设和校友个人发展的宝贵潜在财富&#xff0c;但是历届毕业生离校后&#xff0c;随着时间的推移以及生活繁忙的原因&#xff0c;他们渐渐的忽略了与校友们和母校的联系&#xff0c;基于这种现状&#xff0c;设计并实现B/S架构的校友信息系统应运而生。 校友同学…

3dsmax子菜单无法选择_向大疆无人机学习:在WordPress网站的divi主题中添加悬浮固定二级菜单...

我们WP花园为客户提供深度定制WordPress网站设计开发的过程中&#xff0c;经常会为购买了高级定制服务的客户提供一些个性化模块功能开发。最近&#xff0c;我们有一个WordPress网站建站客户&#xff0c;想要仿制大疆无人机产品详情页里面的固定菜单二级目录的样式&#xff0c;…

seo查询工具源码_SEO关键词查询工具,SEO辅助工具

上一篇给大家分享了四个好用的SEO工具&#xff0c;今天继续给大家推荐几个不错的网站。一&#xff1a;网站安全检测1&#xff1a;百度安全检测&#xff1a;这个是大家一定要熟悉的安全检测平台。已经引用腾讯、小红伞、金山、知道创宇的数据库&#xff0c;假设你的网站在搜索结…

php安装与下载,学习PHP网站开发 连载——PHPCMS的下载与安装详解

原标题&#xff1a;学习PHP网站开发 连载——PHPCMS的下载与安装详解首先是要下载&#xff0c;然后安装&#xff0c;才能在本地学习和调试1&#xff1a;下载PHPCMS官网地址&#xff1a;www.phpcms.cn接着点击&#xff1a;下载结果&#xff1a;解压缩&#xff1a;进入该目录&…

服务器banner是什么_选择网站建设公司应该注意什么?

近期有不少客户咨询我们时都问了同样的问题&#xff1a;“南京网站建设这块真的好复杂&#xff0c;什么价格都有&#xff0c;从几百到几万&#xff0c;到底应该怎么选择网站建设公司呢&#xff1f;”其实从价格角度来说&#xff0c;我们在《建设一个企业网站需要多少钱呢&#…

chm文件在服务器看不到内容,电脑不能打开文件secedit.chm怎么办_网站服务器运行维护,电脑...

win10系统搜索不到无线网络怎么办_网站服务器运行维护win10系统搜索不到无线网络的解决方法&#xff1a;1、首先按【winr】组合键打开运行窗口&#xff0c;输入service.msc&#xff0c;点击【确定】&#xff1b;2、然后开启【wired autoconfig】与【wlan autoconfig】服务即可。…

Google 联合一些社交网站来对抗 facebook

谷歌(Google) 将与其它一些行业领先的社交网站联手&#xff0c;共同对抗互联网新贵Facebook。  谷歌将于周四推出一个通用标准集 ( OpenSocial )&#xff0c;允许软件开发者为谷歌旗下社交网站Orkut&#xff0c;以及LinkedIn、hi5、Friendster、Plaxo和Ning等其它社交网站开…

域名注册便宜_有哪些便宜的域名可以注册建站?

建网站肯定不能缺少域名&#xff0c;不然别人怎么访问网站&#xff1f;总不能让用户输入一长串的网站服务器IP地址吧&#xff1f;开发网站之前需要把域名申请注册好&#xff0c;方便到时候网站快速上线&#xff0c;立马就能解析域名跟服务器绑定。也有很多人是独立建站&#xf…

CSDN 未来网站内容Tag架构猜想

大概是上周吧&#xff0c;写了一篇blog主观的分析了一下CSDN目前的内容架构&#xff0c;收到许多朋友好的意见和建议&#xff0c;在此首先对他们表示感谢。网络变化真的很快&#xff0c;现在的网站内容架构较2&#xff0c;3年前已经有翻天覆地的变化。很多人也提出了“如今的网…

织梦通过访问更新文章HTML,织梦每分钟审核一篇文章并且更新网站首页

plus下新建文件 makeid.php 内容如下&#xff1a;-----------------------------------------------------------------------------------------------------------------------$lasttimefilemtime($_SERVER[DOCUMENT_ROOT]."/index.html");$interval180; //更新时间…