add register function

pull/1/head
xiaoyu 5 years ago
parent a9b5e320c0
commit 11810cd6ca
  1. 4
      fir_client/src/components/FirHeader.vue
  2. 6
      fir_client/src/components/FirLogin.vue
  3. 112
      fir_client/src/components/FirRegist.vue
  4. 2
      fir_client/src/components/FirUserProfileBase.vue
  5. 16
      fir_client/src/restful/index.js
  6. 3
      fir_ser/api/urls.py
  7. 55
      fir_ser/api/views/login.py

@ -14,12 +14,12 @@
</el-breadcrumb> </el-breadcrumb>
</el-col> </el-col>
<el-col :span="2" :push="4"> <el-col :span="2" :push="3">
<div class="block"> <div class="block">
<el-avatar :size="66" :src="$store.state.userinfo.head_img"></el-avatar> <el-avatar :size="66" :src="$store.state.userinfo.head_img"></el-avatar>
</div> </div>
</el-col> </el-col>
<el-col :span="4" :push="4"> <el-col :span="4" :push="3">
<el-dropdown style="padding-top: 12px;" @command="handleCommand"> <el-dropdown style="padding-top: 12px;" @command="handleCommand">
<el-button type="success" plain round> <el-button type="success" plain round>
{{$store.state.userinfo.first_name }}<i class="el-icon-arrow-down el-icon--right"></i> {{$store.state.userinfo.first_name }}<i class="el-icon-arrow-down el-icon--right"></i>

@ -44,9 +44,9 @@
<el-button type="danger" @click="onSubmit">登录</el-button> <el-button type="danger" @click="onSubmit">登录</el-button>
</el-form-item> </el-form-item>
<!-- <el-form-item>--> <el-form-item>
<!-- <el-button type="primary" @click="onRegister" plain>注册</el-button>--> <el-button type="primary" @click="onRegister" plain>注册</el-button>
<!-- </el-form-item>--> </el-form-item>
</el-form> </el-form>

@ -24,40 +24,44 @@
<el-input v-model="form.password" prefix-icon="el-icon-lock" placeholder="密码" <el-input v-model="form.password" prefix-icon="el-icon-lock" placeholder="密码"
show-password></el-input> show-password></el-input>
</el-form-item> </el-form-item>
<el-form-item>
<el-input v-model="form.password2" prefix-icon="el-icon-lock" placeholder="确认密码"
show-password></el-input>
</el-form-item>
<el-form-item style="height: 40px"> <el-form-item style="height: 40px">
<el-row style="height: 40px"> <el-row style="height: 40px">
<el-col :span="16"> <el-col :span="16">
<el-input placeholder="请输入验证码" v-model="form.authcode" maxlength="4"></el-input> <el-input placeholder="请输入验证码" v-model="form.authcode" maxlength="6"></el-input>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-image <el-image
style="margin:0px 4px;border-radius:4px;cursor:pointer;height: 40px" style="margin:0px 4px;border-radius:4px;cursor:pointer;height: 40px"
:src="form.srccode" :src="cptch.cptch_image"
fit="contain" @click="getsrcode"> fit="contain" @click="get_auth_code">
</el-image> </el-image>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item> <!-- <el-form-item>-->
<el-input v-model="form.phone" prefix-icon="el-icon-mobile" placeholder="手机" <!-- <el-input v-model="form.phone" prefix-icon="el-icon-mobile" placeholder="手机"-->
maxlength="11"></el-input> <!-- maxlength="11"></el-input>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item> <!-- <el-form-item>-->
<el-row> <!-- <el-row>-->
<el-col :span="16"> <!-- <el-col :span="16">-->
<el-input v-model="form.phonecode" prefix-icon="el-icon-mobile" <!-- <el-input v-model="form.phonecode" prefix-icon="el-icon-mobile"-->
placeholder="验证码"></el-input> <!-- placeholder="验证码"></el-input>-->
</el-col> <!-- </el-col>-->
<el-col :span="8"> <!-- <el-col :span="8">-->
<el-button type="info" @click="getphonecode" plain <!-- <el-button type="info" @click="getphonecode" plain-->
style="margin:0px 4px;border-radius:4px;cursor:pointer;height: 40px">获取验证码 <!-- style="margin:0px 4px;border-radius:4px;cursor:pointer;height: 40px">获取验证码-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
</el-row> <!-- </el-row>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item> <el-form-item>
<el-button type="danger" @click="onRegist">注册</el-button> <el-button type="danger" @click="onRegist">注册</el-button>
@ -76,6 +80,8 @@
</template> </template>
<script> <script>
import {loginFun, registerFun} from "../restful";
export default { export default {
name: "FirRegist", name: "FirRegist",
data() { data() {
@ -83,27 +89,81 @@
form: { form: {
email: '', email: '',
password: '', password: '',
password2: '',
authcode: '', authcode: '',
srccode: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', srccode: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
phonecode: '', phonecode: '',
phone: '', phone: '',
}, },
cptch: {"cptch_image": '', "cptch_key": '', "length": 8},
} }
}, },
methods: { methods: {
get_auth_code() {
getsrcode() { loginFun(data => {
this.form.srccode = 'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg'; if (data.code == 1000) {
this.cptch = data.data;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, {
"methods": "GET",
"data": {}
});
}, },
getphonecode() { getphonecode() {
}, },
onRegist() { onRegist() {
let email = this.form.email; let email = this.form.email;
let password = this.form.password; let password = this.form.password;
let password2 = this.form.password2;
if (this.isEmail(email)) { if (this.isEmail(email)) {
alert(email, password) let authcode = this.form.authcode;
if (authcode.length === this.cptch.length) {
if(password === password2 && password.length >= 6){
registerFun(data => {
if (data.code == 1000) {
this.$message({
message: '注册成功',
type: 'success'
});
this.$router.push({name: 'FirLogin'})
} else {
this.$message({
message: data.msg,
type: 'error'
});
this.get_auth_code();
}
}, {
"methods": "POST",
"data": {
"username": email,
"password": password,
"password2": password2,
"authcode": authcode,
"cptch_key": this.cptch.cptch_key
}
});
}else {
this.$message({
message: '密码不一致或者密码长度小于6',
type: 'warning'
});
}
} else {
this.$message({
message: '验证码有误',
type: 'warning'
});
}
} else { } else {
this.$message({ this.$message({
message: '请输入正确的邮箱地址', message: '请输入正确的邮箱地址',
@ -124,6 +184,8 @@
} }
, ,
created() { created() {
},mounted() {
this.get_auth_code();
} }
} }
</script> </script>

@ -13,7 +13,7 @@
</el-upload> </el-upload>
<div class="name"> <div class="name">
<input v-model="userinfo.first_name" @focusout="update_name"> <input v-model="userinfo.first_name" maxlength="8" @focusout="update_name">
</div> </div>
<div class="user_pro_tabs"> <div class="user_pro_tabs">

@ -172,6 +172,22 @@ export function loginFun(callBack, params, load = true) {
); );
} }
/**用户注册 */
export function registerFun(callBack, params, load = true) {
getData(
params.methods,
USERSEVER + '/register',
params.data,
data => {
callBack(data);
},
load,
true,
true
);
}
/**用户退出 */ /**用户退出 */
export function logout(callBack, params, load = true) { export function logout(callBack, params, load = true) {
getData( getData(

@ -16,7 +16,7 @@ Including another URLconf
from django.contrib import admin from django.contrib import admin
from django.urls import path, re_path, include from django.urls import path, re_path, include
from api.views.login import LoginView, UserInfoView from api.views.login import LoginView, UserInfoView, RegistView
from api.views.logout import LogoutView from api.views.logout import LogoutView
from api.views.apps import AppsView, AppInfoView, AppReleaseinfoView from api.views.apps import AppsView, AppInfoView, AppReleaseinfoView
from api.views.download import ShortDownloadView from api.views.download import ShortDownloadView
@ -32,6 +32,7 @@ from api.views.supersign import DeveloperView, SuperSignUsedView, AppUDIDUsedVie
urlpatterns = [ urlpatterns = [
# path("",include(router.urls)), # path("",include(router.urls)),
re_path("^login", LoginView.as_view()), re_path("^login", LoginView.as_view()),
re_path("^register", RegistView.as_view()),
re_path("^logout", LogoutView.as_view()), re_path("^logout", LogoutView.as_view()),
re_path("^apps$", AppsView.as_view()), re_path("^apps$", AppsView.as_view()),
re_path("^storage$", StorageView.as_view()), re_path("^storage$", StorageView.as_view()),

@ -83,6 +83,51 @@ class LoginView(APIView):
response.data = get_captcha() response.data = get_captcha()
return Response(response.dict) return Response(response.dict)
class RegistView(APIView):
def generate_key(self):
return binascii.hexlify(os.urandom(32)).decode()
def post(self, request):
response = BaseResponse()
receive = request.data
username = receive.get("username", None)
is_valid = valid_captcha(receive.get("cptch_key", None), receive.get("authcode", None), username)
if is_valid:
if login_auth_failed("get", username):
password = receive.get("password")
password2 = receive.get("password2")
if password == password2:
try:
UserInfo.objects.get(username=username)
login_auth_failed("set", username)
response.msg = "邮箱已经存在,请更换其他邮箱"
response.code = 1002
except UserInfo.DoesNotExist:
user_obj = UserInfo.objects.create_user(username, email=username, password=password,first_name=username)
if user_obj:
response.msg = "注册成功"
response.code = 1000
else:
response.code = 1001
response.msg = "密码不一致"
else:
response.code = 1006
logger.error("username:%s failed too try , locked" % (username,))
response.msg = "用户注册失败次数过多,已被锁定,请1小时之后再次尝试"
else:
response.code = 1001
response.msg = "验证码有误"
return Response(response.dict)
def get(self, request):
response = BaseResponse()
response.data = get_captcha()
return Response(response.dict)
class UserInfoView(APIView): class UserInfoView(APIView):
authentication_classes = [ExpiringTokenAuthentication, ] authentication_classes = [ExpiringTokenAuthentication, ]
@ -170,7 +215,15 @@ class UserInfoView(APIView):
sms_token_obj = DownloadToken() sms_token_obj = DownloadToken()
if sms_token_obj.verify_token(sms_token, data.get("sms_code", None)): if sms_token_obj.verify_token(sms_token, data.get("sms_code", None)):
request.user.mobile = data.get("mobile", request.user.mobile) request.user.mobile = data.get("mobile", request.user.mobile)
request.user.save() try:
request.user.save()
except Exception as e:
serializer = UserInfoSerializer(request.user)
res.data = serializer.data
res.code = 1004
res.msg = "信息保存失败"
logger.error("User %s info save failed. Excepiton:%s" % (request.user,e))
return Response(res.dict)
serializer = UserInfoSerializer(request.user) serializer = UserInfoSerializer(request.user)
res.data = serializer.data res.data = serializer.data
return Response(res.dict) return Response(res.dict)

Loading…
Cancel
Save