BBS项目day02、注册、登录(登录之随机验证码)、修改密码、退出登录、密码加密加盐

一、注册

1.注册之前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册页面</title><!--动态引入文件-->{% load static %}<script src="{% static 'js/jquery.min.js' %}"></script><link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet"><script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script><script src="{% static 'layer/layer.js' %}"></script><style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-image: url('https://pegasus.epweike.com/Public/uploads/introduce/55dc0c8c010df.jpg');background-size: cover;background-repeat: no-repeat;background-position: center;min-height: 100vh;display: flex;justify-content: center;align-items: center;}.container {background-color: rgba(255, 255, 255, 0.9);border-radius: 10px;box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);padding: 20px;text-align: center;width: 100%;max-width: 600px;}h1 {margin-top: 0;}.form-group {margin-bottom: 20px;}label {display: block;font-weight: bold;}.form-control {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;}.btn {background-color: #007bff;color: #fff;padding: 10px 20px;border: none;border-radius: 5px;cursor: pointer;width: 100%;}.btn:hover {background-color: #0056b3;}</style>
</head>
<body><div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">注册页面</h1><div class="form-group"><label for="username">用户姓名</label><input type="text" id="username" class="form-control" msg="用户名必须填写"></div><div class="form-group"><label for="username">用户密码</label><input type="password" id="password" class="form-control" msg="密码必须填写"></div><div class="form-group"><label for="username">确认密码</label><input type="password" id="re_password" class="form-control" msg="确认密码必须填写"></div><div class="form-group"><label for="username">邮箱</label><input type="text" id="email" class="form-control" msg="邮箱必须填写"></div><div class="form-group"><label for="myfile">上传头像:<img src="/static/img/default.png" id="myImg" width="100" alt=""></label><input type="file" id="myfile" style="display: none" class="form-control"></div><div class="form-group"><input type="button" value="提交" class="btn btn-primary btn-block"></div></div></div>
</div>{# 绑定点击事件 #}
<script>// 在页面显示图片$("#myfile").change(function () {// 1.需要借助于文件阅读器(JavaScript的)let myFileReaderObj = new FileReader();// 2.获取文件数据,在此处可以将#myfile改为this{#var myFileDataObj = $("#myfile")[0].files[0];#}var myFileDataObj = $(this)[0].files[0];// 3.把获取到的文件数据提交给阅读器来获取图片myFileReaderObj.readAsDataURL(myFileDataObj);  // 这是异步提交// 4.把它读取的文件数据放到img的src中// 由于异步提交的缘故,代码会一直往下走,从而导致图片不能加载出来,// 故而为了防止此类事件的发生,用onload等待文件或图片加载完再接着往下执行myFileReaderObj.onload = function () {$("#myImg").attr('src', myFileReaderObj.result);}});$(".btn").click(function () {// 1.获取表单数据let username = $("#username").val();let password = $("#password").val();let re_password = $("#re_password").val();let email = $("#email").val();// 获取头像数据let myImg = $("#myfile")[0].files[0];console.log(myImg)// 2.参数验证//方式2:在input中写入 msg="用户名必须填写"等,然后循环取值var ids = ['username', 'password', 're_password', 'email'];$.each(ids, function (index, value) {if (!$('#' + value).val()) {layer.msg($("#" + value).attr('msg'));return;}});if (re_password !== password) {layer.msg('两次密码不一致');return;}// 由于是文件类型,所以data还要接收forData对象,接收了forData对象,// contentType参数和processData参数则要设置为falselet formData = new FormData();formData.append('username', username);formData.append('password', password);formData.append('re_password', re_password);formData.append('email', email);formData.append('myfile', myImg);formData.append('csrfmiddlewaretoken', '{{ csrf_token }}');// 3.发起Ajax请求$.ajax({url: '',type: 'post',data: formData,contentType: false,processData: false,success: function (res) {if (res.code === 200) {{#layer.msg(res.msg, {'icon': 1}, function () {#}layer.msg(res.msg, {}, function () {location.href = res.url;});} else {layer.msg(res.msg);}},});// 参数验证方式1:/*if (!username) {layer.msg('用户名必须填写');return;}if (!password) {layer.msg('密码必须填写');return;}if (!re_password) {layer.msg('确认必须填写');return;}if (!email) {layer.msg('邮箱必须填写');return;}*/});
</script></body>
</html>

2.注册之后台功能

def register(request):# auth_user表扩展之后auth模块依然是可以使用的,在这使用最原生的# 判断是否为Ajax提交# print(request.is_ajax())if request.method == 'POST':# 1.定义返回前端的json数据格式back_dict = {'code': 200, 'msg': '注册成功', 'data': []}# 2.接收前端提交过来的参数username = request.POST.get('username')password = request.POST.get('password')re_password = request.POST.get('re_password')email = request.POST.get('email')myfile = request.FILES.get('myfile')# 3.验证参数:尽量是先验证不合法性,即反着过来验证,# 正向验证也可以,只是会嵌套很多的elif语句if not username:# 1xx 2xx 3xx 4xx 5xx等一般是响应状态码,而我们下面写的业务状态码(人为规定的)back_dict['code'] = 1001back_dict['msg'] = '用户名必填'return JsonResponse(back_dict)if not password:back_dict['code'] = 1003back_dict['msg'] = '密码必填'return JsonResponse(back_dict)if not re_password:back_dict['code'] = 1004back_dict['msg'] = '确认密码必填'return JsonResponse(back_dict)if password != re_password:back_dict['code'] = 1002back_dict['msg'] = '两次密码不一致'return JsonResponse(back_dict)if not email:back_dict['code'] = 1005back_dict['msg'] = '邮箱必填'return JsonResponse(back_dict)# if len(password) >= 6 and len(password) <=20:#     back_dict['code'] = 1000#     back_dict['msg'] = '密码必须是6-20位的'#     return JsonResponse(back_dict)# 4.开设处理正常的业务逻辑new_pwd = get_md5(password)data_dict = {}data_dict['username'] = usernamedata_dict['password'] = new_pwd[: 16]data_dict['email'] = emailif myfile:data_dict['avatar'] = myfile# models.UserInfo.objects.create(username=username, password=new_pwd, email=email, avatar=myfile)# 改为下述models.UserInfo.objects.create(**data_dict)# 5.返回前端数据back_dict['url'] = '/login/'return JsonResponse(back_dict)return render(request, 'register.html', locals())

3.密码加密加盐

# auth模块自带的
from django.conf import settings# 密码加盐
import hashlibdef get_md5(password):m = hashlib.md5()pwd = password + settings.SECRET_KEYm.update(pwd.encode('utf8'))return m.hexdigest()

二、登录

1.登录之前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册页面</title><!--动态引入文件-->{% load static %}<script src="{% static 'js/jquery.min.js' %}"></script><link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet"><script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script><script src="{% static 'layer/layer.js' %}"></script>{#            background: url('https://img0.baidu.com/it/u=741268616,1401664941&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1691859600&t=5c5bee3052ecec363c1ecc2eea9ac3f7') no-repeat; background-size: 100% 130%;#}<style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-image: url('https://pegasus.epweike.com/Public/uploads/introduce/55dc0c8c010df.jpg');background-size: cover;background-repeat: no-repeat;background-position: center;min-height: 100vh;display: flex;justify-content: center;align-items: center;}.container {background-color: rgba(255, 255, 255, 0.9);border-radius: 10px;box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);padding: 20px;text-align: center;width: 100%;max-width: 600px;}h1 {margin-top: 0;}.form-group {margin-bottom: 20px;}label {display: block;font-weight: bold;}.form-control {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;}.btn {background-color: #007bff;color: #fff;padding: 10px 20px;border: none;border-radius: 5px;cursor: pointer;width: 100%;}.btn:hover {background-color: #0056b3;}</style></head><body><div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">登录页面</h1><div class="form-group"><label for="username">用户姓名</label><input type="text" id="username" class="form-control" msg="用户名必须填写"></div><div class="form-group"><label for="username">用户密码</label><input type="password" id="password" class="form-control" msg="密码必须填写"></div><div class="form-group"><label for="username">验证码</label><div class="row"><div class="col-md-6"><input type="text" id="code" class="form-control" msg="验证码必须填写"></div><div class="col-md-6"><img src="/get_code/" style=" width: 160px; height: 35px;" alt=""></div></div></div><div class="form-group"><input type="button" value="提交" class="btn btn-primary btn-block"></div></div></div>
</div><script>$(".btn").click(function () {// 1.获取表单数据let username = $("#username").val();let password = $("#password").val();let code = $("#code").val();// 2.参数验证//方式2:在input中写入 msg="用户名必须填写"等,然后循环取值var ids = ['username', 'password', 'code'];$.each(ids, function (index, value) {if (!$('#' + value).val()) {layer.msg($("#" + value).attr('msg'));return;}});if (code.length !== 5) {layer.msg('验证码输入不正确');return;}// 3.发起Ajax请求$.ajax({url: '',type: 'post',data: {username: username, password: password, code: code, csrfmiddlewaretoken: '{{ csrf_token }}'},success: function (res) {if (res.code === 200) {{#layer.msg(res.msg, {'icon': 1}, function () {#}layer.msg(res.msg, {}, function () {location.href = res.url;});} else {layer.msg(res.msg, {});}},});});
</script></body>
</html>

2.登录之后端

def login(request):'''验证码:一般是图片验证码,短信验证码(平台)滑动验证码(平台)验证码的作用:人机识别,防止爬虫------->一般都需要登录之后才能访问:param request::return:'''if request.method == 'POST':# 1.返回json的数据格式back_dict = {'code': 200, 'msg': '登录成功,3s之后自动跳转', 'data': []}username = request.POST.get('username')password = request.POST.get('password')code = request.POST.get('code')# 2.验证参数if not username:back_dict['code'] = 1006back_dict['msg'] = '用户名必填'return JsonResponse(back_dict)if not password:back_dict['code'] = 1007back_dict['msg'] = '密码必填'return JsonResponse(back_dict)# 由于验证码可能有大小写组成,所以,需要全部设置为大写或者小写if code.upper() != request.session.get('code').upper():back_dict['code'] = 1008back_dict['msg'] = '验证码必填'return JsonResponse(back_dict)# 4.业务逻辑处理new_pwd = get_md5(password)user_obj = models.UserInfo.objects.filter(username=username, password=new_pwd[: 16]).first()if not user_obj:back_dict['code'] = 1009back_dict['msg'] = '用户名或者密码错误'return JsonResponse(back_dict)# 安全相关:密码加密,sql注入,xss攻击,csrf,撞库等# 登录成功,保存用户状态request.session['username'] = user_obj.usernamerequest.session['id'] = user_obj.pkback_dict['url'] = '/home/'return JsonResponse(back_dict)return render(request, 'login.html', locals())

2.登录之随机验证码

"""
图片相关的模块pip3 install pillow
"""
from PIL import Image, ImageDraw, ImageFont"""
Image:生成图片
ImageDraw:能够在图片上乱涂乱画
ImageFont:控制字体样式
"""
from io import BytesIO, StringIO"""
内存管理器模块
BytesIO:临时帮你存储数据 返回的时候数据是二进制
StringIO:临时帮你存储数据 返回的时候数据是字符串
"""
import randomdef get_random():return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)def get_code(request):# 最终步骤4:写图片验证码img_obj = Image.new('RGB', (430, 35), get_random())img_draw = ImageDraw.Draw(img_obj)  # 产生一个画笔对象# 字体地址下载 https://www.zhaozi.cn/s/all/freebusiness/img_font = ImageFont.truetype('static/font/yun.ttf', 30)  # 字体样式 大小# 随机验证码  五位数的随机验证码  数字 小写字母 大写字母code = ''for i in range(5):random_upper = chr(random.randint(65, 90))random_lower = chr(random.randint(97, 122))random_int = str(random.randint(0, 9))# 从上面三个里面随机选择一个tmp = random.choice([random_lower, random_upper, random_int])# 将产生的随机字符串写入到图片上"""为什么一个个写而不是生成好了之后再写因为一个个写能够控制每个字体的间隙 而生成好之后再写的话间隙就没法控制了"""img_draw.text((i * 60 + 60, -2), tmp, get_random(), img_font)# 拼接随机字符串code += tmpprint(code)# 随机验证码在登陆的视图函数里面需要用到 要比对 所以要找地方存起来并且其他视图函数也能拿到request.session['code'] = codeio_obj = BytesIO()img_obj.save(io_obj, 'png')return HttpResponse(io_obj.getvalue())

三、首页

1.首页之前端(导航条和模态框)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>{% load static %}<script src="{% static 'js/jquery.min.js' %}"></script><link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet"><script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script><script src="{% static 'layer/layer.js' %}"></script></head>
<body><nav class="navbar navbar-inverse"><div class="container-fluid"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#bs-example-navbar-collapse-1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">全球最大的博客网站</a></div><!-- Collect the nav links, forms, and other content for toggling --><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><li class="active"><a href="#">文章 <span class="sr-only">(current)</span></a></li><li><a href="#">分类</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">点我看更多美女哦 <span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#">Action</a></li><li><a href="#">Another action</a></li><li><a href="#">Something else here</a></li><li role="separator" class="divider"></li><li><a href="#">Separated link</a></li><li role="separator" class="divider"></li><li><a href="#">One more separated link</a></li></ul></li></ul><form class="navbar-form navbar-left"><div class="form-group"><input type="text" class="form-control" placeholder="Search"></div><button type="submit" class="btn btn-default">搜索</button></form><!-- 模态框 --><ul class="nav navbar-nav navbar-right">{% if request.session.username %}<li><a href="#">{{ request.session.username }}</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">更多操作 <span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#" data-toggle="modal" data-target=".bs-example-modal-lg">修改密码</a></li><li><a href="#">更改头像</a></li><li><a href="/logout/">退出登录</a></li><li><a href="#">后台管理</a></li></ul></li>{% else %}<li><a href="/login/">登录</a></li><li><a href="/register/">注册</a></li>{% endif %}</ul><div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"><div class="modal-dialog modal-lg" role="document"><div class="modal-content"><div class="row"><h1 class="text-center">修改密码</h1><div class="col-md-8 col-md-offset-2"><div class="form-group">用户名:<input type="text" readonly value="{{ request.session.username }}" class="form-control"></div><div class="form-group">原密码:<input type="password" id="old_password" class="form-control" msg="原密码必须输入"></div><div class="form-group">新密码:<input type="password" id="new_password" class="form-control" msg="原密码必须输入"></div><div class="form-group">确认密码:<input type="password" id="re_password" class="form-control" msg="原密码必须输入"></div><div class="form-group"><input type="button" value="修改密码" class="btn btn-primary btn-block"></div></div></div></div></div></div></div><!-- /.navbar-collapse --></div><!-- /.container-fluid -->
</nav><script>$(".btn").click(function () {// 1.获取参数let old_password = $("#old_password").val();let new_password = $("#new_password").val();let re_password = $("#re_password").val();// 2.参数验证let ids = ['old_password', 'new_password', 're_password'];$.each(ids, function (index, value) {if (!$('#' + value).val()) {layer.msg($('#' + value).attr('msg'));return;}});// 3.发起Ajax请求$.ajax({url: '/set_password/',type: 'post',data: {old_password:old_password, new_password:new_password, re_password:re_password, csrfmiddlewaretoken:'{{ csrf_token }}'},success: function (res) {if (res.code == 200) {layer.msg(res.msg, {}, function () {location.reload();});} else {layer.msg(res.msg, {});}}});});
</script></body>
</html>

在这里插入图片描述

2.首页之后端(修改密码)

def set_password(request):if request.method == 'POST':# 1.先设定给前端返回的json格式的数据back_dict = {'code': 200, 'msg': '修改密码成功,3s后自动跳转', 'data': []}# 2.接收前端提交过来的参数old_password = request.POST.get('old_password')new_password = request.POST.get('new_password')re_password = request.POST.get('re_password')# 3.验证参数if new_password != re_password:back_dict['code'] = 1200back_dict['msg'] = '两次密码输入不一致'return JsonResponse(back_dict)# 验证老密码是否正确old_pwd = get_md5(old_password)user_obj = models.UserInfo.objects.filter(username=request.session.get('username'), password=old_pwd[: 16]).first()if not user_obj:back_dict['code'] = 1201back_dict['msg'] = '原密码不正确'return JsonResponse(back_dict)# 4.修改新密码new_pwd = get_md5(new_password)print(new_pwd)models.UserInfo.objects.filter(pk=request.session.get('id')).update(password=new_pwd[: 16])return JsonResponse(back_dict)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38792.shtml

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

相关文章

【springmvc系】利用RequestBodyAdviceAdapter做接口鉴权

需求 有个简单的需求&#xff0c;对于第三方接口我们需要做个简单的鉴权机制&#xff0c;这边使用的是非对称性加密的机制。我们提供三方公钥&#xff0c;他们通过公钥对接口json报文使用加密后的报文请求&#xff0c;我们通过对接收过来的请求某一个加密报文字段来进行RSA解密…

婚恋交友h5多端小程序开源版开发

婚恋交友h5多端小程序开源版开发 以下是婚恋交友H5多端小程序的功能列表&#xff1a; 用户注册和登录&#xff1a;用户可以通过手机号码或第三方账号注册和登录。个人信息填写&#xff1a;用户可以填写个人基本信息&#xff0c;包括姓名、性别、年龄、身高、体重、学历、职业等…

Java课题笔记~ 数据提交的方式

前四种数据注入的方式&#xff0c;会自动进行类型转换。但无法自动转换日期类型。 &#xff08;1&#xff09;单个数据&#xff08;基本数据类型&#xff09;注入 在方法中声明一个和表单提交的参数名称相同的参数&#xff0c;由框架按照名称直接注入。 &#xff08;2&#x…

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题 场景复现 1 new String() 2 快捷方式生成变量 final修饰的 final String s new String();步骤一&#xff1a;确保settings配置信息 settings-----》Editor------》Code Style--------》java下的这两个选项不…

echarts 柱状图-折线图-饼图的基础使用

上图示例图表展示相关配置&#xff1a; var myChart echarts.init(this.$refs.firstMain);myChart.setOption({legend: { // 图例设置top: "15%",type: "scroll",orient: "vertical",//图例列表的布局朝向。left: "right",pageIconCo…

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs&#xff08;访问控制列表&#xff09;时&#xff0c;可以根据以下思路进行设计&#xff1a; 所有者文件权限&#xff1a;确定文件的所有者能够对文件执行哪些操作&#xff0c;如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…

k8s集群部署vmalert和prometheusalert实现钉钉告警

先决条件 安装以下软件包&#xff1a;git, kubectl, helm, helm-docs&#xff0c;请参阅本教程。 1、安装 helm wget https://xxx-xx.oss-cn-xxx.aliyuncs.com/helm-v3.8.1-linux-amd64.tar.gz tar xvzf helm-v3.8.1-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin…

12 注册登录

12 注册登录 整体概述 使用数据库连接池实现服务器访问数据库的功能&#xff0c;使用POST请求完成注册和登录的校验工作。 本文内容 介绍同步实现注册登录功能&#xff0c;具体涉及到流程图、载入数据库表、提取用户名和密码、注册登录流程与页面跳转的代码实现。 流程图&a…

六、Linux系统下,文件操作命令都有哪些?

总括&#xff1a; 创建文件/文件夹&#xff1a;touch&#xff1b; 查看&#xff1a;cat/more&#xff1b; 复制&#xff1a;copy&#xff1b; 移动文件/文件夹&#xff1a;mv&#xff1b; 删除&#xff1a;rm&#xff1b; 1、创建文件 &#xff08;1&#xff09;语法&#x…

阿里云与中国中医科学院合作,推动中医药行业数字化和智能化发展

据相关媒体消息&#xff0c;阿里云与中国中医科学院的合作旨在推动中医药行业的数字化和智能化发展。随着互联网的进步和相关政策的支持&#xff0c;中医药产业受到了国家的高度关注。这次合作将以“互联网 中医药”为载体&#xff0c;致力于推进中医药文化的传承和创新发展。…

AIGC绘画:基于Stable Diffusion进行AI绘图

文章目录 AIGC深度学习模型绘画系统stable diffusion简介stable diffusion应用现状在线网站云端部署本地部署Stable Diffusion AIGC深度学习模型绘画系统 stable diffusion简介 Stable Diffusion是2022年发布的深度学习文本到图像生成模型&#xff0c;它主要用于根据文本的描述…

通俗讲解-动量梯度下降法原理与代码实例

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一.动量梯度下降法介绍 1.1 动量梯度下降法简介与思想 1.2 动量梯度下降法的算法流程 二.动量梯度下降法代码实例 2.1 动量梯度下降法实例代码 一.动量梯度下降法介绍…

2023年上半年数学建模竞赛题目汇总与难度分析

2023年上半年数学建模竞赛题目汇总与难度分析 ​由于近年来国赛ABC题出题方式漂浮不定&#xff0c;没有太大的定性&#xff0c;目前总体的命题方向为&#xff0c;由之前的单一模型问题变为数据分析评价优化或者预测类题目是B、C题的主要命题方向。为了更好地把握今年命题的主方…

vue3-vuex

一、概念 &#xff08;1&#xff09;Vuex 是一个状态和数据管理的框架&#xff0c;负责管理项目中多个组件和多个页面共享的数据。 &#xff08;2&#xff09;在开发项目的时候&#xff0c;我们就会把数据分成两个部分&#xff0c;一种数据是在某个组件内部使用&#xff0c;我…

【C++】STL案例1-评委打分

0.前言 1.系统自动生成的评委评分代码&#xff1a; #include <iostream> using namespace std; #include <deque> #include <vector> #include <algorithm> #include <string>//选手类 class Player { public:Player(string name, float score)…

机器学习深度学习——机器翻译(序列生成策略)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——seq2seq实现机器翻译&#xff08;详细实现与原理推导&#xff09; &#x1f4da;订阅专栏&#xff1a;机…

最新AI系统ChatGPT网站程序源码+搭建教程/公众号/H5端/安装配置教程/完整知识库

1、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;…

基于IDE Eval Resetter延长IntelliJ IDEA等软件试用期的方法(包含新版本软件的操作方法)

本文介绍基于IDE Eval Resetter插件&#xff0c;对集成开发环境IntelliJ IDEA等JetBrains公司下属的多个开发软件&#xff0c;加以试用期延长的方法。 我们这里就以IntelliJ IDEA为例&#xff0c;来介绍这一插件发挥作用的具体方式。不过&#xff0c;需要说明使用IDE Eval Rese…

Hlang社区-社区主页实现

文章目录 前言首页结构固定导航栏左侧导航itemitem标志头部推荐文章展示ITEM实现ToolTip完整实现首页完整实现前言 废话不多说,直接看到效果,这里的话是我们社区主页,不是产品宣传主页哈: 是的也许你已经发现了这个页面和某个网站长得贼像。没错是这样的,这个布局我确实…

vue3+vite+pinia

目录 一、项目准备 1.1、Vite搭建项目 1.2、vue_cli创建项目 二、组合式API(基于setup) 2.1、ref 2.2、reactive 2.3、toRefs 2.4、watch和watchEffect 2.5、computed 2.6、生命周期钩子函数 2.7、setup(子组件)的第一个参数-props 2.8、setup(子组件)的第二个参数…