当前位置: 首页 > news >正文

day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能

1 注册功能
补充(开放文件夹内)
2 前端登录注册页面复制
4 前端注册功能

1 注册功能

# 分析前端:携带数据格式 {mobile:,code:,password}后端:-1 视图类---》注册方法-2 序列化类---》校验,保存(表中字段多,传的少---》随机,按某种格式生成---》后期修改)

视图类

class UserRegisterView(GenericViewSet, CreateModelMixin):serializer_class = UserRegisterSerializer# @action(methods=['POST'], detail=False)# def register(self, request, *args, **kwargs):#     ser = self.get_serializer(data=request.data)#     ser.is_valid(raise_exception=True)#     ser.save()#     return APIResponse(msg='恭喜您注册成功')# 或者改为@action(methods=['POST'], detail=False)def register(self, request, *args, **kwargs):# 如果是这样做的话,内部执行serializer.data---->会走序列化----》# 基于create返回的user做序列化-----》按照fields = ['mobile', 'code', 'password']做序列化# 但是code不是表中的字段,就会报错,这个时候需要在序列化类中将其反序列化# 即:code = serializers.CharField(max_length=4, min_length=4, write_only=True)res = super().create(request, *args, **kwargs)return APIResponse(msg='恭喜注册成功')

序列化类

class UserRegisterSerializer(serializers.ModelSerializer):# code 不是表中字段code = serializers.CharField(max_length=4, min_length=4, write_only=True)class Meta:model = Userfields = ['mobile', 'code', 'password']def validate(self, attrs):# 1 校验验证码是否正确mobile = attrs.get('mobile')code = attrs.get('code')old_code = cache.get('cache_mobile_%s' % mobile)if code == old_code or code == '8888':  # 测试阶段,万能验证码# 2 组装数据 :username必填,但是没有,code不是表的字段attrs['username'] = mobileattrs.pop('code')# 3 返回return attrsdef create(self, validated_data):  # 密码是加密的,如果重写,密码是明文的  validated_data=mobile,password,usernameuser = User.objects.create_user(**validated_data)return user

补充(开放文件夹内)

#1 为什么要写这个media才能访问-django 默认是不允许前端直接访问项目某个文件夹的-有个static文件夹例外,需要额外配置-如果想让用户访问,必须配置路由,使用serve函数放开path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})-浏览器中访问 meida/icon/1.png--->能把settings.MEDIA_ROOT对应的文件夹下的icon/1.png返回给前端path('lqz/<path:path>', serve, {'document_root':os.path.join(BASE_DIR, 'lqz')})浏览器中访问 lqz/a.txt----->能把项目根路径下lqz对应的文件夹下的a.txt返回给前端# 2 配置文件中 debug作用-开发阶段,都是debug为True,信息显示更丰富-你访问的路由如果不存在,会把所有能访问到的路由都显示出来-程序出了异常,错误信息直接显示在浏览器上-自动重启,只要改了代码,会自动重启-上线阶段,肯定要改成False#3  ALLOWED_HOSTS 的作用-只有debug 为Flase时,这个必须填-限制后端项目(django项目 )能够部署在哪个ip的机器上,写个 *  表示所有地址都可以#4 咱们的项目中,为了知道是在调试模式还是在上线模式,所以才用的debug这个字段-判断,如果是开发阶段,可以有个万能验证码# 5 短信登录或注册接口-app 只需要输入手机号和验证码,如果账号不存在,直接注册成功,并且登录成功,如果账号存在,就是登录-前端传入:{mobiel,code}--->验证验证码是否正确---》拿着mobile去数据库查询,如果能查到,说明它注册过了,直接签发token返回----》如果查不到,没有注册过---》走注册逻辑完成注册---》再签发token,返回给前端-这个接口,随机生成一个6位密码,以短信形式通知用户-这个接口,密码为空,下次他用账号密码登录,不允许登录-后续改密码:user.set_password(new_password)

2 前端登录注册页面测试

登录,注册,都写成组件----》在任意页面中,都能点击显示登录模态框
写好的组件,应该放在那个组件中----》不是页面组件(小组件)
点击登录按钮,把Login.vue 通过定位,占满全屏,透明度设为 0.5 ,纯黑色悲剧,覆盖在组件上
在Login.vue点关闭,要把Login.vue隐藏起来,父子通信之子传父,自定义事件

2.1 Header.vue


<template><div class="header"><div class="slogan"><p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p></div><div class="nav"><ul class="left-part"><li class="logo"><router-link to="/"><img src="../assets/img/head-logo.svg" alt=""></router-link></li><li class="ele"><span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span></li><li class="ele"><span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span></li><li class="ele"><span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span></li></ul><div class="right-part"><div><span @click="handleLogin" >登录</span><span class="line">|</span><span>注册</span></div></div><Login v-if="loginShow" @close="handleClose"></Login></div></div></template><script>
import Login from "@/components/Login";export default {name: "Header",data() {return {url_path: sessionStorage.url_path || '/',loginShow: false,}},methods: {goPage(url_path) {// 已经是当前路由就没有必要重新跳转if (this.url_path !== url_path) {this.$router.push(url_path);}sessionStorage.url_path = url_path;},handleLogin(){this.loginShow = true},handleClose(){this.loginShow = false}},created() {sessionStorage.url_path = this.$route.path;this.url_path = this.$route.path;},components: {Login}
}
</script><style scoped>
.header {background-color: white;box-shadow: 0 0 5px 0 #aaa;
}.header:after {content: "";display: block;clear: both;
}.slogan {background-color: #eee;height: 40px;
}.slogan p {width: 1200px;margin: 0 auto;color: #aaa;font-size: 13px;line-height: 40px;
}.nav {background-color: white;user-select: none;width: 1200px;margin: 0 auto;}.nav ul {padding: 15px 0;float: left;
}.nav ul:after {clear: both;content: '';display: block;
}.nav ul li {float: left;
}.logo {margin-right: 20px;
}.ele {margin: 0 20px;
}.ele span {display: block;font: 15px/36px '微软雅黑';border-bottom: 2px solid transparent;cursor: pointer;
}.ele span:hover {border-bottom-color: orange;
}.ele span.active {color: orange;border-bottom-color: orange;
}.right-part {float: right;
}.right-part .line {margin: 0 10px;
}.right-part span {line-height: 68px;cursor: pointer;
}
</style>

2.2 Login.vue

<template><div class="login"><span @click="close">X</span></div>
</template><script>
export default {name: "Login",methods: {close() {this.$emit('close_login')}}}
</script><style scoped>
.login {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 10;background-color: rgba(0, 0, 0, 0.5);
}
</style>

3 前端登录功能

<template><div class="login"><div class="box"><i class="el-icon-close" @click="close_login"></i><div class="content"><div class="nav"><span :class="{active: login_method === 'is_pwd'}" @click="change_login_method('is_pwd')">密码登录</span><span :class="{active: login_method === 'is_sms'}" @click="change_login_method('is_sms')">短信登录</span></div><el-form v-if="login_method === 'is_pwd'"><el-inputplaceholder="用户名/手机号/邮箱"prefix-icon="el-icon-user"v-model="username"clearable></el-input><el-inputplaceholder="密码"prefix-icon="el-icon-key"v-model="password"clearableshow-password></el-input><el-button type="primary" @click="login">登录</el-button></el-form><el-form v-if="login_method === 'is_sms'"><el-inputplaceholder="手机号"prefix-icon="el-icon-phone-outline"v-model="mobile"clearable@blur="check_mobile"></el-input><el-inputplaceholder="验证码"prefix-icon="el-icon-chat-line-round"v-model="sms"clearable><template slot="append"><span class="sms" @click="send_sms">{{ sms_interval }}</span></template></el-input><el-button @click="mobile_login" type="primary">登录</el-button></el-form><div class="foot"><span @click="go_register">立即注册</span></div></div></div></div>
</template><script>
export default {name: "Login",data() {return {username: '',password: '',mobile: '',sms: '',  // 验证码login_method: 'is_pwd',sms_interval: '获取验证码',is_send: false,}},methods: {close_login() {this.$emit('close')},go_register() {this.$emit('go')},change_login_method(method) {this.login_method = method;},check_mobile() {if (!this.mobile) return;// js正则:/正则语法/// '字符串'.match(/正则语法/)if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {this.$message({message: '手机号有误',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}});return false;}// 后台校验手机号是否已存在this.$axios({url: this.$settings.BASE_URL + 'user/mobile/check_mobile/?mobile=' + this.mobile,method: 'get',}).then(response => {if (response.data.code == 100) {this.$message({message: '账号正常,可以发送短信',type: 'success',duration: 1000,});// 发生验证码按钮才可以被点击this.is_send = true;} else {this.$message({message: '账号不存在',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}})}}).catch(() => {});},send_sms() {// this.is_send必须允许发生验证码,才可以往下执行逻辑if (!this.is_send) return;// 按钮点一次立即禁用this.is_send = false;let sms_interval_time = 60;this.sms_interval = "发送中...";// 定时器: setInterval(fn, time, args)// 往后台发送验证码this.$axios({url: this.$settings.BASE_URL + 'user/mobile/send_sms/',method: 'post',data: {mobile: this.mobile}}).then(response => {if (response.data.code == 100) { // 发送成功let timer = setInterval(() => {if (sms_interval_time <= 1) {clearInterval(timer);this.sms_interval = "获取验证码";this.is_send = true; // 重新回复点击发送功能的条件} else {sms_interval_time -= 1;this.sms_interval = `${sms_interval_time}秒后再发`;}}, 1000);} else {  // 发送失败this.sms_interval = "重新获取";this.is_send = true;this.$message({message: '短信发送失败',type: 'warning',duration: 3000});}}).catch(() => {this.sms_interval = "频率过快";this.is_send = true;})},login() {if (!(this.username && this.password)) {this.$message({message: '请填好账号密码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/login/mul_login/',method: 'post',data: {username: this.username,password: this.password,}}).then(response => {let username = response.data.username;let token = response.data.token;this.$cookies.set('username', username, '7d');this.$cookies.set('token', token, '7d');this.$emit('success', response.data);}).catch(error => {console.log(error.response.data)})},mobile_login() {if (!(this.mobile && this.sms)) {this.$message({message: '请填好手机与验证码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/login/sms_login/',method: 'post',data: {mobile: this.mobile,code: this.sms,}}).then(response => {if (response.data.code == 100) {let username = response.data.username;let token = response.data.token;this.$cookies.set('username', username, '7d');this.$cookies.set('token', token, '7d');this.$emit('success', response.data);} else {this.$message({message: '登录失败',type: 'warning',duration: 1500});}}).catch(error => {console.log(error.response.data)})}}
}
</script><style scoped>
.login {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 10;background-color: rgba(0, 0, 0, 0.5);
}.box {width: 400px;height: 420px;background-color: white;border-radius: 10px;position: relative;top: calc(50vh - 210px);left: calc(50vw - 200px);
}.el-icon-close {position: absolute;font-weight: bold;font-size: 20px;top: 10px;right: 10px;cursor: pointer;
}.el-icon-close:hover {color: darkred;
}.content {position: absolute;top: 40px;width: 280px;left: 60px;
}.nav {font-size: 20px;height: 38px;border-bottom: 2px solid darkgrey;
}.nav > span {margin: 0 20px 0 35px;color: darkgrey;user-select: none;cursor: pointer;padding-bottom: 10px;border-bottom: 2px solid darkgrey;
}.nav > span.active {color: black;border-bottom: 3px solid black;padding-bottom: 9px;
}.el-input, .el-button {margin-top: 40px;
}.el-button {width: 100%;font-size: 18px;
}.foot > span {float: right;margin-top: 20px;color: orange;cursor: pointer;
}.sms {color: orange;cursor: pointer;display: inline-block;width: 70px;text-align: center;user-select: none;
}
</style>

4 前端注册功能

<template><div class="register"><div class="box"><i class="el-icon-close" @click="close_register"></i><div class="content"><div class="nav"><span class="active">新用户注册</span></div><el-form><el-inputplaceholder="手机号"prefix-icon="el-icon-phone-outline"v-model="mobile"clearable@blur="check_mobile"></el-input><el-inputplaceholder="密码"prefix-icon="el-icon-key"v-model="password"clearableshow-password></el-input><el-inputplaceholder="验证码"prefix-icon="el-icon-chat-line-round"v-model="sms"clearable><template slot="append"><span class="sms" @click="send_sms">{{ sms_interval }}</span></template></el-input><el-button @click="register" type="primary">注册</el-button></el-form><div class="foot"><span @click="go_login">立即登录</span></div></div></div></div>
</template><script>
export default {name: "Register",data() {return {mobile: '',password: '',sms: '',sms_interval: '获取验证码',is_send: false,}},methods: {close_register() {this.$emit('close', false)},go_login() {this.$emit('go')},check_mobile() {if (!this.mobile) return;// js正则:/正则语法/// '字符串'.match(/正则语法/)if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {this.$message({message: '手机号有误',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}});return false;}// 后台校验手机号是否已存在this.$axios({url: this.$settings.BASE_URL + 'user/mobile/check_mobile/?mobile='+this.mobile,method: 'get',}).then(response => {if (response.data.code!=100) {this.$message({message: '欢迎注册我们的平台',type: 'success',duration: 1500,});// 发生验证码按钮才可以被点击this.is_send = true;} else {this.$message({message: '账号已存在,请直接登录',type: 'warning',duration: 1500,})}}).catch(() => {});},send_sms() {// this.is_send必须允许发生验证码,才可以往下执行逻辑if (!this.is_send) return;// 按钮点一次立即禁用this.is_send = false;let sms_interval_time = 60;this.sms_interval = "发送中...";// 定时器: setInterval(fn, time, args)// 往后台发送验证码this.$axios({url: this.$settings.BASE_URL + 'user/mobile/send_sms/',method: 'post',data: {mobile: this.mobile}}).then(response => {if (response.data.code==100) { // 发送成功let timer = setInterval(() => {if (sms_interval_time <= 1) {clearInterval(timer);this.sms_interval = "获取验证码";this.is_send = true; // 重新回复点击发送功能的条件} else {sms_interval_time -= 1;this.sms_interval = `${sms_interval_time}秒后再发`;}}, 1000);} else {  // 发送失败this.sms_interval = "重新获取";this.is_send = true;this.$message({message: '短信发送失败',type: 'warning',duration: 3000});}}).catch(() => {this.sms_interval = "频率过快";this.is_send = true;})},register() {if (!(this.mobile && this.sms && this.password)) {this.$message({message: '请填好手机、密码与验证码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/register/register/',method: 'post',data: {mobile: this.mobile,code: this.sms,password: this.password}}).then(response => {this.$message({message: '注册成功,3秒跳转登录页面',type: 'success',duration: 3000,showClose: true,onClose: () => {// 去向成功页面this.$emit('success')}});}).catch(error => {this.$message({message: '注册失败,请重新注册',type: 'warning',duration: 1500,showClose: true,onClose: () => {// 清空所有输入框this.mobile = '';this.password = '';this.sms = '';}});})}}
}
</script><style scoped>
.register {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 10;background-color: rgba(0, 0, 0, 0.3);
}.box {width: 400px;height: 480px;background-color: white;border-radius: 10px;position: relative;top: calc(50vh - 240px);left: calc(50vw - 200px);
}.el-icon-close {position: absolute;font-weight: bold;font-size: 20px;top: 10px;right: 10px;cursor: pointer;
}.el-icon-close:hover {color: darkred;
}.content {position: absolute;top: 40px;width: 280px;left: 60px;
}.nav {font-size: 20px;height: 38px;border-bottom: 2px solid darkgrey;
}.nav > span {margin-left: 90px;color: darkgrey;user-select: none;cursor: pointer;padding-bottom: 10px;border-bottom: 2px solid darkgrey;
}.nav > span.active {color: black;border-bottom: 3px solid black;padding-bottom: 9px;
}.el-input, .el-button {margin-top: 40px;
}.el-button {width: 100%;font-size: 18px;
}.foot > span {float: right;margin-top: 20px;color: orange;cursor: pointer;
}.sms {color: orange;cursor: pointer;display: inline-block;width: 70px;text-align: center;user-select: none;
}
</style>

Header.vue

<template><div class="header"><div class="slogan"><p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p></div><div class="nav"><ul class="left-part"><li class="logo"><router-link to="/"><img src="../assets/img/head-logo.svg" alt=""></router-link></li><li class="ele"><span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span></li><li class="ele"><span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span></li><li class="ele"><span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span></li></ul><div class="right-part"><div v-if="!username"><span @click="handleLogin">登录</span><span class="line">|</span><span @click="handleRegister">注册</span></div><div v-else><span>{{ username }}</span><span class="line">|</span><span @click="logOut">注销</span></div></div><Login v-if="loginShow" @close="handleClose" @success="success_login" @go="go_register"></Login><Register v-if="registerShow" @close="handleRegisterClose" @success="success_register"@go="success_register"></Register></div></div></template>
<script>
import Login from "@/components/Login.vue";
import Register from "@/components/Register.vue";export default {name: "Header",data() {return {url_path: sessionStorage.url_path || '/',loginShow: false,registerShow: false,username: '',token: ''}},methods: {handleRegister() {this.registerShow = true},handleRegisterClose() {this.registerShow = false},success_register() {this.registerShow = falsethis.loginShow = true},go_register() {this.registerShow = truethis.loginShow = false},logOut() {this.username = ''this.token = ''this.$cookies.remove('username')this.$cookies.remove('token')},goPage(url_path) {// 已经是当前路由就没有必要重新跳转if (this.url_path !== url_path) {this.$router.push(url_path);}sessionStorage.url_path = url_path;},handleLogin() {this.loginShow = true},handleClose() {this.loginShow = false},success_login(data) {this.loginShow = false;  // 模态框消耗this.username = data.username;this.token = data.token;}},created() {sessionStorage.url_path = this.$route.path;this.url_path = this.$route.path;this.username = this.$cookies.get('username')},components: {Register,Login}
}
</script><style scoped>
.header {background-color: white;box-shadow: 0 0 5px 0 #aaa;
}.header:after {content: "";display: block;clear: both;
}.slogan {background-color: #eee;height: 40px;
}.slogan p {width: 1200px;margin: 0 auto;color: #aaa;font-size: 13px;line-height: 40px;
}.nav {background-color: white;user-select: none;width: 1200px;margin: 0 auto;}.nav ul {padding: 15px 0;float: left;
}.nav ul:after {clear: both;content: '';display: block;
}.nav ul li {float: left;
}.logo {margin-right: 20px;
}.ele {margin: 0 20px;
}.ele span {display: block;font: 15px/36px '微软雅黑';border-bottom: 2px solid transparent;cursor: pointer;
}.ele span:hover {border-bottom-color: orange;
}.ele span.active {color: orange;border-bottom-color: orange;
}.right-part {float: right;
}.right-part .line {margin: 0 10px;
}.right-part span {line-height: 68px;cursor: pointer;
}
</style>

相关文章:

day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能

1 注册功能 补充(开放文件夹内) 2 前端登录注册页面复制 4 前端注册功能 1 注册功能 # 分析前端&#xff1a;携带数据格式 {mobile:,code:,password}后端&#xff1a;-1 视图类---》注册方法-2 序列化类---》校验&#xff0c;保存&#xff08;表中字段多&#xff0c;传的少---…...

rust: function

///file: nestd.rs ///ide: RustRover 233.8264.22 /// /// /// /***自定义函数*/ pub fn function() {println!("called my::nested::function()"); }#[allow(dead_code)] fn private_function() {println!("called my::nested::private_function()"); }/…...

零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频

谷歌podcast有很多播客音频&#xff0c;如何批量下载到电脑呢&#xff1f; 以这个播客为例&#xff1a; https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…...

nginx.4——正向代理和反向代理(七层代理和四层代理)

1、正向代理反向代理 nginx当中有两种代理方式 七层代理(http协议) 四层代理(tcp/udp流量转发) 七层代理 七层代理&#xff1a;代理的是http的请求和响应。 客户端请求代理服务器&#xff0c;由代理服务器转发给客户端http请求。转发到内部服务器&#xff08;可以单台&#…...

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 相应的后端也要做一些调整 1、启动流程修改如下&#xff1a; /*** 启动流程实例*/private R startProce…...

Spring-事务源码解析2

上一篇文章我们介绍了事务开启注解EnableTransactionManagement源码解析《Spring-事务源码解析1》 里面提到了2个关键组件&#xff0c;这里我们分析下Spring如何利用这2个组件来给Bean创建代理对象。 本篇文章我们看下当一个类里面包含了Transactional注解&#xff0c;Spring如…...

基于ssm008医院门诊挂号系统+jsp【附PPT|开题|任务书|万字文档(LW)和搭建文档】

主要功能 后台登录&#xff1a;4个角色 管理员&#xff1a; ①个人中心、修改密码、个人信息 ②药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断信息管理、病例库管理、开药信息管理、药品信息管理、收费信息管理 药房&#xff1a; ①个人中心、修…...

【Linux常用命令11】Linux文件与权限详解

权限 r &#xff1a;读权限&#xff0c;用数字4表示 w &#xff1a;写权限&#xff0c;用数字2表示 x &#xff1a;执行权限&#xff0c;用数字1表示 常用权限 644&#xff1a;代表所有者拥有读、写权限&#xff0c;而所属组和其他人拥有只读权限。 755&#xff1a;代表所有…...

BAT026:删除当前目录指定文件夹以外的文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】…...

Python浏览器自动化

如果你正在进行手机爬虫的工作&#xff0c;并且希望通过模拟浏览器行为来抓取数据&#xff0c;那么Pyppeteer将会是你的理想选择。Pyppeteer是一个强大的Python库&#xff0c;它可以让你控制浏览器进行自动化操作&#xff0c;如点击按钮、填写表单等&#xff0c;从而实现数据的…...

基于tornado BELLE 搭建本地的web 服务

我的github 将BELLE 封装成web 后端服务&#xff0c;采用tornado 框架 import timeimport torch import torch.nn as nnfrom gptq import * from modelutils import * from quant import *from transformers import AutoTokenizer import sys import json #import lightgbm a…...

信息系统漏洞与风险管理制度

1、总则 1.1、目的 为了进一步规范XXXXX单位信息系统风险管理活动&#xff0c;提升风险管理工作的可操纵性和适用性&#xff0c;使信息网络正常运行&#xff0c;防止网络攻击&#xff0c;保证业务的正常进行&#xff0c;依据XXXXX单位员的相关规范和标准规定&#xff0c;特制…...

Hadoop3教程(十七):MapReduce之ReduceJoin案例分析

文章目录 &#xff08;113&#xff09;ReduceJoin案例需求分析&#xff08;114&#xff09;ReduceJoin案例代码实操 - TableBean&#xff08;115&#xff09;ReduceJoin案例代码实操 - TableMapper&#xff08;116&#xff09;ReduceJoin案例代码实操 - Reducer及Driver参考文献…...

BAT026:删除当前目录及子目录下的空文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现批量删除当前目录及子目录下的空文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑…...

nodejs+vue网课学习平台

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk

本文是LLM系列文章&#xff0c;针对《Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk》的翻译。 语言模型能制造乐趣吗?中国滑稽相声个案研究 摘要1 引言2 问题定义3 数据集4 使用自动评估生成基准5 人工评估6 讨论7 结论与未来工作 摘要 语言是…...

阿里云云服务器实例使用教学

目录 云服务器免费试用 详细步骤 Xshell 远程连接 云服务器免费试用 阿里云云服务器网址&#xff1a;阿里云免费试用 - 阿里云 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮&#xff0c;并根据页面提示完成账号登录&#xff08;已有阿里云账号&#xff09;…...

promisify 是 Node.js 标准库 util 模块中的一个函数

promisify 是 Node.js 标准库 util 模块中的一个函数。它用于将遵循 Node.js 回调风格的函数转换为返回 Promise 的函数。这使得你可以使用 async/await 语法来等待异步操作完成&#xff0c;从而让异步代码看起来更像同步代码。 在 Node.js 的回调风格中&#xff0c;函数通常接…...

ArcGIS在VUE框架中的构建思想

项目快要上线了&#xff0c;出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面&#xff0c;把关于地图方面的代码给优化一下。试运行的时候&#xff0c;客户说控制台有很多飘红的报错&#xff0c;他们很在意&#xff0c;虽然很不情愿&#xff0c;但能改的就给改了吧…...

【Overload游戏引擎细节分析】视图投影矩阵计算与摄像机

本文只罗列公式&#xff0c;不做具体的推导。 OpenGL本身没有摄像机(Camera)的概念&#xff0c;但我们为了产品上的需求与编程上的方便&#xff0c;一般会抽象一个摄像机组件。摄像机类似于人眼&#xff0c;可以建立一个本地坐标系。相机的位置是坐标原点&#xff0c;摄像机的朝…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...