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

news/2024/4/27 8:46:59/文章来源:https://blog.csdn.net/weixin_33738555/article/details/88750970
  • 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_718705.aspx

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

相关文章

5个不可多得的黑科技网站,让你在办公中如有神助,请低调收藏

其实在职场办公当中想要提升自己的工作效率&#xff0c;就必须得使用几个工具来帮助自己&#xff0c;网上这种类型的工具网站其实有很多&#xff0c;不仅能够在里面找到你需要的素材&#xff0c;还可以帮助你处理一些文件以及图片设计什么的&#xff0c;下面就带大家看看到底是…

初中毕业也能月薪过万!5个质量极高的教程网站,免费献给你

著名的马太效应说&#xff1a;“强者愈强、弱者愈弱”。那是否意味着弱者永远无法翻身&#xff1f;答案是否定的&#xff01;在古代&#xff0c;农民确实很难翻身成地主&#xff0c;而现在是互联网时代&#xff0c;信息资源上的不平衡已经逐渐被打破&#xff0c;举个例子&#…

经常做PPT不能不知道这四个网站!解决各种常见问题!有如神助

有些小伙伴觉得做PPT很难&#xff0c;有些小伙伴却觉得简单得犹如喝水一般&#xff0c;那么&#xff0c;制作PPT到底难不难呢&#xff1f;其实这要看大家平时有没有用好工具&#xff01;有时候用对了工具&#xff0c;事半功倍&#xff0c;各种问题也就迎难而解啦&#xff01;今…

还在苦恼怎么学PS、编程?这五个自学网站免费教!年薪百万不是梦

老板很看重一个同事&#xff0c;我在他旁边显得特别黯淡&#xff01;大家都是学新闻的&#xff0c;怎么这小子连编程都会&#xff1f;有一天午休&#xff0c;我瞄到同事在看课程&#xff0c;就问了一嘴。原来同事的技能都是在网上自学的&#xff01;同事还友好的介绍给我这些网…

电脑上值得收藏的4个黑科技网站,日常办公中能帮你解决各种麻烦

日常办公当中经常会碰到各种疑难杂症&#xff0c;这时候我们不得不需要一些工具来帮助我们&#xff0c;不用担心啦&#xff01;这里为大家准备了4个黑科技网站&#xff0c;职场办公时候一定会使用的上&#xff0c;能够帮你解决各种麻烦障碍&#xff01; 1、 蛙蛙工具 职场办公…

在知乎上被100万人推荐的黑科技网站,究竟有何神奇之处?

上班摸鱼的时候&#xff0c;就喜欢逛逛知乎&#xff0c;不仅从热榜上吃了很多新鲜的瓜&#xff0c;还发现了很多厉害的网站&#xff0c;现在就分享给大家&#xff1a; vvv文档在线导出 网上的文档看起来爽&#xff0c;但很多都要收费才能下载&#xff0c;有点烦&#xff01;v…

高质量网站哪里找?4个PPT自学网站告别高额培训费,看完受益一生

PPT是职场人士必备的技能之一&#xff0c;可是很多人总是做不好PPT&#xff0c;或者做出来的PPT不满意等等~那么必要的学习是应该的&#xff0c;怎么才能更好地学习呢&#xff1f;今天分享4个在线网站&#xff0c;助你学习PPT之路顺顺利利&#xff01;请低调收藏&#xff01; 1…

5款不为人知的自学网站,每一款都能改变你的一生,建议收藏一份

从小就一直听说过这样一句话&#xff0c;活到老&#xff0c;学到老&#xff0c;学习知识不分年龄&#xff0c;只要你想学随时都可以进行学习&#xff0c;并且多学点知识在肚子里&#xff0c;以后一定能够改变你的一生&#xff0c;所以这里小编为大家整理了几款自学网站&#xf…

早点知道这5个网站,就不再害怕失业了,高薪工作主动送上门给你

现代人都很焦虑&#xff0c;每一天都叫嚷着要辞职&#xff0c;放飞自我&#xff0c;结果隔天一大早&#xff0c;还是乖乖起床上班...说到底还是口袋里的钱不够&#xff0c;不足以追逐梦想。 是啊&#xff0c;资源本来就是有限的&#xff0c;高薪工作就那么些&#xff0c;大多数…

有用又有趣的5个宝藏网站,个个闻所未闻!惊喜满满

做自媒体两年有余&#xff0c;期间也收藏了不老少的工具资源网站~ 其中一些不但有用而且有趣&#xff0c;不多bb&#xff0c;特此安利&#xff01;随手转发&#xff0c;造福大众&#xff01; 1 * 古代地球 这个网站真的超好玩&#xff0c;7.5亿年前的地球母亲是什么样的&#…

5个能让你15T硬盘立马爆满的黑科技网站,让你在工作中技高一筹

职场当中你还在默默无闻了工作嘛&#xff1f;那你就很难有升职加薪的机会了&#xff0c;一般老板喜欢能办事情的员工&#xff0c;如果老板交代下去的一件事情&#xff0c;别人花1小时&#xff0c;或许你就只用了10分钟搞定了&#xff0c;这时老板就你就另眼想看了&#xff0c;那…

别再交钱培训了!6个免费教学网站,每天看10分钟你也能月薪三万

相信看这篇文章的每一位朋友&#xff0c;都有过努力学习、提升自我的想法&#xff0c;可是学习是一件非常反人性的事情&#xff0c;大多数人都是晚上想想千条路&#xff0c;早上醒来走原路。 那么&#xff0c;在体验了二三十种学习方式之后&#xff0c;我终于筛选出了6个免费、…

5个能让你变厉害的学习网站!每天坚持30分钟,月入3万不是问题

每个人都想越变越厉害&#xff0c;那么怎么才能越变越厉害呢&#xff1f; 想要变得越来越厉害&#xff0c;就要学习了。说起学习&#xff0c;就不得不说一些好用的学习网站了。今天小编也给大家整理了5个非常不错学习网站&#xff0c;相信大家每天只要坚持下去&#xff0c;月入…

5个强大到没朋友的自学网站,帮你轻松月入过万,完成人生蜕变

现在有很多小伙伴平时实在是很忙&#xff0c;有的时候想要抽出一些时间来学习都做不到&#xff0c;看着别人因为各种技能而升职加薪&#xff0c;自己也是有点羡慕了。 别担心&#xff0c;今天小编将分享几个质量超高的自学网站给大家&#xff0c;让大家在家也能好好学习&#x…

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!

生活中我们无时不刻不都要在网站搜索资源&#xff0c;但就是缺少一个趁手的资源搜索网站&#xff0c;如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间&#xff01;今天小编在这里为大家分享5款超厉害的资源搜索网站&#xff0c;每一款都可以让你的资源丰富精彩&…

4款神奇的黑科技网站,超级炫酷!各个都各显神通!

今天小编向大家推荐的这4款网站各个都是黑科技哦&#xff0c;千万不要错过了&#xff01; I Rememberhttp://i-remember.fr/en 4款神奇的黑科技网站&#xff0c;超级炫酷&#xff01;各个都各显神通&#xff01;这款网站设计的真的很美&#xff0c;该网站是通过互联网向人们分享…

日常找资源不可多得的6款黑科技网站!

image 一&#xff0e;小森林导航http://hao.xsldh.com/ 这是一款无广告全面应有高达600个实用网站的一个网页&#xff0c;在这里拥有200个引擎搜索&#xff0c;各种影视、音乐、小说、教程、学习素材&#xff0c;全部都可以找的少&#xff0c;直接的进行搜索即可&#xff0c;操…

2018年值得推荐的20个Bootstrap网站模板

为什么80%的码农都做不了架构师&#xff1f;>>> Bootstrap是目前最受欢迎也是最简洁的建站方式之一&#xff0c;尤其是伴随移动端的发展&#xff0c;响应式设计已经毫无疑问成为了网页设计的趋势&#xff0c;网站建设要求兼容手机端已经是一种刚需&#xff0c;也成…

优秀博客和网站收录

前言平时浏览器收藏总会丢失&#xff0c;索性在这里收录我觉得优秀的博文和网站。 编程相关Qt学习之路:https://www.devbean.net/category/qt-study-road-2/数据库相关关系型数据库是如何工作的:https://www.devbean.net/category/数据库/手册相关唯品会Java开发手册:https://v…

不同时间阶段的seo优化技术侧重点

2019独角兽企业重金招聘Python工程师标准>>> 不同的时间段&#xff0c;不同网站的seo优化技术侧重点不同&#xff0c;有一些区别。典型的是新站&#xff0c;需要导入有质量的外链&#xff0c;老站&#xff0c;更多的注重点在于内链建设和结构建设。网站的seo优化过程…