用户注册功能

##  用户注册功能

[TOC]

### 一、设计接口思路

- 分析业务逻辑,明确在这个业务中需要涉及到几个相关子业务,将每个子业务当做一个接口来设计

- 分析接口的功能任务,明确接口的访问方式与返回数据:

- 接口的请求方式,如GET 、POST 、PUT等

- 接口的URL路径定义

- 需要前端传递的数据及数据格式(如路径参数、查询字符串、请求体表单、JSON等)

- 返回给前端的数据及数据格式

### 二、功能分析

- 用户名判断是否存在

- 手机号判断是否存在

- 图片验证码

- 短信验证码

- 注册保存用户数据

图片验证码、短信验证码考虑到后续可能会在其他业务中也会用到,因此将验证码功能独立出来,**创建一个新应用verifications,在此应用中实现图片验证码、短信验证码**

#### 2.后端视图实现

a.将生成图像验证码的模块文件夹(百度云盘有提供captcha文件夹)复制粘贴到项目根目录utils文件夹下

b.由于验证(图片验证、短信验证)功能,以后有可能在其他应用或项目中重用,所以单独创建一个应用来实现,所有验证相关的业务逻辑接口。在apps目录中创建一个verifications应用,并在settings.py文件中的INSTALLED_APPS列表中指定。

```python

```

```python

```

### 四、判断用户是否存在

#### 1.分析

**请求方法**:**GET**

**url定义**:`/usernames/(?P<username>\w{5,20})/`

**请求参数**:url路径参数

| 参数      | 类型   | 前端是否必须传 | 描述         |

| --------- | ------ | -------------- | ------------ |

| usernames | 字符串 | 是             | 输入的用户名 |

#### 2.后端视图实现

```python

from utils.json_fun import to_json_data

from django.views import View

class CheckUsernameView(View):

"""

Check whether the user exists

GET usernames/(?P<username>\w{5,20})/

"""

def get(self, request, username):

# count = User.objects.get(username=username).count

data = {

‘username‘: username,

‘count‘: Users.objects.filter(username=username).count()

}

return to_json_data(data=data)

```

在项目根目录中的utils目录下创建json_fun.py文件,用于处理json格式转化功能。

```python

from django.http import JsonResponse

from .res_code import Code

def to_json_data(errno=Code.OK, errmsg=‘‘, data=None, kwargs=None):

json_dict = {‘errno‘: errno, ‘errmsg‘: errmsg, ‘data‘: data}

if kwargs and isinstance(kwargs, dict) and kwargs.keys():

json_dict.update(kwargs)

return JsonResponse(json_dict)

```

在项目根目录中的utils目录下创建res_code.py文件,用于把后端执行的情况返回给前端。

```python

class Code:

OK                  = "0"

DBERR               = "4001"

NODATA              = "4002"

DATAEXIST           = "4003"

DATAERR             = "4004"

METHERR             = "4005"

SMSERROR            = "4006"

SMSFAIL             = "4007"

SESSIONERR          = "4101"

LOGINERR            = "4102"

PARAMERR            = "4103"

USERERR             = "4104"

ROLEERR             = "4105"

PWDERR              = "4106"

SERVERERR           = "4500"

UNKOWNERR           = "4501"

error_map = {

Code.OK                    : "成功",

Code.DBERR                 : "数据库查询错误",

Code.NODATA                : "无数据",

Code.DATAEXIST             : "数据已存在",

Code.DATAERR               : "数据错误",

Code.METHERR               : "方法错误",

Code.SMSERROR              : "发送短信验证码异常",

Code.SMSFAIL               : "发送短信验证码失败",

Code.SESSIONERR            : "用户未登录",

Code.LOGINERR              : "用户登录失败",

Code.PARAMERR              : "参数错误",

Code.USERERR               : "用户不存在或未激活",

Code.ROLEERR               : "用户身份错误",

Code.PWDERR                : "密码错误",

Code.SERVERERR             : "内部错误",

Code.UNKOWNERR             : "未知错误",

}

```

```python

# url 定义

from django.urls import path, re_path

from . import views

app_name = "verifications"

urlpatterns = [

# image_code_id为uuid格式

path(‘image_codes/<uuid:image_code_id>/‘, views.ImageCode.as_view(), name=‘image_code‘),

re_path(‘usernames/(?P<username>\w{5,20})/‘, views.CheckUsernameView.as_view(), name=‘check_username‘),

]

```

#### 3.前端代码实现    auth.js

```javascript

$(function () {

let $username = $(‘#user_name‘);

let $img = $(".form-item .captcha-graph-img img");

let sImageCodeId = "";

// 1、图像验证码逻辑

generateImageCode();  // 生成图像验证码图片

$img.click(generateImageCode);  // 点击图片验证码生成新的图片验证码图片

// 2、用户名验证逻辑

$username.blur(function () {

fn_check_username();

});

// 生成一个图片验证码的编号,并设置页面中图片验证码img标签的src属性

function generateImageCode() {

// 1、生成一个图片验证码随机编号

sImageCodeId = generateUUID();

// 2、拼接请求url /image_codes/<uuid:image_code_id>/

let imageCodeUrl = "/image_codes/" + sImageCodeId + "/";

// 3、修改验证码图片src地址

$img.attr(‘src‘, imageCodeUrl)

}

// 生成图片UUID验证码

function generateUUID() {

let d = new Date().getTime();

if (window.performance && typeof window.performance.now === "function") {

d += performance.now(); //use high-precision timer if available

}

let uuid = ‘xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx‘.replace(/[xy]/g, function (c) {

let r = (d + Math.random() * 16) % 16 | 0;

d = Math.floor(d / 16);

return (c == ‘x‘ ? r : (r & 0x3 | 0x8)).toString(16);

});

return uuid;

}

// 判断用户名是否已经注册

function fn_check_username() {

let sUsername = $username.val();  // 获取用户名字符串

if (sUsername === "") {

message.showError(‘用户名不能为空!‘);

return

}

if (!(/^\w{5,20}$/).test(sUsername)) {

message.showError(‘请输入5-20个字符的用户名‘);

return

}

// 发送ajax请求,去后端查询用户名是否存在

$.ajax({

url: ‘/usernames/‘ + sUsername + ‘/‘,

type: ‘GET‘,

dataType: ‘json‘,

})

.done(function (res) {

if (res.data.count !== 0) {

message.showError(res.data.username + ‘已注册,请重新输入!‘)

} else {

message.showInfo(res.data.username + ‘能正常使用!‘)

}

})

.fail(function () {

message.showError(‘服务器超时,请重试!‘);

});

}

});

```

##

### 五、判断手机号是否注册功能实现

#### 1.分析

**请求方法**:**GET**

**url定义**:`/mobiles/(?P<mobile>1[3-9]\d{9})/`

**请求参数**:url路径参数

| 参数   | 类型   | 前端是否必须传 | 描述             |

| ------ | ------ | -------------- | ---------------- |

| mobile | 字符串 | 是             | 用户输入的手机号 |

#### 2.后端代码实现

```python

# 在verifications目录下的views.py文件中定义如下类视图:

class CheckUsernameView(View):

"""

Check whether the user exists

GET usernames/(?P<username>\w{5,20})/

"""

def get(self, request, username):

data = {

‘username‘: username,

‘count‘: Users.objects.filter(username=username).count()

}

return to_json_data(data=data)

```

```python

# 在verifications目录下的urls.py文件中定义如下路由:

from django.urls import path, re_path

from . import views

app_name = "verifications"

urlpatterns = [

re_path(‘mobiles/(?P<mobile>1[3-9]\d{9})/‘, views.CheckMobileView.as_view(), name=‘check_mobiles‘),

]

```

####3.前端代码实现    auth.js

```javascript

$(function () {

let $username = $(‘#user_name‘);  // 选择id为user_name的网页元素,需要定义一个id为user_name

let $img = $(".form-item .captcha-graph-img img");  // 获取图像标签

let sImageCodeId = "";  // 定义图像验证码ID值

let $mobile = $(‘#mobile‘);  // 选择id为mobile的网页元素,需要定义一个id为mobile

// 1、图像验证码逻辑

generateImageCode();  // 生成图像验证码图片

$img.click(generateImageCode);  // 点击图片验证码生成新的图片验证码图片

// 判断用户是否注册

// 2、用户名验证逻辑

$username.blur(function () {

fn_check_usrname();

});

// 3、手机号验证逻辑

// 判断用户手机号是否注册

$mobile.blur(function () {

fn_check_mobile();

});

// 生成一个图片验证码的编号,并设置页面中图片验证码img标签的src属性

function generateImageCode() {

// 1、生成一个图片验证码随机编号

sImageCodeId = generateUUID();

// 2、拼接请求url /image_codes/uuid:image_code_id/

let imageCodeUrl = "/image_codes/" + sImageCodeId + "/";

// 3、修改验证码图片src地址

$img.attr(‘src‘, imageCodeUrl)

}

// 生成图片UUID验证码

function generateUUID() {

let d = new Date().getTime();

if (window.performance && typeof window.performance.now === "function") {

d += performance.now(); //use high-precision timer if available

}

let uuid = ‘xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx‘.replace(/[xy]/g, function (c) {

let r = (d + Math.random() * 16) % 16 | 0;

d = Math.floor(d / 16);

return (c == ‘x‘ ? r : (r & 0x3 | 0x8)).toString(16);

});

return uuid;

}

// 判断用户名是否已经注册

function fn_check_usrname() {

let sUsername = username.val();  // 获取用户名字符串

if (sUsername === "") {

message.showError(‘用户名不能为空!‘);

return

}

// test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false )

if (!(/^\w{5,20}/).test(sUsername)) {

message.showError(‘请输入5-20个字符的用户名‘);

return

}

// 发送ajax请求,去后端查询用户名是否存在

$.ajax({

url: ‘/usernames/‘ + sUsername + ‘/‘,

type: ‘GET‘,

dataType: ‘json‘,

// data:{‘code‘:300268}

})

.done(function (res) {

if (res.data.count !== 0) {

message.showError(res.data.username + ‘已注册,请重新输入!‘)

} else {

message.showInfo(res.data.username + ‘能正常使用!‘)

}

})

.fail(function () {

message.showError(‘服务器超时,请重试!‘);

});

}

function fn_check_mobile() {

let sMobile = mobile.val();  // 获取用户输入的手机号码字符串

let SreturnValue = "";

if (sMobile === "") {

message.showError(‘手机号不能为空!‘);

return

}

if (!(/^1[345789]\d{9}/).test(sMobile)) {

message.showError(‘手机号码格式不正确,请重新输入!‘);

return

}

$.ajax({

url: ‘/mobiles/‘ + sMobile + ‘/‘,

type: ‘GET‘,

dataType: ‘json‘,

async: false // 把async关掉

})

.done(function (res) {

if (res.data.count !== 0) {

message.showError(res.data.mobile + ‘已注册,请重新输入!‘)

SreturnValue = ""

} else {

SreturnValue = "success"

}

})

.fail(function () {

message.showError(‘服务器超时,请重试!‘);

SreturnValue = ""

});

return SreturnValue

}

});

```

原文地址:https://www.cnblogs.com/wdty/p/11105709.html

时间: 2024-09-29 16:21:43

用户注册功能的相关文章

.NET MVC 4 实现用户注册功能

初学MVC,踩了不少坑,所以通过实现一个用户注册功能把近段时间学习到的知识梳理一遍,方便以后改进和查阅. 问题清单: l 为什么EF自动生成的表名后自动添加了s? l 如何为数据库初始化一些数据? l 使用WebAPI如何返回JSON? l 让Action接受Get请求 l 如何使路由匹配不同的URL l 如何调试路由 l VS2013如何添加jQuery智能提示? l 为何在Session中的验证码打印出来后与上一次的相同? l 对一个或多个实体的验证失败(或db.SaveChanges不起作

2、编写单元测试用例,对用户注册功能的DAO层进行测试。(注意:测试用例应考虑成功和失败的情况)

我先对我做的测试进行说明: 对用户注册功能的DAO层进行测试,其实就是对UserDao中的saveUser(User user) 方法进行测试.我在我的测试方法中同时也用到了UserDao中的exitUser(String username)方法进行了测试.     /** * 测试用户注册(成功) */ @Test public void testUserReg(){ User user= new User(); user.setUsername("3137102332_罗文恺");

Django项目: 3.用户注册功能

本章内容的补充知识点 导入库的良好顺序: 1.系统库 2.django库 3.自己定义的库(第三方库) redis缓存数据库的数据调用速度快,但是不利于长时间保存. mysql用于长时间存储,但是调用比较慢. session会话存储的内容(以字典的方式存放)放在redis缓存里面,要设置过期时间 用户注册功能 一.用户模型设计 1. 用户表字段分析 用户名 密码 手机号 邮箱 2.用户模型设计 django的强大之处在于开发效率高,内置了权限模块之类的很多常用功能.在开始一个新的django项目

Android实战简易教程-第二十二枪(基于Baas的用户注册功能)

基于Baas实现用户的注册功能. 我们使用Bmob提供的API进行实战开发,首先在Bmob官网上下载SDK,然后将jar包拷入工程内. 创建应用,获取应用key: 1.main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:

node.js用户注册功能的完善

这篇主要实现了蹩脚的邮件发送,log日志,以及mongodb数据库更新的操作. 草草写点,不然留到五一过后,就说不过去了.因为时间比较紧,所以功能很多都是对付,留给以后优化吧.邮件发送这一块,实现的比较简单,原计划是服务器端为用户生成一个令牌的,形如:http://127.0.0.1:3000?key=w345d&username=fuhui1,但是因为服务器端还得验证,火大,暂时放弃了,直接使用username. 不了解思路的,这里在简单介绍一下,下面是注册页面: 然后判断数据库里fuhui2

(二)学习MVC之实现用户注册功能

学习地址:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 本文和学习地址不一样的地方是我自己添加了一些简单的注释和理解. 1.添加用户模型类和用户组模型类:Model/User.cs和Model/UserGroup.cs User.cs using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnn

Wordpress如何开启用户注册功能

登录你的Wordpress管理员帐号,并进入管理后台,点击左侧菜单栏的"设置"--"常规"   在打开的设置页面,下方找到"允许任何人注册",前方勾选,下面有一个当用户注册默认的角色,不同的角色对应不同的后台权限,我们根据自己的需要选择,设置完毕后,点击"确定"保存   访问你的注册页地址,一般为你的网站域名/wp-login.php?action=register,即会打开注册页面,输入注册信息,按照提示即可注册成功,并且登

以下题目均在bookstore项目上完成(请先运行数据库文件): 1、编写单元测试用例,对用户注册功能的Action层进行测试。(注意:测试用例应考虑成功和失败的情况)

首先,我想说明一下,用户注册时候action中的方法不做任何判断都可以注册,什么都没有考虑,即使全部为空,他都能注册成功.如果还要写测试用例的话,按照我的步骤,在 UserAction中的register()方法中加入一些判断,并在jsp页面中给出相应的提示,由于漏洞实在太多了,我就只写了一个判断——如果用户名为一个空格的时候,注册失败.还有很多测试用例,还有很多漏洞可以测试,我举一个例子:   第一步,在action代码中,将register()方法中加入一个判断: //用户注册,调用serv

node.js前后台交互示例 -- 使用node.js实现用户注册功能

node.js环境自行搭建,参考菜鸟教程的node.js就可以. 1 通过ajax提交index.html中form表单 register.html文件如下: <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> <script src="jquery.js"></scrip