需求:
用户在前端输入用户名,输入框失去焦点后,将所输入的用户名发送给后端判断用户名是否已经在数据库中存在。
(1) 接口设计
请求方法:GET
请求地址:/usernames/(?P<username>[a-zA-Z0-9_-]{5,20})/count/
(2) 后端逻辑(Django框架)
class UsernameCountView(View):
"""判断用户名是否重复注册"""
def get(self, request, username):
"""
:param request:
:param username: 用户名
:return: JSON
"""
# 实现主体业务逻辑:使用username查询对应的记录的条数
# filter方法返回的是满足条件的结果集
count = User.objects.filter(username=username).count()
# 响应结果
return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'count': count})
count = User.objects.filter(username=username).count()这句代码将数据库查询用户名对应记录条数记录下来。
(3) 前端逻辑(Vue.js)
let url = '/usernames/' + this.username + '/count';
axios.get(url, {
responseType: 'json'
})
.then(response => {
if(response.data.count == 1){
// 用户名已存在
this.error_name_message = '用户名已存在';
this.error_name = true;
} else {
// 用户名不存在
this.error_name = false;
}
})
.catch(error => {
console.log(error.response);
})
HTML
<li>
<!-- 接收数据 v-model -->
<!-- 鼠标失去焦点事件@blur -->
<!-- 展示错误:v-show -->
<label>用户名:</label>
<input type="text" v-model="username" @blur="check_username" name="username" id="user_name">
<span class="error_tip" v-show="error_name">[[ error_name_message ]]</span>
</li>
(4) 流程分析
首先分析前端逻辑
打开开发者工具选择sources,在let url = '/usernames/' + this.username + '/count';和if(response.data.count == 1)打断点:
当用户在前端输入好用户名,并且触发输入框失去焦点的事件后:
点击Step over next funcation call按钮:
发现url拼接完毕:
然后放通前端请求。
(5) 后端收到请求,开始分析后端流程
当单步走完断点后,发现count为1,也就是数据库查询该用户名对应记录条数为1条。
接着放通后端,后端将返回Json数据格式的响应。
(6) 再次回到前端调试页面会发现,response已经接收到。
在console页面输入response可看到由Django封装的完整响应信息
(7) 再次放通前端,发现HTML对应span标签出现错误提示信息。
版权声明:本文为Ezra1991原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。