【毕业设计】前后端分离——实现登录注册功能

django+vue前后端分离 实现 登录 实践记载 login 登录 axios 阅读详情

🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。

前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:个人记账分析系统 ,专门记录制作过程,每天进步一点点~

想看往期历史文章,可以浏览此博文: 历史文章目录,后续所有文章发布都会同步更新此博文~

人生苦短,我用python

后端部分

下文出现的 payment 是我创建的 app ,使用 django-admin startapp payment 创建,此项目设计为前后端完全分离,通过 {'code': 0, 'msg': 'str', 'data': object} 传递信息,data 可以省略。

登录视图

文件 payment\views.py 。

def login_(request):
    if request.method == 'POST':
        username = loads(request.body)['username']
        password = loads(request.body)['password']
        user = User.objects.filter(username=username) or User.objects.filter(email=username)
        if user:
            user = authenticate(username=user[0].username, password=password)
            if user:
                if user.is_active:
                    login(request, user)
                    Setting.objects.create(last_ip=request.META['REMOTE_ADDR'], owner=user)
                    request.session['uname'] = user.username
                    request.session['admin'] = user.is_superuser
                    response = JsonResponse({'code': 0, 'msg': '登录成功!'})
                    response.set_cookie('uname', user.username)
                    return response
                return JsonResponse({'code': -1, 'msg': '用户状态不可用!'})
            return JsonResponse({'code': -2, 'msg': '用户名密码错误!'})
        return JsonResponse({'code': -3, 'msg': '用户名不存在!'})
    return JsonResponse({'code': 1, 'msg': '请求方法只能是POST方法!'})

注册视图

文件 payment\views.py 。

def register(request):
    if request.method == 'POST':
        username = loads(request.body)['username']
        password = loads(request.body)['password']
        email = loads(request.body)['email']
        yzm = loads(request.body)['yzm']
        if User.objects.filter(username=username):
            return JsonResponse({'code': -1, 'msg': '用户名已存在!'})
        if request.session.get('email') != email or request.session.get('yzm') != yzm:
            return JsonResponse({'code': -2, 'msg': '邮箱验证码错误!'})
        user = User.objects.create_user(username=username, password=password, email=email)
        if user.username:
            return JsonResponse({'code': 0, 'msg': '注册成功!'})
        return JsonResponse({'code': -3, 'msg': '注册失败!请重新尝试注册!'})
    return JsonResponse({'code': 1, 'msg': '请求方法只能是POST方法!'})

图形验证码视图

文件 PersonalAccountWeb\views.py 。
图形验证码就由前端校验,简单通过 base64 加密验证码字符串。

def verification_code(request):
    image = ImageCaptcha()
    # 获得随机生成的验证码
    captcha = ''.join(sample(list('abcdefghijklmnopqrstuvwxyz'), 4))
    print("生成的验证码为:", captcha)
    response = HttpResponse(image.generate(captcha), content_type='image/png')
    # response['Access-Control-Allow-Origin'] = '*'
    # response['Access-Control-Allow-Credentials'] = 'true'
    response.set_cookie('yzm', b64encode(captcha.encode()).decode(), max_age=60 * 5)
    return response

邮件验证码视图

文件 PersonalAccountWeb\views.py 。
邮件验证码就由后端校验,通过 session 保存,后续会用作异地登录验证(现在还没设计)。

def send_email_(to_address, header, html):
    smtp_server = settings.EMAIL_HOST
    msg = MIMEText(html, 'html', 'utf-8')
    msg['From'] = Header(settings.EMAIL_HOST_USER)
    msg['To'] = Header(to_address)
    msg['Subject'] = Header(header)
    server = smtplib.SMTP_SSL(smtp_server)
    server.connect(smtp_server, settings.EMAIL_PORT)
    server.login(settings.EMAIL_HOST_USER, settings.EMAIL_HOST_PASSWORD)  # python_gjj
    server.sendmail(settings.EMAIL_HOST_USER, to_address, msg.as_string())
    server.quit()


def send_email(request):
    if request.method == 'POST':
        to_address = loads(request.body)['email']
        if User.objects.filter(email=to_address):
            response = JsonResponse({'code': -1, 'msg': '邮箱已被注册!'})
        else:
            captcha = ''.join(sample(list('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 6))
            print("生成的邮件验证码为:", captcha)
            send_email_(to_address=to_address, header='邮箱验证码', html=f"""
            <h1>【个人记账分析系统】</h1>
            <p>您好,您正在注册我们的网站:<span style='color: red'><a href="http://{settings.CSRF_TRUSTED_ORIGINS[0]}">个人记账分析系统</a></span></p>
            <p>您本次注册的验证码是:<span style='color: blue'>{captcha}</span></p>
            <p>如果您<span style='color: red'>没有注册</span>,请<span style='color: red'>忽略并删除</span>本邮件!</p>
            <p>感谢您对本系统的信赖!</p>
            """)
            request.session['yzm'] = captcha
            request.session['email'] = to_address
            response = JsonResponse({'code': 0, 'msg': '邮箱验证码发送成功!请注意查收!'})
    else:
        response = JsonResponse({'code': 1, 'msg': '请求方法只能是POST方法!'})
    response.set_cookie('last', str(time()), max_age=60)
    return response

服务器时间视图

文件 PersonalAccountWeb\api.py 。
安装了 ninja 都没用过,只能在这里用了。

from time import time
from ninja import NinjaAPI

api = NinjaAPI()


@api.get('/server_timestamp')
def hello(request):
    return time()

路由部分

文件 PersonalAccountWeb\urls.py 。

from django.contrib import admin
from django.urls import path, include
from .api import api
from .views import verification_code, send_email

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', api.urls),
    path('yzm/', verification_code),
    path('email/', send_email),
    path('', include('payment.urls'))
]

文件 payment\urls.py 。

from django.urls import path
from .views import info, login_, logout_, register, check_online

urlpatterns = [
    path('info/', info),
    path('login/', login_),
    path('logout/',logout_),
    path('register/', register),
    path('check_online/', check_online)
]

前端部分

登录注册的UI参考了一个前端登录模板,略做修改就用在了我的项目上,前端登录模板 (点击即可跳转到下载页面)。

定义的路由

暂时这么多,后续可能会添加。

import { createApp } from 'vue'
import App from './App.vue'
import { createRouter, createWebHistory } from 'vue-router'
import C from './export_components.js'

const router = createRouter({
	history: createWebHistory(),
	routes: [
		{
			path: '/',
			name: '跳转至首页',
			redirect: '/Home',
		},
		{
			path: '/Home',
			name: '首页',
			component: C.Home,
			children: [
				{
					path: 'Login',
					name: '登录',
					component: C.Login
				},
				{
					path: 'Register',
					name: '注册',
					component: C.Register
				}
			]
		},
		{
			path: '/Backstage',
			name: '后台',
			component: C.Backstage,
			children: [
				{
					path: 'Settings',
					name: '设置',
					component: C.Settings
				},
				{
					path: 'DataEntry',
					name: '数据录入',
					component: C.DataEntry
				},
				{
					path: 'DataShow',
					name: '数据展示',
					component: C.DataShow,
					children: [
						{
							path: ':username',
							name: '用户展示',
							component: C.DataShow
						}
					]
				},
				{
					path: 'InStationMail',
					name: '站内邮件',
					component: C.InStationMail
				}
			]
		},
		{
			path: '/:pathMatch(.*)*',
			name: '404',
			// redirect: '/404',
			component: C.NotFound
		},
		// {
		// 	path: '/404',
		// 	name: '404',
		// 	component: NotFound
		// }
	]
})

createApp(App).use(router).mount('#app')

文件 App.vue

<script setup>
</script>

<template>
	<router-view></router-view>
</template>

<style scoped>
</style>

文件 Home.vue

主要保留了登录注册页的背景。

<template>
	<div class="main">
		<h1>个人记账分析系统</h1>
		<div class="login box">
			<router-view></router-view>
		</div>
		<div class="copywrite">
			<p>Copyright &copy; 2023</p>
		</div>
	</div>
</template>

<script setup>
	import { getCurrentInstance } from 'vue'
	document.title = '个人记账分析系统'
	const _this = getCurrentInstance().appContext.config.globalProperties // vue3获取当前this
	if (_this.$route.query.next) {
		_this.$router.push({ path: '/Home/Login', query: _this.$route.query})
	} else {
		_this.$router.push({ path: '/Home/Login', query: { next: '/Backstage' }})
	}
</script>

<style scoped>
	.main {
		font-family: 'Catamaran', sans-serif;
		font-size: 100%;
		background: linear-gradient(to left top, #051937, #004d7a, #008793, #00bf72, #a8eb12);
		background-size: cover;
		-webkit-background-size: cover;
		-moz-background-size: cover;
		-o-background-size: cover;
		-ms-background-size: cover;
		min-height: 100vh;
		text-align: center;
	}

	.login {
		display: -webkit-flex;
		display: -webkit-box;
		display: -moz-flex;
		display: -moz-box;
		display: -ms-flexbox;
		display: flex;
		justify-content: center;
		align-items: center;
		-webkit-box-pack: center;
		-moz-box-pack: center;
		-ms-flex-pack: center;
		-webkit-justify-content: center;
		justify-content: center;
	}

	h1 {
		font-size: 2.8em;
		font-weight: 300;
		text-transform: capitalize;
		color: #fff;
		text-shadow: 1px 1px 1px #000;
		letter-spacing: 2px;
		margin: 1.2em 1vw;
		margin-top: 0px;
		padding-top: 2.4em;
		text-align: center;
		font-family: 'Catamaran', sans-serif;
	}

	.copywrite {
		margin: 4em 0 2em;
	}

	.copywrite p {
		color: #fff;
		font-size: 14.5px;
		letter-spacing: 1.5px;
		line-height: 1.8;
		margin: 0 3vw;
	}

	.copywrite p a {
		color: #fff;
		transition: 0.5s all ease;
		-webkit-transition: 0.5s all ease;
		-moz-transition: 0.5s all ease;
		-o-transition: 0.5s all ease;
		-ms-transition: 0.5s all ease;
	}

	.copywrite p a:hover {
		color: #fff;
		text-decoration: underline;
	}

	@media(max-width:1024px) {
		h1 {
			font-size: 4.5vw;
		}
	}

	@media(max-width:800px) {
		h1 {
			font-size: 5vw;
		}
	}

	@media(max-width:480px) {
		h1 {
			font-size: 2.3em;
		}
	}

	@media(max-width:568px) {
		.login {
			flex-direction: column;
		}
	}

	@media(max-width:440px) {
		h1 {
			font-size: 2.1em;
		}
	}

	@media(max-width:320px) {
		h1 {
			font-size: 1.8em;
		}
	}
</style>

文件 Login.vue

<template>
	<form action="http://127.0.0.1:8000/login/" method="post" @submit.prevent="login">
		<div class="agile-field-txt">
			<input type="text" name="username" placeholder="用户名/邮箱" required="" />
		</div>
		<div class="agile-field-txt">
			<input :type="pwd == '隐' ? 'text' : 'password'" name="password" placeholder="密码" required="" />
			<a @click="pwd = pwd == '隐' ? '显' : '隐'">{{pwd}}</a>
		</div>
		<div class="yzm-field-txt">
			<input type="text" id="yzm" name="yzm" placeholder="验证码" required="" />
			<img :src="yzm_url" @click="yzm_url = 'http://127.0.0.1:8000/yzm/?time=' + new Date().getTime()"/>
		</div>
		<div class="bot">
			<input type="submit" value="LOGIN" @click="check_yzm">
		</div>
		<div class="agile-field-txt">
			<router-link to="/Home/Register?next=/Home/Login">还没有账户?点击注册</router-link>
		</div>
	</form>
</template>

<script setup>
	import { ref, getCurrentInstance } from 'vue'
	document.title = '个人记账分析系统'
	const pwd = ref('显')
	const yzm_url = ref('http://127.0.0.1:8000/yzm/')
	const _this = getCurrentInstance().appContext.config.globalProperties // vue3获取当前this
	const check_yzm = (event) => {
		const yzm = document.getElementById('yzm')
		var cookies = document.cookie.split("; ")
		for (var index in cookies) {
			if (cookies[index].startsWith('yzm=')) {
				if (btoa(yzm.value) == cookies[index].replace('yzm="', '').replace('"', '')) {
					return
				}
			}
		}
		yzm.value = ''
		yzm_url.value = 'http://127.0.0.1:8000/yzm/?time=' + new Date().getTime()
	}
	const login = (event) => {
		fetch('http://127.0.0.1:8000/login/', {
			method: "POST",
			credentials: "include",
			headers: {
				// 注意这里不要设置 Content-Type 请求头,否则会导致错误
			},
			Origin: window.location.protocol + "//" + window.location.host,
			// fetch 的 body 发送 data
			body: JSON.stringify({
				username: event.target.username.value,
				password: event.target.password.value
			})
		}).then(res => res.json()).then(json => {
			console.log(json.msg)
			if (!json.code) {
				_this.$router.push({ path: _this.$route.query.next || '/Backstage'})
			} else {
				alert(json.msg)
			}
		})
	}
</script>

<style scoped>
	a {
		top: 12px;
		z-index: 1;
		right: 10px;
		color: yellow;
		cursor: pointer;
		position: absolute;
		text-decoration: none;
	}

	.bot {
		margin-top: 1em;
		width: 100%;
	}

	form {
		max-width: 500px;
		margin: 0 5vw;
		padding: 3.5vw;
		border-width: 5px 0;
		box-sizing: border-box;
		display: flex;
		display: -webkit-flex;
		flex-wrap: wrap;
		background: rgba(252, 254, 255, 0.11);
	}

	.agile-field-txt {
		position: relative;
		flex-basis: 100%;
		-webkit-flex-basis: 100%;
		margin-bottom: 1.5em;
	}

	input[type="text"],
	input[type="password"] {
		width: 100%;
		color: #fff;
		outline: none;
		background: rgba(0, 0, 0, 0.32);
		font-size: 17px;
		letter-spacing: 0.5px;
		padding: 12px;
		box-sizing: border-box;
		border: none;
		-webkit-appearance: none;
		font-family: 'Catamaran', sans-serif;
	}

	::-moz-placeholder {
		/* Undefined */
		color: #eee;
	}

	::-webkit-input-placeholder {
		/* Firefox */
		color: #eee;
	}

	:-ms-input-placeholder {
		/* Chrome */
		color: #eee;
	}

	input[type=submit] {
		color: #ffffff;
		font-weight: 100;
		width: 100%;
		padding: 0.4em 0;
		font-size: 1em;
		font-weight: 400;
		letter-spacing: 2px;
		cursor: pointer;
		border: none;
		outline: none;
		background: #000;
		font-family: 'Catamaran', sans-serif;
		transition: 0.5s all ease;
		-webkit-transition: 0.5s all ease;
		-moz-transition: 0.5s all ease;
		-o-transition: 0.5s all ease;
		-ms-transition: 0.5s all ease;
	}

	input[type=submit]:hover {
		color: #fff;
		box-shadow: 0 20px 5px -10px rgba(0, 0, 0, 0.4);
		transform: translateY(5px);
	}
	
	.yzm-field-txt {
		float: left;
		width: 100%;
		height: 60px;
		position: relative;
	}
	
	.yzm-field-txt img {
		float: left;
	}
	
	.yzm-field-txt input {
		float: left;
		margin: 7px 0;
		width: calc(100% - 160px);
	}
</style>

文件 Register.vue

<template>
	<form action="http://127.0.0.1:8000/register/" method="post" @submit.prevent="register">
		<div class="agile-field-txt">
			<input type="text" name="username" placeholder="用户名" required="" />
		</div>
		<div class="agile-field-txt">
			<input :type="pwd == '隐' ? 'text' : 'password'" name="password" placeholder="密码" required="" />
			<a @click="pwd = pwd == '隐' ? '显' : '隐'">{{pwd}}</a>
		</div>
		<div class="agile-field-txt">
			<input type="email" name="email" placeholder="邮箱" required="" v-model="email" />
		</div>
		<div class="yzm-field-txt">
			<input type="text" name="yzm" placeholder="邮箱验证码" required="" />
			<input type="button" id="verification" value="邮箱验证码" @click="send_email" />
		</div>
		<div class="bot">
			<input type="submit" value="REGISTER">
		</div>
		<div class="agile-field-txt">
			<router-link to="/Home/Login?next=/Backstage">已有账户?点击登录</router-link>
		</div>
	</form>
</template>

<script setup>
	import { ref, getCurrentInstance } from 'vue'
	document.title = '个人记账分析系统'
	const _this = getCurrentInstance().appContext.config.globalProperties // vue3获取当前this
	const pwd = ref('显')
	const email = ref('')
	const timer = ref(null)
	const get_server_time = () => {
		var time = new Date().getTime() / 1000
		fetch('http://127.0.0.1:8000/api/server_timestamp', {
			method: "GET",
			credentials: "include",
			headers: {
				// 注意这里不要设置 Content-Type 请求头,否则会导致错误
			},
			Origin: window.location.protocol + "//" + window.location.host,
		}).then(res => {time = parseFloat(res)})
		return time
	}
	const calc_time = () => {
		var verification = document.getElementById('verification')
		var cookies = document.cookie.split("; ")
		for (var index in cookies) {
			if (cookies[index].startsWith('last=')) {
				var last = parseFloat(cookies[index].replace('last=', ''))
				var now = get_server_time()
				if (last + 59 > now) {
					verification.value = `重新发送(${parseInt(last + 59 - now)})`
					timer.value = setTimeout(calc_time, 800)
				} else {
					verification.value = '邮箱验证码'
					verification.disabled = false
					clearTimeout(timer.value)
				}
				return
			}
		}
	}
	const send_email = () => {
		var yzm = document.getElementById('verification')
		if (!email.value) {
			alert('请输入邮箱!')
			return
		}
		fetch('http://127.0.0.1:8000/email/', {
			method: "POST",
			credentials: "include",
			headers: {
				// 注意这里不要设置 Content-Type 请求头,否则会导致错误
			},
			Origin: window.location.protocol + "//" + window.location.host,
			// fetch 的 body 发送 data
			body: JSON.stringify({
				email: email.value
			})
		}).then(res => res.json()).then(json => {
			alert(json.msg)
			if (json.code >= 0) {
				verification.disabled = true
				timer.value = setTimeout(calc_time, 800)
			}
		})
	}
	const register = (event) => {
		if (!/^\w{6,18}$/.test(event.target.username.value)) {
			alert('用户名应该是长度为 6-18 的数字、大小写字母、下划线的组合!')
			return
		}
		if (!/^\w{6,18}$/.test(event.target.password.value)) {
			alert('密码应该是长度为 6-18 的数字、大小写字母、下划线的组合!')
			return
		}
		fetch('http://127.0.0.1:8000/register/', {
			method: "POST",
			credentials: "include",
			headers: {
				// 注意这里不要设置 Content-Type 请求头,否则会导致错误
			},
			Origin: window.location.protocol + "//" + window.location.host,
			// fetch 的 body 发送 data
			body: JSON.stringify({
				username: event.target.username.value,
				password: event.target.password.value,
				email: email.value,
				yzm: event.target.yzm.value
			})
		}).then(res => res.json()).then(json => {
			console.log(json.msg)
			if (!json.code) {
				_this.$router.push({ path: _this.$route.query.next || '/Home/Login'})
			} else {
				alert(json.msg)
			}
		})
	}
</script>

<style scoped>
	a {
		top: 12px;
		z-index: 1;
		right: 10px;
		color: yellow;
		cursor: pointer;
		position: absolute;
		text-decoration: none;
	}

	.bot {
		margin-top: 1em;
		width: 100%;
	}

	form {
		max-width: 500px;
		margin: 0 5vw;
		padding: 3.5vw;
		border-width: 5px 0;
		box-sizing: border-box;
		display: flex;
		display: -webkit-flex;
		flex-wrap: wrap;
		background: rgba(252, 254, 255, 0.11);
	}

	.agile-field-txt {
		position: relative;
		flex-basis: 100%;
		-webkit-flex-basis: 100%;
		margin-bottom: 1.5em;
	}

	input[type="text"],
	input[type="email"],
	input[type="password"] {
		width: 100%;
		color: #fff;
		outline: none;
		background: rgba(0, 0, 0, 0.32);
		font-size: 17px;
		letter-spacing: 0.5px;
		padding: 12px;
		box-sizing: border-box;
		border: none;
		-webkit-appearance: none;
		font-family: 'Catamaran', sans-serif;
	}

	::-moz-placeholder {
		/* Undefined */
		color: #eee;
	}

	::-webkit-input-placeholder {
		/* Firefox */
		color: #eee;
	}

	:-ms-input-placeholder {
		/* Chrome */
		color: #eee;
	}

	input[type=button] {
		color: yellow;
		width: 160px;
		height: 46px;
		padding: 0.4em 0;
		font-size: 1em;
		font-weight: 400;
		letter-spacing: 2px;
		cursor: pointer;
		border: 1px black solid;
		outline: none;
		background: rgba(0, 0, 0, 0);
	}

	input[type=submit] {
		color: #ffffff;
		font-weight: 100;
		width: 100%;
		padding: 0.4em 0;
		font-size: 1em;
		font-weight: 400;
		letter-spacing: 2px;
		cursor: pointer;
		border: none;
		outline: none;
		background: #000;
		font-family: 'Catamaran', sans-serif;
		transition: 0.5s all ease;
		-webkit-transition: 0.5s all ease;
		-moz-transition: 0.5s all ease;
		-o-transition: 0.5s all ease;
		-ms-transition: 0.5s all ease;
	}

	input[type=submit]:hover {
		color: #fff;
		box-shadow: 0 20px 5px -10px rgba(0, 0, 0, 0.4);
		transform: translateY(5px);
	}

	.yzm-field-txt {
		float: left;
		width: 100%;
		position: relative;
	}

	.yzm-field-txt input[type=text] {
		float: left;
		width: calc(100% - 160px);
	}
</style>

效果

在这里插入图片描述
在这里插入图片描述

总结

是不是看着登录注册界面简洁耐看呢~

Django前后端分离实现登录验证码功能 Django前后端分离实现登录验证码功能 当下最流行最热门的开发方式当属前后端分离开发,分工也更加明确与专注,前端也是越来越难,几天不学习就跟不上节奏,一个月不学习可以好不夸张的说,你已经不适合这个行业了。 Django在做前后端分离开发的时候有一个特别强大的第三方包Django REST framework,用于构建Web API,强大并且灵活! 一、安装并使用Django REST framework! 使用要求: REST 框架需要以下内容: Python(3.5、3.6、3.7、3.8、3.9) 阅读详情

相关推荐

登录注册前后端分离及Vuex使用

uni-easyinput v-model="valiFormData.username" placeholder="请输入用户名" />password: this.valiFormData.password, //密码。// 判断语句,如果输入的用户名和密码正确,就跳转到我的页面。// 当表单校验通过的时候,就调用登录的接口,实现登录的功能。msg: "密码错误"

2303_78819023的博客 1552

梳理总结SpringBoot+Vue前后端分离的简单实现

SpringBoot+Vue前后端分离的简单实现

fuhuitao的博客 7396

毕设:基于SpringBoot+Vue 实现云音乐(前后端分离)

文章目录一.简介2.项目介绍二.功能2.功能介绍三.核心技术1.系统架构图2.技术选型五.运行3.截图前端界面后台管理界面总结1.完整工程2.其他 一.简介 2.项目介绍 本系统基于Springboot和Vue实现的前后端分离的一个在线音乐网站系统,系统功能完整,页面简洁大方,是一个非常优秀的JAVA系统,比较适合做毕业设计使用。 二.功能 2.功能介绍 音乐播放 用户登录注册 用户信息编辑、头像修改 歌曲、歌单搜索 歌单打分,歌单、歌曲评论 歌单列表、歌手列表分页显示 歌词同步显示 音乐收藏、下载、拖动

GIS摆渡人 1817

【django restframework】 后端接口开发 开发与用户相关的一组接口 登录注册与用户信息查询修改

Django DRF 前后端分离 后端接口开发 开发与用户相关的一组接口 登录、注册、用户信息增删改查

在红尘中争渡 3185

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1945

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 407

基于SpringBoot+Vue电影院选票系统设计和实现(源码+LW+调试文档+讲解等)

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,电影院选票系统当然不能排除在外。电影院选票系统是在实际应用和软件工程的开发原理之上,运用java语言,前台Vue框架以及后台SpringBoot框架进行开发。首先要进行需求分析,分析出电影院选票系统的主要功能,然后设计了系统结构。整体设计包括系统的功能、系统总体结构、系统数据结构和对系统安全性进行设计;

java全包开发,java辅导 566

白炽灯寿命工程解析:从钨丝蒸发到电压控制的可靠性设计

白炽灯作为一种经典的电光源,其工作原理基于电流通过钨丝产生热辐射发光。在高温下,钨丝会持续蒸发导致灯丝逐渐变细、电阻增大,这是影响其寿命的核心物理机制。从工程角度看,白炽灯的可靠性设计涉及材料科学、热力学和电路设计的交叉,技术价值在于通过理解其失效原理,可以在成本与性能间取得最佳平衡。在实际应用中,电压波动、开关浪涌电流和机械振动是主要寿命杀手,尤其在工业控制、仪器仪表和特定照明场景中,合理的设计能大幅提升系统稳定性。本文深入探讨了钨蒸发、热应力等关键因素,并结合浪涌抑制和降压设计等实战技巧,为工程师提供了

weixin_28684655的博客 570

基于Springboot+Vue实现前后端分离商城管理系统

商品管理:可以实现商品添加、编辑、删除、下架、查询等,另可以对商品分类、品牌、规则、采购信息进行管理,以及对供应商进行管理,不再一一展示。亮点技术:短信发送验证码、阿里云OSS云存储商品图片、邮箱自动发邮件验证操作权限,Shiro权限管理,数据加密处理,支付宝沙箱技术应用,Redis数据缓存处理。亮点技术:短信发送验证码、阿里云OSS云存储商品图片、邮箱自动发邮件验证操作权限,Shiro权限管理,数据加密处理,支付宝沙箱技术应用,Redis数据缓存处理。里边的老师也很敬业,可以进行自己的薄弱点进行学习。

weixin_42182741的博客 1663

MODBUS通讯不求人:手把手教你用三菱FX2N控制士林变频器

本文详细介绍了如何使用三菱FX2N PLC通过MODBUS协议控制士林变频器,涵盖硬件连接、参数配置、程序设计及通讯优化等关键步骤。特别针对没有内置MODBUS函数块的老款PLC,提供了CRC校验和稳定数据交换的实用解决方案,帮助工程师快速实现工业自动化设备的高效通讯。

v4w5x6的博客 226

【HCIP-AI 进阶之路(一)】零成本白嫖算力,7天速通华为人工智能资深开发者认证

《HCIP-AIEIDeveloper认证备考指南》摘要:本文深度解析华为HCIP-AI(H13-331)认证考试要点,涵盖考试大纲、评分标准及备考策略。重点剖析昇腾AI全栈架构,包括达芬奇架构核心计算单元(Cube/Vector/Scalar Unit)和四大层级关系(芯片-CANN-框架-应用)。针对无硬件资源的开发者,提供MindSpore CPU版、ModelArts免费算力和沙箱实验室三种零成本实践方案。文章强调该认证对国企/华为生态企业求职者的价值,并指出多选题是主要失分点。下篇将聚焦计算机视觉

2301_82049134的博客 1184

Java毕业设计作品:江苏地区特产网上商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 992

医学影像处理实战:用SimpleITK将CT数据重采样到统一尺寸(附完整代码)

本文针对医学影像分析中多源CT数据尺寸不一致导致深度学习模型训练失败的问题,提供了基于SimpleITK的实战解决方案。通过深入解析图像尺寸与间距的关系,详细阐述了如何通过调整体素间距进行重采样,而非简单补零,从而在保持图像物理尺寸不变的前提下,将数据统一到固定尺寸,确保输入网络的3D数据空间对齐且解剖信息准确。

weixin_29062671的博客 270

Java毕业设计作品:山东地方特产商城购物系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2411

学习笔记7--激光雷达标定

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》,笔者不是自动驾驶领域的专家,只是一个在探索自动驾驶路上的小白,此系列丛书尚未阅读完,也是边阅读边总结边思考,欢迎各位小伙伴,各位大牛们在评论区给出建议,帮笔者这个小白挑出错误,谢谢! 此专栏是关于《自动驾驶汽车环境感知》书籍的笔记。 2.激光雷达标定 2.1 概述 激光雷达内参标定:内部激光发射器坐标系与雷达本

FUXI_Willard 8027

40、基于指令的GPU编程:OpenACC与OpenMP的深入解析

本文深入解析了两种基于指令的GPU编程模型——OpenACC和OpenMP。从编程复杂度、数据处理方式和性能表现等多个方面对两者进行了对比分析,并结合实际应用场景提供了选择建议。通过详细的代码示例和性能测试结果,帮助开发者更好地理解和应用这两种编程模型,以充分发挥GPU的并行计算能力。

q5r6s7的博客 134

Java毕业设计作品(07):基于thymeleaf前后端分离 电影院在线选座购票系统设计与实现

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2319

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java毕业设计作品:贵州贵阳景点购票系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 655

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java毕业设计作品:山西地方特产商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2192

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java毕业设计作品:福建地方特产网上商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2142

Java毕业设计作品:黑龙江哈尔滨城市文化展示系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2626

基于Java+SpringBoot+vue前后端分离的音乐网站与分享平台设计实现

音乐网站与分享平台的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心用户管理音乐资讯管理、音乐翻唱管理、在线听歌管理、留言板管理、系统管理用户首页、音乐资讯、音乐翻唱、在线听歌、留言反馈、个人中心、后台管理、客服等功能。由于本网站的功能模块设计比较全面,所以使得整个音乐网站与分享平台信息管理的过程得以实现。本系统的使用可以实现本音乐网站与分享平台管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。音乐网站与分享平台。

shujuboke的博客 943

Java毕业设计作品:海南地方特产商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2421

Java毕业设计作品:新疆乌鲁木齐景点售票系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 810

Java毕业设计作品:天津地方特产网上商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2713

Java毕业设计作品:重庆特产网上商城系统设计与实现(基于thymeleaf前后端分离 )

黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,优快云博客专家,在线教育专家,优快云钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在优快云网站查询黄菊华老师。

杭州.黄老师 2240
上一篇: 【毕业设计】前后端分离——解决cookies跨域
下一篇: 【猿人学WEB题目专解】猿人学第1题
user_from_future
博客等级 码龄5年 4066粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值