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 注册功能 # 分析前端:携带数据格式 {mobile:,code:,password}后端:-1 视图类---》注册方法-2 序列化类---》校验,保存(表中字段多,传的少---…...
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有很多播客音频,如何批量下载到电脑呢? 以这个播客为例: https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…...
nginx.4——正向代理和反向代理(七层代理和四层代理)
1、正向代理反向代理 nginx当中有两种代理方式 七层代理(http协议) 四层代理(tcp/udp流量转发) 七层代理 七层代理:代理的是http的请求和响应。 客户端请求代理服务器,由代理服务器转发给客户端http请求。转发到内部服务器(可以单台&#…...
基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(三)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 相应的后端也要做一些调整 1、启动流程修改如下: /*** 启动流程实例*/private R startProce…...
Spring-事务源码解析2
上一篇文章我们介绍了事务开启注解EnableTransactionManagement源码解析《Spring-事务源码解析1》 里面提到了2个关键组件,这里我们分析下Spring如何利用这2个组件来给Bean创建代理对象。 本篇文章我们看下当一个类里面包含了Transactional注解,Spring如…...
基于ssm008医院门诊挂号系统+jsp【附PPT|开题|任务书|万字文档(LW)和搭建文档】
主要功能 后台登录:4个角色 管理员: ①个人中心、修改密码、个人信息 ②药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断信息管理、病例库管理、开药信息管理、药品信息管理、收费信息管理 药房: ①个人中心、修…...
【Linux常用命令11】Linux文件与权限详解
权限 r :读权限,用数字4表示 w :写权限,用数字2表示 x :执行权限,用数字1表示 常用权限 644:代表所有者拥有读、写权限,而所属组和其他人拥有只读权限。 755:代表所有…...
BAT026:删除当前目录指定文件夹以外的文件夹
引言:编写批处理程序,实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【编辑】…...
Python浏览器自动化
如果你正在进行手机爬虫的工作,并且希望通过模拟浏览器行为来抓取数据,那么Pyppeteer将会是你的理想选择。Pyppeteer是一个强大的Python库,它可以让你控制浏览器进行自动化操作,如点击按钮、填写表单等,从而实现数据的…...
基于tornado BELLE 搭建本地的web 服务
我的github 将BELLE 封装成web 后端服务,采用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单位信息系统风险管理活动,提升风险管理工作的可操纵性和适用性,使信息网络正常运行,防止网络攻击,保证业务的正常进行,依据XXXXX单位员的相关规范和标准规定,特制…...
Hadoop3教程(十七):MapReduce之ReduceJoin案例分析
文章目录 (113)ReduceJoin案例需求分析(114)ReduceJoin案例代码实操 - TableBean(115)ReduceJoin案例代码实操 - TableMapper(116)ReduceJoin案例代码实操 - Reducer及Driver参考文献…...
BAT026:删除当前目录及子目录下的空文件夹
引言:编写批处理程序,实现批量删除当前目录及子目录下的空文件夹。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【编辑…...
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技术可行性:…...
Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk
本文是LLM系列文章,针对《Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk》的翻译。 语言模型能制造乐趣吗?中国滑稽相声个案研究 摘要1 引言2 问题定义3 数据集4 使用自动评估生成基准5 人工评估6 讨论7 结论与未来工作 摘要 语言是…...
阿里云云服务器实例使用教学
目录 云服务器免费试用 详细步骤 Xshell 远程连接 云服务器免费试用 阿里云云服务器网址:阿里云免费试用 - 阿里云 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)…...
promisify 是 Node.js 标准库 util 模块中的一个函数
promisify 是 Node.js 标准库 util 模块中的一个函数。它用于将遵循 Node.js 回调风格的函数转换为返回 Promise 的函数。这使得你可以使用 async/await 语法来等待异步操作完成,从而让异步代码看起来更像同步代码。 在 Node.js 的回调风格中,函数通常接…...
ArcGIS在VUE框架中的构建思想
项目快要上线了,出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面,把关于地图方面的代码给优化一下。试运行的时候,客户说控制台有很多飘红的报错,他们很在意,虽然很不情愿,但能改的就给改了吧…...
【Overload游戏引擎细节分析】视图投影矩阵计算与摄像机
本文只罗列公式,不做具体的推导。 OpenGL本身没有摄像机(Camera)的概念,但我们为了产品上的需求与编程上的方便,一般会抽象一个摄像机组件。摄像机类似于人眼,可以建立一个本地坐标系。相机的位置是坐标原点,摄像机的朝…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
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…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
