Uni-App-03

news2024/10/27 23:48:13

登录功能开发

实现POST提交

HTTP协议规定请求消息内容类型(Content-Type)有哪些?—— 只有四种

text/plain 没有编码的普通数据

application/x-www-form-urlencoded 编码后的普通数据

multipart/form-data 请求主体中包含文件上传域

application/json 请求主体是 JSON 格式字符串

HTTP协议规定响应消息内容类型(Content-Type)有哪些?—— 有很多种

text/html、

text/plain、

text/css、

application/javascript、

image/jpeg、

application/mpeg3、

application/json、

在这里插入图片描述

<script>
	export default {
		data(){
			return {
				statusBarHeight: 0,		//系统状态栏高度
				hidePwd: true,			//是否隐藏密码
				phone: "13501234567",	//用户输入的登录手机号
				pwd:"123456",			//用户输入的登录密码
			}
		},
		//生命周期方法 —— 页面挂载完成
		onLoad(){    //此处此方法类似于mounted()
			//console.log('login组件挂载完成')
			//获取系统信息,读取其中的“状态栏高度”
			let {statusBarHeight} = uni.getSystemInfoSync()
			// console.log('屏幕高度:', screenHeight);
			this.statusBarHeight = statusBarHeight
		},
		methods: {
			async doLogin(){
				//console.log('当前输入:',this.phone, this.pwd)
				//1.验证手机号是否合法,不合法就弹出提示框,退出执行
				if(!/^1[3-9]\d{9}$/.test(this.phone)){
					uni.showToast({
						title: '手机号非法',		//提示标题
						icon: 'none',			//图标
						duration: 3000			//持续时长 
					})
					return
				}
				//2.验证密码是否合法,不合法就弹出提示框,退出执行
				if(this.pwd.length < 6){
					uni.showToast({
						title:'密码格式非法',
						icon: 'none',
						duration: 3000
					})
					return 
				}
				//3.把手机号/密码提交给服务器端数据API,进行登录验证
				/**********使用uni.request()发起POST请求************/
				let url = "https://www.codeboy.com/zhsqapi/user/login"
				let [err, res] = await uni.request({ 
					url,
					method: 'POST',
					//header: { 'Content-Type': 'application/json'},
					header: { }, //请求内容类型默认就是JSON格式
					//data: `{"phone":"${this.phone}", "pwd":"${this.pwd}"}`
					//JSON系列化:把普通的JS对象转换为JSON格式的字符串
					//data: JSON.stringify( {phone:this.phone, pwd:this.pwd})
					//uni.request方法会自动根据请求内容类型,把数据转换为需要的格式
					data: {phone:this.phone, pwd:this.pwd}
				})
				if(err){
					console.log('执行失败:', err);
				}else {
					console.log('异步请求成功:', res);
				}
				//4.登录成功,提示“欢迎回来”,跳转到首页
			},
		}
	}
</script>

实现页面跳转

吐司对话框—— 用于简单的提醒,非重要事件的提示

​ uni.showToast( {title, icon, duration} )

模态对话框 —— 用于严重的提示,甚至必须作出选择的提示

​ uni.showModal({title, content })

加载中对话框—— 提示操作正在进行中

​ uni.showLoading( ) / uni.hideLoading()

动作清单对话框—— 让用户选择要执行的动作

​ uni.showActionSheet( )

导航跳转:、 uni.navigateTo( )

导航返回跳转:、 uni.navigateBack( )

重定向跳转:、 uni.redirectTo( )

切换页签跳转:、 uni.switchTab ( )

重启跳转:、 uni.reLaunch( )

<script>
	export default {
		data(){
			return {
				statusBarHeight: 0,		//系统状态栏高度
				hidePwd: true,			//是否隐藏密码
				phone: "13501234567",	//用户输入的登录手机号
				pwd:"123456",			//用户输入的登录密码
			}
		},
		//生命周期方法 —— 页面挂载完成
		onLoad(){    //此处此方法类似于mounted()
			//console.log('login组件挂载完成')
			//获取系统信息,读取其中的“状态栏高度”
			let {statusBarHeight} = uni.getSystemInfoSync()
			// console.log('屏幕高度:', screenHeight);
			this.statusBarHeight = statusBarHeight
		},
		methods: {
			async doLogin(){
				//console.log('当前输入:',this.phone, this.pwd)
				//1.验证手机号是否合法,不合法就弹出提示框,退出执行
				if(!/^1[3-9]\d{9}$/.test(this.phone)){
					uni.showToast({
						title: '手机号非法',		//提示标题
						icon: 'none',			//图标
						duration: 3000			//持续时长 
					})
					return
				}
				//2.验证密码是否合法,不合法就弹出提示框,退出执行
				if(this.pwd.length < 6){
					uni.showToast({
						title:'密码格式非法',
						icon: 'none',
						duration: 3000
					})
					return 
				}
				//3.把手机号/密码提交给服务器端数据API,进行登录验证
				/**********使用uni.request()发起POST请求************/
				let url = "https://www.codeboy.com/zhsqapi/user/login"
				let [err, res] = await uni.request({ 
					url,
					method: 'POST',
					//header: { 'Content-Type': 'application/json'},
					header: { }, //请求内容类型默认就是JSON格式
					//data: `{"phone":"${this.phone}", "pwd":"${this.pwd}"}`
					//JSON系列化:把普通的JS对象转换为JSON格式的字符串
					//data: JSON.stringify( {phone:this.phone, pwd:this.pwd})
					//uni.request方法会自动根据请求内容类型,把数据转换为需要的格式
					data: {phone:this.phone, pwd:this.pwd}
				})
				if(err){
					console.log('执行失败:', err);
				}else {
					console.log('异步请求成功:', res);
				}
				//4.登录成功,提示“欢迎回来”,跳转到首页
				//跳转到“首页” —— 切换页签
                uni.showToast({
                        title: '欢迎回来',
                        icon: 'none',			//图标:不要
                        duration: 3000,			//持续时间:3s
                        complete(){				//对话框成功关闭
                        //跳转到“首页” —— 切换页签
                        uni.switchTab({
                            url:'/pages/index/index'
                        })
                    }
                })
			},
		}
	}
</script>

Ajax集中管理

因为ajax访问在应用开发中频繁使用、代码复杂,且接口地址、数据结构等可能会发生变化

所以将ajax相关代码提取为方法,统一保存管理在外部文件中

创建service/index.js

/****对服务器端数据API进行访问二次封装****/

/**
 * 服务器端基础地址
 */
export let base = 'https://www.codeboy.com/zhsqapi/'

/**
 * API-1.2、用户登录
 * 接口地址:user/login
 * 请求方式:POST
 * 请求主体格式:application/json   					
 * 	名称		必填		类型		说明
 *	phone	是		string	手机号
 *	pwd		是		string	密码
 */
export let userLogin = async (phone, pwd)=>{
	//1.准备请求URL
	let url = base + 'user/login'
	//console.log(url)
	//2.显示“加载中”提示框
	uni.showLoading({
		title: '用户登录中'
	})
	//3.发起异步请求消息
	let [err, res] = await uni.request({
		url,
		method: 'POST',
		data: {phone, pwd}
	})
	//4.隐藏“加载中”提示框
	uni.hideLoading()
	//5.返回响应消息主体
	return res.data
}
<script>
	import { userLogin } from '../../service/'
	export default {
		data(){
			return {
				statusBarHeight: 0,		//系统状态栏高度
				hidePwd: true,			//是否隐藏密码
				phone: "13501234567",	//用户输入的登录手机号
				pwd:"123456",			//用户输入的登录密码
			}
		},
		//生命周期方法 —— 页面挂载完成
		onLoad(){    //此处此方法类似于mounted()
			//console.log('login组件挂载完成')
			//获取系统信息,读取其中的“状态栏高度”
			let {statusBarHeight} = uni.getSystemInfoSync()
			// console.log('屏幕高度:', screenHeight);
			this.statusBarHeight = statusBarHeight
		},
		methods: {
			async doLogin(){
				//console.log('当前输入:',this.phone, this.pwd)
				//1.验证手机号是否合法,不合法就弹出提示框,退出执行
				if(!/^1[3-9]\d{9}$/.test(this.phone)){
					uni.showToast({
						title: '手机号非法',		//提示标题
						icon: 'none',			//图标
						duration: 3000			//持续时长 
					})
					return
				}
				//2.验证密码是否合法,不合法就弹出提示框,退出执行
				if(this.pwd.length < 6){
					uni.showToast({
						title:'密码格式非法',
						icon: 'none',
						duration: 3000
					})
					return 
				}
				//3.把手机号/密码提交给服务器端数据API,进行登录验证
				let data = await userLogin(this.phone, this.pwd)
				console.log(data)
				//4.登录成功,提示“欢迎回来”,跳转到首页
				if(data.code===2000){  	//登录成功
					//弹出一个“吐司”对话框
					uni.showToast({
						title: '欢迎回来',
						icon: 'none',			//图标:不要
						duration: 3000,			//持续时间:3s
						complete(){				//对话框成功关闭
							//跳转到“首页” —— 切换页签
							uni.switchTab({
								url:'/pages/index/index'
							})
						}
					})
				}else {					//登录失败
					//弹出一个“模态”对话框
					uni.showModal({
						title: '错误',
						content: '登录失败!服务器返回消息:'+data.msg
					})
				}
			},
		}
	}
</script>

处理吐司弹窗

无法实现吐司弹窗结束后页面跳转

所以需要将吐司提示放置到目标页-index.vue中实现

login.vue

<script>
	import { userLogin } from '../../service/'
	export default {
		data(){
			return {
				statusBarHeight: 0,		//系统状态栏高度
				hidePwd: true,			//是否隐藏密码
				phone: "13501234567",	//用户输入的登录手机号
				pwd:"123456",			//用户输入的登录密码
			}
		},
		//生命周期方法 —— 页面挂载完成
		onLoad(){    //此处此方法类似于mounted()
			//console.log('login组件挂载完成')
			//获取系统信息,读取其中的“状态栏高度”
			let {statusBarHeight} = uni.getSystemInfoSync()
			// console.log('屏幕高度:', screenHeight);
			this.statusBarHeight = statusBarHeight
		},
		methods: {
			async doLogin(){
				//console.log('当前输入:',this.phone, this.pwd)
				//1.验证手机号是否合法,不合法就弹出提示框,退出执行
				if(!/^1[3-9]\d{9}$/.test(this.phone)){
					uni.showToast({
						title: '手机号非法',		//提示标题
						icon: 'none',			//图标
						duration: 3000			//持续时长 
					})
					return
				}
				//2.验证密码是否合法,不合法就弹出提示框,退出执行
				if(this.pwd.length < 6){
					uni.showToast({
						title:'密码格式非法',
						icon: 'none',
						duration: 3000
					})
					return 
				}
				//3.把手机号/密码提交给服务器端数据API,进行登录验证
				let data = await userLogin(this.phone, this.pwd)
				// console.log(data)
				//4.登录成功,提示“欢迎回来”,跳转到首页
				if(data.code===2000){  	//登录成功
					//跳转到“首页” —— 切换页签
					uni.switchTab({
						url:'/pages/index/index'
					})
				}
				}else {					//登录失败
					//弹出一个“模态”对话框
					uni.showModal({
						title: '错误',
						content: '登录失败!服务器返回消息:'+data.msg
					})
				}
			},
		}
	}
</script>

index.vue

//生命周期方法:组件加载完成
async onLoad() {	
    //弹出“欢迎回来”提示框
    uni.showToast({
        title:'欢迎回来',
        icon: 'none',
        duration: 3000
    })
},

令牌机制

令牌概念

HTTP协议属于**“无状态协议”**——客户端发起一个HTTP请求,服务器返回一个HTTP响应,服务器不会记录客户端的任何信息。实际应用中,很多场景下需要服务器记录客户端访问信息:例如根据访问历史进行后续的推荐、主题选择、购物车…

实现这类效果可用的技术:Cookie、SessionStorage&LocalStorage、Session、Token

Token:令牌,用于证明客户端身份的机制。

**原理:服务器端把客户端的信息保存在一个对象中,**加密为一个定长字符串,发送给客户端;客户端保存起来;等到下次请求时,客户端可以再把加密字符串返回给服务器;服务器可以解密出其中的原始信息,从而进一步查询更多信息——类似于银行给客户端的“银行卡”,其中存储着客户端的信息(加密存储,客户端是读不懂的),后续有些请求需要客户端出示此“银行卡”有些请求则不需要。

客户端服务器
1、客户端发送简单请求,包含phone和pwd
2、服务器验证登录信息,成功后,把客户端信息保存在一个对象中,形如:{ 用户编号:123, 用户名:yaya, 登录时间:x年x月x日 xx:xx:xx, 登录过期时间:x年x月x日 xx:xx:xx …. }
3.服务器将上述对象加密为定长字符串(即token);随同响应消息一同返回给客户端: { code:2000, msg: ‘login succ’, token: ‘加密后的定长字符串’ }
4、接收到响应消息,把其中的token保存在客户端 uni.setStorageSync(‘userToken’, data.token)
5、从客户端读取之前保存的token let token=uni.getStorageSync(‘userToken’)
6、发送请求消息,把token放在请求消息头中(与后端协商好的请求头) uni.request({ url, header:{ token: token } }) 生成的请求消息形如: GET /index/data HTTP1.1 token: ‘‘加密后的字符串’’
7、服务器接收到请求消息,从请求头中读取req.headers.token(即token),解密令牌,得到原始的令牌信息,即:{ 用户编号:123, 用户名:yaya 登录时间:x年x月x日 xx:xx:xx, 登录过期时间:x年x月x日 xx:xx:xx …. }
8、服务器根据用户信息查询数据库,将用户信息返回给客户端

本地存储

异步操作localStorage:

uni.setStorage(k, v, success(){})

uni.getStorage(k, success(){})

uni.removeStorage(k, success(){})

uni.clearStorage( success(){} )

同步操作localStorage:

uni.setStorageSync(k, v)

uni.getStorageSync(k)

uni.removeStorageSync(k)

uni.clearStorageSync( )

<script>
	import { userLogin } from '../../service/'
	export default {
		data(){
			return {
				statusBarHeight: 0,		//系统状态栏高度
				hidePwd: true,			//是否隐藏密码
				phone: "13501234567",	//用户输入的登录手机号
				pwd:"123456",			//用户输入的登录密码
			}
		},
		//生命周期方法 —— 页面挂载完成
		onLoad(){    //此处此方法类似于mounted()
			//console.log('login组件挂载完成')
			//获取系统信息,读取其中的“状态栏高度”
			let {statusBarHeight} = uni.getSystemInfoSync()
			// console.log('屏幕高度:', screenHeight);
			this.statusBarHeight = statusBarHeight
		},
		methods: {
			async doLogin(){
				//console.log('当前输入:',this.phone, this.pwd)
				//1.验证手机号是否合法,不合法就弹出提示框,退出执行
				if(!/^1[3-9]\d{9}$/.test(this.phone)){
					uni.showToast({
						title: '手机号非法',		//提示标题
						icon: 'none',			//图标
						duration: 3000			//持续时长 
					})
					return
				}
				//2.验证密码是否合法,不合法就弹出提示框,退出执行
				if(this.pwd.length < 6){
					uni.showToast({
						title:'密码格式非法',
						icon: 'none',
						duration: 3000
					})
					return 
				}
				//3.把手机号/密码提交给服务器端数据API,进行登录验证
				let data = await userLogin(this.phone, this.pwd)
				// console.log(data)
				//4.登录成功,提示“欢迎回来”,跳转到首页
				if(data.code===2000){  	//登录成功
					//在客户端存储服务器返回的token(身份令牌)
					uni.setStorageSync('userToken', data.token)
					//跳转到“首页” —— 切换页签
					uni.switchTab({
						url:'/pages/index/index'
					})
				}else {					//登录失败
					//弹出一个“模态”对话框
					uni.showModal({
						title: '错误',
						content: '登录失败!服务器返回消息:'+data.msg
					})
				}
			},
		}
	}
</script>

获取主页数据

service/index.js中提供后去主页数据方法

传输令牌 获取数据

/**
 * API-2.1、首页数据
 * 接口地址:index/data
 * 请求方式:GET
 * 请求头部:token - 用户登录后保存在客户端的身份凭证
 */
export let indexData = async ( )=>{
	//1.准备请求URL
	let url = base + 'index/data'
	//2.显示“加载中”提示框	
	uni.showLoading({
		title: '首页数据读取中'
	})
	//3.发起异步请求消息
	let [err, res] = await uni.request({
		url,		//请求地址
		header: {	//请求头部-token(客户端身份令牌)
			token: uni.getStorageSync('userToken')
		}
	})
	//4.隐藏“加载中”提示框
	uni.hideLoading()
	//5.返回响应消息主体
	return res.data
}

index.vue在onLoad()中获取主页数据

import { indexData, base } from '@/service'
//生命周期方法:组件加载完成
async onLoad() {	
    //弹出“欢迎回来”提示框
    uni.showToast({
        title:'欢迎回来',
        icon: 'none',
        duration: 3000
    })
    //向服务器请求首页数据
    let data = await indexData()
    console.log(data)
},

生命周期方法

应用程序生命周期方法

整个应用程序的生命周期方法 —— App.vue —— 高仿微信小程序**

​ onLaunch():整个应用程序启动了

​ onShow():应用程序显示出来,例如:第一次启动完成、从其它应用切换会当前应用

​ onHide():应用程序隐藏起来了,例如:来电话了、用户点击桌面按钮

页面生命周期方法

页面的生命周期方法 —— pages —— 高仿微信小程序**

onLoad():当前页面挂载完成,功能类似于mounted

onShow():页面显示出来了,例如:第一次挂载完成、导航返回之前的页面

onReady():页面准备就绪了,每个页面此方法调用且仅调用一次——第一次调用onShow之后

onHide():页面隐藏起来了,例如:导航跳转到下一个页面

onUnload():当前页面完成卸载,功能类似于destroyed

onPageScroll():页面滚动了

onReachBottom():页面滚动到底部了

onPullDownRefresh():页面在顶部下拉刷新了

组件生命周期方法

组件的生命周期方法 —— components —— 高仿Vue.js

​ 创建时期:beforeCreate()created()

​ 挂载时期:beforeMount()mounted()

​ 更新时期:beforeUpdate()updated()

​ 销毁时期:beforeDestroy()destroyed()

主页开发

保存主页数据

<script>
import { indexData, base } from '@/service'
	export default {
		data() {
			return {
				base,				//把服务器基础地址变量设置为数据属性
				carousels:[],		//轮播广告条目列表
				menuItems:[],		//当前用户选中的功能菜单列表
				activities:[],		//最新的社区活动列表
			}
		},
		//生命周期方法:组件加载完成
		async onLoad() {	
			//弹出“欢迎回来”提示框
			uni.showToast({
				title:'欢迎回来',
				icon: 'none',
				duration: 3000
			})
			//向服务器请求首页数据
			let data = await indexData()
			this.carousels = data.carousels		//轮播广告
			this.menuItems = data.menuItems		//功能菜单
			this.activities = data.activities	//社区活动
		},
		methods: {
			
		}
	}
</script>

轮播图实现

<!-- F1: 轮播广告 -->
<!-- indicator-dots:是否显示“小圆饼”指示器 -->
<!-- autoplay:是否自动播放轮播广告 -->
<!-- interval:时间间隔,两个广告间停留时间 -->
<!-- duration:持续时长,一个广告的过渡动画持续时长 -->
<swiper :indicator-dots="true" :autoplay="true" :interval="2000" :duration="500">
    <swiper-item v-for="(c, i) in carousels" :key="i">
        <view class="swiper-item">
        	<image @click="jump(c.href)" :src="base + c.pic" mode="widthFix"/>
        </view>
    </swiper-item>
</swiper>
<script>
import { indexData, base } from '@/service'
	export default {
		data() {
			return {
				base,				//把服务器基础地址变量设置为数据属性
				carousels:[],		//轮播广告条目列表
				menuItems:[],		//当前用户选中的功能菜单列表
				activities:[],		//最新的社区活动列表
			}
		},
		//生命周期方法:组件加载完成
		async onLoad() {	
			//弹出“欢迎回来”提示框
			uni.showToast({
				title:'欢迎回来',
				icon: 'none',
				duration: 3000
			})
			//向服务器请求首页数据
			let data = await indexData()
			this.carousels = data.carousels		//轮播广告
			this.menuItems = data.menuItems		//功能菜单
			this.activities = data.activities	//社区活动
		},
		methods: {
			jump(url){
				console.log(url)
				//导航跳转到指定页
				uni.navigateTo({ url })
			}
		}
	}
</script>
<style scoped lang="scss">
	//提示:页面中可以使用标签选择器,但是组件中不能使用
	.swiper-item > image {
		width: 750rpx;
	}
</style>

宫格图实现

需要安装uni-grid组件

<!-- F2: 功能菜单 -->
<!-- column:一行中默认显示几列 -->
<!-- showBorder:是否显示边框 -->
<!-- square:每个宫格项是否显示为方形 -->
<uni-grid class="func-menu" :column="4" :showBorder="false" :square="true">
    <uni-grid-item v-for="(item,i) in menuItems" :key="i">
        <view class="menu-item" @click="jump(item.href)">
            <image :src="base+item.pic" mode="widthFix"/>
            <text>{{item.title}}</text>
        </view>
    </uni-grid-item>
</uni-grid>
<style scoped lang="scss">
    .func-menu {
        margin-top: $uni-spacing-col-base;
        background-color: $uni-bg-color;
        .menu-item {
            height: 100%;
            //把弹性容器的主轴方向修改为:纵向
            flex-direction: column;
            //弹性容器中的子元素在主轴方向上居中对齐
            justify-content: center;
            //弹性容器中的子元素交叉轴方向上居中对齐
            align-items: center;
            > image { width:35%; margin-bottom: $uni-spacing-col-sm; }
        }
    }
</style>

商业服务功实现

需要安装uni-card扩展组件

<!-- F3: 商业服务 -->
<!-- isFull:是否显示为“通栏卡片”(左右撑满) -->
<uni-card class="card" title="| 商业服务" is-full>
	<view class="service">
		<!-- 左侧:房屋租售 -->
		<view class="service-item">
			<view class="txt">
				<text>房屋租售</text>
				<view>
					<navigator>租房</navigator>
					<navigator>短租</navigator>
				</view>
			</view>	
			<!-- 图片缩放模式1:widthFix -->
			<!-- 图片缩放模式2:scaleToFill:不保持原始宽高比,缩放图片填满指定宽高 -->
			<image class="img" mode="scaleToFill" src="../../static/img/chuzu.png"/>
		</view>
		<!-- 右侧:便民服务 -->
		<view class="service-item">
			<view class="txt">
				<text>便民服务</text>
				<view>
					<navigator>便利店</navigator>
					<navigator>超市</navigator>
				</view>
			</view>	
			<image class="img" mode="scaleToFill" src="../../static/img/bianmin.png"/>
		</view>
	</view>
</uni-card>
.service {
	width: 100%;
	.service-item {
		//弹性子元素尺寸增长权重为:1
		flex: 1;
		padding-top: $uni-spacing-col-sm;
		padding-bottom: $uni-spacing-col-sm;
		justify-content: space-between; //弹性容器中的子元素在主轴方向上:空白在中央
		align-items: center; //弹性容器中的子元素在交叉轴方向上:居中对齐
		&:nth-child(1) {padding-right: $uni-spacing-row-sm;}
		&:nth-child(2) {padding-left: $uni-spacing-row-sm;}
		.txt { 
			font-size: $uni-font-size-sm; 
			flex-direction: column; 
			flex: 1; //弹性子元素尺寸增长权重:1
			navigator {margin-right: $uni-spacing-row-sm;}
		}
		.img { width: 150rpx; height: 120rpx;}
	}
}

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

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

相关文章

微信小程序版本更新管理——实现自动更新

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数&#xff0c;主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…

1 vsCode安装与使用

1 下载地址 Visual Studio Code - Code Editing. Redefined 2 安装 3 安装插件 安装完要重启 chinese:中文插件 open in browser &#xff1a;快速打开浏览器插件 ----------------------------------------------------------------------------------------------------- 重…

嵌入式学习-网络-Day02

嵌入式学习-网络-Day02 1.优化代码&#xff1a; 网络问题&#xff1a; 2.1虚拟机网络修复 2.2 网络调试 ping netstat 3.UDP编程 3.1通信流程 3.2函数接口 1.优化代码&#xff1a; 1.端口和ip地址通过命令行传参到代码中。 2.设置客户端退出&#xff0c;服务器结束循环接收。 通…

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献&#xff1f;6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…

【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别

一、开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行一个系统&#xff0c;但是每个设备的运算能力和功能都不同&#xff0c;所以内核的设计上&#xff0c;采用了微内核的设计&#xff0c;除了最基础的功能放在内核…

云岚到家 即刻体检 优惠卷管理 总结不熟练的点

多个条件的分页查询 public PageResult<ActivityInfoResDTO> queryPage(ActivityQueryForPageReqDTO reqDTO) {Page<Activity> pagequery new Page<>(reqDTO.getPageNo(),reqDTO.getPageSize());LambdaQueryWrapper<Activity> wrapper new LambdaQ…

C++ | Leetcode C++题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> findWords(vector<string>& words) {vector<string> ans;string rowIdx "12210111011122000010020202";for (auto & word : words) {bool isValid true;cha…

数组实例之三子棋的实现(C语言)

目录 前言 一、三子棋实现的逻辑 二、三子棋的实现 2.1文件的创建添加 2.2 test文件基本逻辑 2.2.1菜单的实现 2.2.2菜单的选择 2.2.3game函数棋盘的实现 2.3game.c文件的编写 2.3.1初始化函数的模块 2.3.2棋盘打印的模块 2.3.3实现棋盘界面的打印 2.3.4实现玩家下…

【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval

文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点&#xff1a; 事实性错误的普遍存在验证的难度&#xff08;可溯源性差&#xff09;难以在有顾虑的情况下排除某些序列适应调整…

Unity插件-Intense TPS 讲解

目录 关于TPS 打开场景&#xff1a;WeaponTest.unity&#xff0c; 只要把这些枪点&#xff0c;打开&#xff08;默认隐藏&#xff0c;不知道为何), 一开始不能运行如何修复 总结 关于TPS 个人不是TPS&#xff0c;FPS的射击游戏爱好者&#xff0c; 不过感觉这个枪感&…

Linux系统中使用yum命令详细安装MariaDB数据库的步骤

前言 mysql和mariadb的区别 MySQL&#xff1a;最初由瑞典的MySQL AB开发&#xff0c;后被Sun Microsystems收购&#xff0c;最终被Oracle收购。MariaDB&#xff1a;由MySQL的原始开发者Michael Widenius领导的团队开发&#xff0c;目标是保持与MySQL的兼容性&#xff0c;并提…

部署前后端分离若依项目--CentOS7宝塔版

准备&#xff1a; CentOS7服务器一台 通过网盘分享的文件&#xff1a;CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个&#xff0c;密码61 若依前端编译后文件 通过网盘分享的文件&#xff1a;ruoyi-admin.jar 链…

【K8S】快速入门Kubernetes

之前企业都是使用容器化和来构建自己的服务和应用程序&#xff0c;其中容器化优点有很多&#xff1a;提升了部署效率、稳定性、提高了资源的利用率降低了成本。 但是也带来了一些新的问题&#xff1a;容器的数量变得很多&#xff0c;管理就是一个新的问题。所以Kubernetes就出…

【K8S系列】Kubernetes 中 Service IP 地址和端口不匹配问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;Service 是实现 Pod 之间和 Pod 与外部之间通信的关键组件。Service 的 IP 地址和端口配置不当可能导致应用无法正常访问。本文将详细分析 Service IP 地址和端口不匹配的问题&#xff0c;常见原因及其解决方案。 一、问题描述 Service IP 地址和…

草稿1111

服务端&#xff1a; 启动nfs服务器服务和rpcbind 服务&#xff1a; 写配置文件&#xff1a; 重新导出所有当前已导出的文件系统&#xff1a; 这个命令会立即停止 firewalld 服务&#xff0c;并将其设置为在系统启动时不自动启动&#xff1a; 客户端&#xff1a; 启动nfs服务器…

练习LabVIEW第十九题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第十九题&#xff1a; 创建一个程序把另外一个VI的前面板显示在Picture控件中 开始编写&#xff1a; 在前面板放置一个二…

银河麒麟V10通过tigervnc实现远程桌面和windows系统连接

1、查看系统版本:uname -a Linux localhost.localdomain 4.19.90-89.16.v2401.ky10.x86_64 #1 SMP Sat Sep 14 13:09:47 CST 2024 x86_64 x86_64 x86_64 GNU/Linux 2、查看是否具有桌面环境:yum grouplist 安装VNC需要具有桌面环境 3.、安装tigervnc: yum install tigervnc…