Ajax — 大事件项目(第三天)
大事件-03
用户信息
表单验证
html中,直接使用layui提供的内置验证规则 email
<input type="text" name="email" required lay-verify="required|email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
重置表单
// ------------------ 重置表单 --------------------
// 重置的时候,并不是清空输入框的值,而是恢复默认的样子
$('button[type="reset"]').on('click', function (e) {e.preventDefault();renderForm(); // 调用函数,从新发送ajax请求,获取用户信息,从新为表单赋值
});
关于base64格式的图片说明
- base64格式只是图片的一种格式,用字符串表示图片的格式
- base64格式的优点:减少http请求,加快小图片的响应速度
- base64格式的缺点:体积比正常图片大 30% 左右。
https://www.css-js.com/tools/base64.html
优化JS
新建 /assets/js/common.js。代码如下:
$(function () {// 修改和配置ajax选项$.ajaxPrefilter(function (options) {console.log(options);// 修改url// options.url ==== /my/userinfooptions.url = 'http://www.liulongbin.top:3007' + options.url;// 以 /my 开头的url需要设置headers// if (options.url.indexOf('/my') > -1) {if (options.url.includes('/my')) {options.headers = {Authorization: localStorage.getItem('token')}}/*** options = {* type: 'xxx',* url: xxxxx* .....* }*/});
})
其他HTML页面,引入common.js文件
- 注意引入的位置(在jQuery之后,在自己的js之前)
修改原来的JS。
- 去掉 http://www.liulongbin.top:3007 (查找替换比较快、一个一个改也行)
- 去掉headers
没有登录不能访问有权限的接口
在common.js 开头的位置,加入一个判断
如果没有token,并且地址栏的url也不是login.html 。说明没有登录,还想看其他页面,不允许,直接跳转到登录页面。
// common.js
// 判断。如果没有token,直接退出到 /login.html
// 不要放到入口函数里面,需要代码执行到common.js,马上就执行代码
// 请求的路径不是login.html 并且 还没有token,那么就跳转到 /login.html
if (!localStorage.getItem('token') && !location.href.includes('/login.html')) {location.href = '/login.html';
}
测试的时候,注意看一下token有没有。
上述判断,对于大多数用户,没有问题。
如果,一个懂得编程的人,手动加了一个假token,则上述判断就会失效。解决办法是,ajax请求之后,根据接口返回的结果,再次判断用户是否是真的登录了,如果没有登录,则跳转到登录页面。
// $.ajaxPrefilter() 函数内部
// 配置complete函数。ajax请求完成(不管成功还是失败)都会触发的一个函数
options.complete = function (xhr) {// xhr.responseJSON 表示服务器返回的结果// console.log(xhr);if (xhr.responseJSON.status === 1 && xhr.responseJSON.message === '身份认证失败!') {// 满足条件,说明用户没有登录,而且还访问了需要验证的接口// 清除假tokenlocalStorage.removeItem('token');// 跳转到登录页面location.href = '/login.html';}
}
更新密码
准备工作
- 创建所需的HTML、css、js文件
- 首页侧边栏和头部区域挂好链接
- 加载好所需的css和js文件
页面布局
html,去复制 userinfo.html
css,去复制 userinfo.css
HTML自行修改
- type类型
- 去掉readonly
表单验证
let form = layui.form;
// --------------- 表单验证 -----------------
form.verify({// key: value// 验证规则: []// 验证规则: function// 验证长度 6~12位len: [/^\S{6,12}$/, '长度必须6到12位,不能有空格'], // {6,12}不能出现空格// 验证新密码不能和原密码相同diff: function (value) {// value 表示新密码// 获取原密码let oldPwd = $('.oldPwd').val();if (value === oldPwd) {return '新密码不能和原密码相同';}},// 验证两次新密码必须相同same: function (value) {// value 表示确认密码// 获取新密码let newPwd = $('.newPwd').val();if (newPwd !== value) {return '两次密码不一致';}}
});
- 三个密码框,都使用len这个验证规则
- 新密码,使用diff,这个验证规则
- 确认密码,使用 same 验证规则
自行给原密码(oldPwd)和新密码(newPwd)加一个 类
ajax请求,完成更新
// -------------- ajax请求,完成更新 ---------
$('form').on('submit', function (e) {e.preventDefault();// 获取表单中的数据,ajax提交$.ajax({type: 'POST',url: '/my/updatepwd',data: $(this).serialize(), // 一定要检查表单各项的name属性;用layui的表单取值也可以success: function (res) {// console.log(res);layer.msg(res.message);if (res.status === 0) {// 重置输入框$('button[type="reset"]').click();} }});
})
更换头像
准备工作
创建 /user/avatar.html 、创建 /assets/css/user/avatar.css 创建/assets/js/user/avatar.js
侧边栏和头部区域挂好超链接
html中引入所需的css和js文件
<!-- 加载layui.css -->
<link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
<!-- 加载cropper.css -->
<link rel="stylesheet" href="/assets/lib/cropper/cropper.css">
<!-- 加载自己的css -->
<link rel="stylesheet" href="/assets/css/user/avatar.css">
<!-- 加载jQuery -->
<script src="/assets/lib/jquery.js"></script>
<!-- 按顺序 加载Cropper.js -->
<script src="/assets/lib/cropper/Cropper.js"></script>
<!-- 按顺序 jquery-cropper.js -->
<script src="/assets/lib/cropper/jquery-cropper.js"></script>
<!-- 加载layui.all.js -->
<script src="/assets/lib/layui/layui.all.js"></script>
<!-- 加载common -->
<script src="/assets/js/common.js"></script>
<!-- 加载repwd -->
<script src="/assets/js/user/avatar.js"></script>
复制HTML和CSS(完成布局)
完成后的效果:
点击按钮,可选择图片
- html中加入一个隐藏的文件域
- 点击上传按钮的时候,触发文件域的单击事件
<!-- 加一个隐藏的文件域 -->
<input type="file" id="file" style="display: none;" accept="image/*">
<button type="button" class="layui-btn" id="chooseImage">上传</button>
// ------------- 点击 上传 ,可以选择图片 ------------
$('#chooseImage').click(function () {$('#file').click();
});
创建剪裁区
- 使用插件 cropper ,提供的方法,实现剪裁区的创建
- 具体做法:
- 找到剪裁区的图片 (img#image)
- 设置配置项
- 调用cropper方法,创建剪裁区
// --------------- 创建剪裁区 ------------------
// - 找到剪裁区的图片 (img#image)
let image = $('#image');
// - 设置配置项
let option = {// 纵横比(宽高比)aspectRatio: 1, // 正方形// 指定预览区域preview: '.img-preview' // 指定预览区的类名(选择器)
};
// - 调用cropper方法,创建剪裁区
image.cropper(option);
更换图片,重置剪裁区
- 找到选择的文件(文件对象)
- 为文件对象创建一个临时的url
- 更换剪裁区的图片
- 先销毁原来的剪裁区
- 更改图片的src属性
- 重新生成剪裁区
// -------------- 更换剪裁区的图片 ---------------
// 当文件域的内容改变的时候,更换图片
$('#file').change(function () {// console.log(111);// 1. 找到选择的图片(文件对象)// console.dir(this);let fileObj = this.files[0]; // 我们选择的图片的文件对象// 2. 根据文件对象,生成一个临时的url,用于访问被选择的图片let url = URL.createObjectURL(fileObj);// console.log(url);// 3. 更换剪裁区的图片的src属性// - 销毁原理的剪裁区// - 更换图片// - 重新创建剪裁区image.cropper('destroy').attr('src', url).cropper(option);
});
点击保存,实现剪裁并修改头像
- 调用 cropper 方法,传递
getCroppedCanvas
参数,得到一个canvas图片(对象) - 调用canvas的toDataURL()方法,得到base64格式的图片
- ajax提交即可
// --------------- 点击 确定 的时候,剪裁图片,转成base64格式,提交字符串到接口 ----------
$('#sure').click(function () {// 剪裁得到一张图片(canvas图片)let i = image.cropper('getCroppedCanvas', { // 创建一个 Canvas 画布width: 100,height: 100});// 把图片转成base64格式let str = i.toDataURL(); // 把canvas图片转成base64格式// console.log(str); // base64格式的字符串// ajax提交字符串给接口$.ajax({type: 'POST',url: '/my/update/avatar',data: {avatar: str},success: function (res) {layer.msg(res.message);if (res.status === 0) {// 更换成功,调用父页面的 getUserInfo() ,重新渲染头像window.parent.getUserInfo();}}});
});
合并user分支,创建article分支
# 提交当前 user 分支所有的代码
# 切换到master
git checkout master# 合并 user 到 master
git merge user# 创建并切换到article 分支
git checkout -b article
类别列表
准备工作
- 创建文件
- /article/category.html
- /assets/css/article/category.css
- /assets/js/article/category.js
- 侧边栏挂超链接
- 加载所需的css和js
页面布局
<body><div class="layui-card"><div class="layui-card-header">文章管理<button type="button" class="layui-btn layui-btn-normal layui-btn-sm">添加类别</button></div><div class="layui-card-body"><!-- 内容区 --><table class="layui-table"><colgroup><col width="35%"><col width="35%"><col></colgroup><thead><tr><th>类别名称</th><th>类别别名</th><th>操作</th></tr> </thead><tbody><!-- 模板引擎遍历出来的内容 --></tbody></table></div></div><script type="text/html" id="list">{{each data val}}<tr><td>{{val.name}}</td><td>{{val.alias}}</td><td><button type="button" class="layui-btn layui-btn-xs">编辑</button><button type="button" class="layui-btn layui-btn layui-btn-danger layui-btn-xs">删除</button></td></tr>{{/each}}</script>
</body>
模板引擎渲染页面
$(function(){//------------------------ajax请求列表-----------------------renderHtml();function renderHtml(){$.ajax({url: '/my/article/cates',success:function(res){// console.log(res);// if(res.status === 0){let str = template('list',res);// console.log(str);//把最终的结果放在tbody中去$('tbody').html(str);// }},});}
})
Ajax — 大事件项目(第三天)相关推荐
- Ajax — 大事件项目(第二天)
大事件-02 fix一个bug 原因: 开始做注册的时候,页面中只有一个 name=password的input,所以 $('input[name="password"]') 可以 ...
- Ajax — 大事件项目(第四天)
分类管理 添加分类 初步使用弹出层 给 "添加分类" 绑定一个单击事件 单击事件中,使用 layer.open() 实现一个弹出层 type: 1, 弹层的类型是页面层 title ...
- Ajax — 大事件项目(第一天)
应用的前端技术 Ajax (重要) - jQuery方式接口请求 Layui 框架使用 HTML + CSS + JS 项目说明和演示 线上 DEMO 项目地址:http://www.liulongb ...
- 45 大事件项目 => [01] 后台管理项目ajax练习
目标 利用Git管理大事件项目代码 安装并且使用 Live Server插件 学会查阅layui文档 绘制出登录注册页面结构 添加表单元素自定义验证规则 查阅接口文档完成登录注册功能 知道iframe ...
- 黑马-大事件项目(总结+BUG修复)
前言 最近把Nodejs和Ajax学习了一下,找到一个很不错的练手项目:黑马刘龙彬老师主讲的大事件项目,整体看完,给刘老师点个赞,讲的非常细致,开发流程清晰,涉及的知识点也很精准.另外黑马还为这个项目 ...
- Node — 第七天 (大事件项目接口实现一)
关于JS错误处理 node中和mysql中的错误处理 node和MySQL提供的方法,已经对错误信息进行了封装,只需要使用 err.message 即可获取到错误信息. 比如: const fs = ...
- 大数据项目(三)————电商项目介绍(一)
1.项目介绍 本项目主要用于互联网电商企业中,使用Spark技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中 ...
- Node — 第九天 (大事件项目接口实现三)
文章管理接口 设计数据表 添加文章接口 编写接口,使用postman模拟提交formdata类型的数据 在article.js 中,加入 /add 路由 postman模拟提交formdata类型的数 ...
- Node — 第八天 (大事件项目接口实现二)
如何处理MySQL的错误 MySQL的错误信息,可以通过err来获取.这是没有问题的. 但是,我们加入了Promise,Promise中的错误,在外部是获取不到的,只能使用Promise相关方法来获取 ...
最新文章
- python编程题-分享13个python编程笔试题
- 应用新的JDK 11字符串方法
- hdf5文件和csv的区别_使用HDF5文件并创建CSV文件
- 5G NR协议栈----总体架构
- arduino esp8266_Arduino-httpupdate-OTA-esp8266升级探险记
- Handler、AsyncTask、HandlerThread和IntentService之间的对比
- 在Win7旗舰版安装并运行LoadRunner11
- linux下安装tuxedo
- 国内博客搬家工具大全
- Lottie 动画AE+Bodymovin导出的JSON文件解读
- 关于layuiAdmin 后台管理模板购买授权的问题
- 数字化审图时代批量生成PDF或者DWF利器SmartBatchPlot
- 监控软件Zabbix安装使用
- java 传入一个日期, 计算公历节日和农历节假日的常用类(包括除夕、清明节、母亲节、父亲节的算法)
- 运维干到35岁,还能干多久?
- Python-IO编程和异常
- 华为模拟器ensp ACL技术
- 2020年java缺人_Java回顾#5 –到2020年,什么将改变Java世界?
- “你没有权限查看该对象的安全属性,即使你是管理用户“
- BindingException: Mapper method ‘com.itheima.dao.BookDao.update‘ has an un unsupported return
热门文章
- ROS 中的camera支持
- 全志A33-修改linux kernel启动参数
- 60岁有30万资金,如何存款最安全?
- 蚂蚁借呗和京东金条全面对比,哪个更划算?
- MFC界面编程新思路--模仿MATLAB式的界面
- android+busybox+编译,Android版busybox编译
- mysql delete语句_MySQL ------ 触发器(TRIGGER)(二十七)
- react登录页面_React 实现路由拦截
- 乐高收割机器人_乐高圣诞45002作品来啦!——驯鹿拉雪橇、圣诞树、圣诞棒棒糖...
- mysql left join 查询_MySQL联表查询基本操作之left-join常见的坑