鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp
UniApp 制作个人信息编辑界面与头像上传功能
前言
最近在做一个社交类小程序时,遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单,但要做好用户体验和兼容多端,还是有不少细节需要处理。经过一番摸索,总结出了一套在UniApp中实现个人信息编辑与头像上传的完整方案。希望这篇文章能给正在做类似功能的朋友提供一些参考。
需求分析
一个完整的个人信息编辑功能通常包括以下几个部分:
- 头像编辑:支持从相册选择或拍照获取,并进行裁剪上传
- 基本信息编辑:昵称、性别、生日、个性签名等字段的填写和修改
- 表单验证:确保用户填写的信息符合规则
- 数据提交:将修改后的信息提交到服务器
接下来,我们就一步步实现这些功能。
界面设计与布局
1. 页面结构
首先,我们来设计基本的页面结构。这里采用常见的列表式布局,每个信息项都是一个可点击的单元格。
<template><view class="profile-edit"><!-- 头像部分 --><view class="avatar-section" @click="chooseAvatar"><text class="section-title">头像</text><view class="avatar-wrapper"><image class="avatar" :src="userInfo.avatar || defaultAvatar" mode="aspectFill"></image><text class="iconfont icon-right"></text></view></view><!-- 基本信息部分 --><view class="info-list"><view class="info-item" @click="editNickname"><text class="item-label">昵称</text><view class="item-content"><text>{{userInfo.nickname || '未设置'}}</text><text class="iconfont icon-right"></text></view></view><view class="info-item"><text class="item-label">性别</text><view class="item-content"><picker @change="onGenderChange" :value="genderIndex" :range="genderOptions"><text>{{genderOptions[genderIndex]}}</text></picker><text class="iconfont icon-right"></text></view></view><view class="info-item"><text class="item-label">生日</text><view class="item-content"><picker mode="date" :value="userInfo.birthday" :start="startDate" :end="endDate" @change="onBirthdayChange"><text>{{userInfo.birthday || '未设置'}}</text></picker><text class="iconfont icon-right"></text></view></view></view><!-- 个性签名部分 --><view class="signature-section"><text class="section-title">个性签名</text><view class="signature-content"><textarea v-model="userInfo.signature" placeholder="介绍一下自己吧(最多100字)" maxlength="100" /><text class="word-count">{{userInfo.signature.length}}/100</text></view></view><!-- 保存按钮 --><view class="btn-section"><button class="btn-save" @click="saveUserInfo">保存</button></view></view>
</template>
2. 样式设计
接下来,我们编写样式,让界面看起来更加美观。
<style lang="scss">
.profile-edit {padding: 20rpx;background-color: #f5f5f5;min-height: 100vh;.avatar-section {display: flex;justify-content: space-between;align-items: center;background-color: #ffffff;padding: 30rpx;border-radius: 12rpx;margin-bottom: 20rpx;.section-title {font-size: 30rpx;color: #333;}.avatar-wrapper {display: flex;align-items: center;.avatar {width: 120rpx;height: 120rpx;border-radius: 60rpx;margin-right: 10rpx;}.icon-right {color: #cccccc;font-size: 24rpx;}}}.info-list {background-color: #ffffff;border-radius: 12rpx;margin-bottom: 20rpx;.info-item {display: flex;justify-content: space-between;align-items: center;padding: 30rpx;border-bottom: 1rpx solid #f0f0f0;&:last-child {border-bottom: none;}.item-label {font-size: 30rpx;color: #333;}.item-content {display: flex;align-items: center;color: #666;.icon-right {margin-left: 10rpx;color: #cccccc;font-size: 24rpx;}}}}.signature-section {background-color: #ffffff;border-radius: 12rpx;padding: 30rpx;margin-bottom: 40rpx;.section-title {font-size: 30rpx;color: #333;margin-bottom: 20rpx;display: block;}.signature-content {position: relative;textarea {width: 100%;height: 180rpx;font-size: 28rpx;line-height: 1.6;padding: 20rpx;box-sizing: border-box;background-color: #f9f9f9;border-radius: 8rpx;}.word-count {position: absolute;right: 20rpx;bottom: 20rpx;font-size: 24rpx;color: #999;}}}.btn-section {padding: 20rpx 40rpx;.btn-save {background-color: #007aff;color: #ffffff;border-radius: 12rpx;font-size: 32rpx;padding: 20rpx 0;border: none;&:active {opacity: 0.8;}}}
}
</style>
头像上传功能实现
头像上传是个人信息编辑中最复杂的部分,主要涉及以下几个步骤:
- 调用系统API选择图片
- 对图片进行裁剪(可选)
- 将图片上传到服务器
- 获取上传后的图片URL并更新界面
1. 选择图片
UniApp提供了跨平台的图片选择API,可以同时兼容App、H5和小程序:
chooseAvatar() {uni.showActionSheet({itemList: ['拍照', '从相册选择'],success: (res) => {if (res.tapIndex === 0) {// 拍照this.takePhoto();} else if (res.tapIndex === 1) {// 从相册选择this.chooseFromAlbum();}}});
},takePhoto() {uni.chooseImage({count: 1,sourceType: ['camera'],crop: {quality: 80,width: 300,height: 300,resize: true},success: (res) => {this.uploadAvatar(res.tempFilePaths[0]);}});
},chooseFromAlbum() {uni.chooseImage({count: 1,sourceType: ['album'],crop: {quality: 80,width: 300,height: 300,resize: true},success: (res) => {this.uploadAvatar(res.tempFilePaths[0]);}});
}
需要注意的是,不同平台对图片裁剪的支持不同。在App端,可以使用原生裁剪插件;在小程序端,微信和支付宝提供了裁剪能力;但在H5端,需要自己实现裁剪功能。
2. 图片上传
获取到图片后,需要将其上传到服务器:
uploadAvatar(filePath) {uni.showLoading({title: '上传中...'});// 上传图片uni.uploadFile({url: 'https://your-api.com/upload', // 替换为你的上传接口filePath: filePath,name: 'file',formData: {'type': 'avatar'},success: (uploadRes) => {const data = JSON.parse(uploadRes.data);if (data.code === 0) {// 上传成功,更新头像this.userInfo.avatar = data.data.url;uni.showToast({title: '头像更新成功',icon: 'success'});} else {uni.showToast({title: data.message || '上传失败',icon: 'none'});}},fail: (err) => {console.error('上传失败', err);uni.showToast({title: '上传失败,请重试',icon: 'none'});},complete: () => {uni.hideLoading();}});
}
3. 自定义裁剪组件(H5兼容方案)
对于H5端不支持原生裁剪的情况,我们可以实现一个简单的图片裁剪组件:
<!-- ImageCropper.vue -->
<template><view class="cropper-container" v-if="visible"><view class="cropper-mask"></view><view class="cropper-content"><view class="cropper-title">裁剪头像</view><view class="cropper-body"><image :src="imageSrc" class="image-to-crop":style="imageStyle"@touchstart="onTouchStart"@touchmove="onTouchMove"@touchend="onTouchEnd"></image><view class="crop-frame"></view></view><view class="cropper-footer"><button class="btn-cancel" @click="cancel">取消</button><button class="btn-confirm" @click="confirm">确定</button></view></view></view>
</template><script>
export default {props: {visible: {type: Boolean,default: false},imageSrc: {type: String,default: ''}},data() {return {imageStyle: {width: '100%',transform: 'translate(0, 0) scale(1)'},startX: 0,startY: 0,translateX: 0,translateY: 0,scale: 1};},methods: {onTouchStart(e) {const touch = e.touches[0];this.startX = touch.clientX;this.startY = touch.clientY;},onTouchMove(e) {const touch = e.touches[0];const deltaX = touch.clientX - this.startX;const deltaY = touch.clientY - this.startY;this.translateX += deltaX;this.translateY += deltaY;this.startX = touch.clientX;this.startY = touch.clientY;this.updateImageStyle();},onTouchEnd() {// 可以在这里添加额外的处理},updateImageStyle() {this.imageStyle = {width: '100%',transform: `translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`};},cancel() {this.$emit('cancel');},confirm() {// 在实际项目中,这里应该调用canvas绘制裁剪后的图片// 为了简化,这里只是通知父组件确认裁剪this.$emit('confirm', {translateX: this.translateX,translateY: this.translateY,scale: this.scale});}}
};
</script><style lang="scss">
.cropper-container {position: fixed;top: 0;left: 0;width: 100%;height: 100%;z-index: 999;.cropper-mask {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.6);}.cropper-content {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 80%;background-color: #fff;border-radius: 12rpx;overflow: hidden;.cropper-title {padding: 20rpx;text-align: center;font-size: 32rpx;border-bottom: 1rpx solid #eee;}.cropper-body {position: relative;width: 100%;height: 600rpx;overflow: hidden;.image-to-crop {position: absolute;top: 0;left: 0;width: 100%;height: 100%;object-fit: contain;}.crop-frame {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 300rpx;height: 300rpx;border: 2rpx solid #fff;border-radius: 50%;box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5);}}.cropper-footer {display: flex;padding: 20rpx;button {flex: 1;height: 80rpx;line-height: 80rpx;text-align: center;margin: 0 10rpx;border-radius: 8rpx;font-size: 30rpx;}.btn-cancel {background-color: #f5f5f5;color: #666;}.btn-confirm {background-color: #007aff;color: #fff;}}}
}
</style>
在主组件中引用裁剪组件:
<template><view><!-- 其他组件内容 --><!-- 图片裁剪组件 --><image-cropper :visible="showCropper":imageSrc="tempImageSrc"@cancel="closeCropper"@confirm="cropImage"></image-cropper></view>
</template><script>
import ImageCropper from '@/components/ImageCropper.vue';export default {components: {ImageCropper},data() {return {showCropper: false,tempImageSrc: ''// 其他数据...};},methods: {// 在H5环境下选择图片后的处理chooseFromAlbumH5() {uni.chooseImage({count: 1,sourceType: ['album'],success: (res) => {this.tempImageSrc = res.tempFilePaths[0];this.showCropper = true;}});},closeCropper() {this.showCropper = false;},cropImage(cropParams) {// 使用canvas进行实际裁剪// 这部分涉及到复杂的canvas操作,实际项目中需要根据cropParams来处理// 裁剪完成后上传this.uploadAvatar(this.tempImageSrc);this.showCropper = false;}}
};
</script>
表单验证与数据提交
1. 表单数据与验证
在脚本部分,我们需要定义数据结构并实现验证逻辑:
<script>
export default {data() {const now = new Date();const year = now.getFullYear();const month = String(now.getMonth() + 1).padStart(2, '0');const day = String(now.getDate()).padStart(2, '0');return {userInfo: {avatar: '',nickname: '',gender: 0, // 0:未设置 1:男 2:女birthday: '',signature: ''},defaultAvatar: '/static/images/default-avatar.png',genderOptions: ['未设置', '男', '女'],genderIndex: 0,startDate: '1900-01-01',endDate: `${year}-${month}-${day}`,isSubmitting: false};},onLoad() {// 获取用户信息this.getUserInfo();},methods: {// 获取用户信息getUserInfo() {uni.showLoading({title: '加载中...'});// 调用接口获取用户信息// 这里使用模拟数据setTimeout(() => {const mockUserInfo = {avatar: 'https://img.example.com/avatar.jpg',nickname: '张小明',gender: 1,birthday: '1995-08-15',signature: '生活不止眼前的苟且,还有诗和远方。'};this.userInfo = mockUserInfo;this.genderIndex = mockUserInfo.gender;uni.hideLoading();}, 500);},// 昵称编辑editNickname() {uni.navigateTo({url: '/pages/nickname/nickname?nickname=' + this.userInfo.nickname});},// 性别选择onGenderChange(e) {this.genderIndex = e.detail.value;this.userInfo.gender = parseInt(this.genderIndex);},// 生日选择onBirthdayChange(e) {this.userInfo.birthday = e.detail.value;},// 表单验证validateForm() {if (!this.userInfo.nickname.trim()) {uni.showToast({title: '请填写昵称',icon: 'none'});return false;}if (this.userInfo.nickname.length > 20) {uni.showToast({title: '昵称不能超过20个字符',icon: 'none'});return false;}return true;},// 保存用户信息saveUserInfo() {if (!this.validateForm()) {return;}if (this.isSubmitting) {return;}this.isSubmitting = true;uni.showLoading({title: '保存中...'});// 提交数据到服务器// 这里使用模拟请求setTimeout(() => {uni.hideLoading();this.isSubmitting = false;uni.showToast({title: '保存成功',icon: 'success'});// 返回上一页setTimeout(() => {uni.navigateBack();}, 1500);}, 1000);}}
};
</script>
2. 昵称编辑子页面
对于昵称这种需要单独编辑的字段,我们可以创建一个专门的编辑页面:
<!-- pages/nickname/nickname.vue -->
<template><view class="nickname-edit"><view class="input-group"><input class="nickname-input" v-model="nickname" placeholder="请输入昵称(2-20个字符)" maxlength="20"focus/><text class="clear-btn" @click="clearNickname" v-if="nickname">×</text></view><view class="tips"><text>昵称修改后,需要重新审核才能生效</text></view><button class="save-btn" @click="saveNickname" :disabled="!isValid">保存</button></view>
</template><script>
export default {data() {return {nickname: '',originalNickname: ''};},computed: {isValid() {return this.nickname.trim().length >= 2 && this.nickname.trim().length <= 20;}},onLoad(options) {if (options.nickname) {this.nickname = options.nickname;this.originalNickname = options.nickname;}},methods: {clearNickname() {this.nickname = '';},saveNickname() {if (!this.isValid) {return;}if (this.nickname === this.originalNickname) {uni.navigateBack();return;}// 实际项目中应该调用API保存昵称// 这里简化处理,直接返回值给上一页const pages = getCurrentPages();const prevPage = pages[pages.length - 2];prevPage.$vm.userInfo.nickname = this.nickname;uni.navigateBack();}}
};
</script><style lang="scss">
.nickname-edit {padding: 30rpx;.input-group {position: relative;margin-bottom: 20rpx;.nickname-input {width: 100%;height: 90rpx;background-color: #f5f5f5;border-radius: 8rpx;padding: 0 80rpx 0 20rpx;font-size: 30rpx;}.clear-btn {position: absolute;right: 20rpx;top: 50%;transform: translateY(-50%);width: 40rpx;height: 40rpx;line-height: 36rpx;text-align: center;background-color: #ccc;color: #fff;border-radius: 50%;font-size: 36rpx;}}.tips {font-size: 24rpx;color: #999;margin-bottom: 40rpx;}.save-btn {background-color: #007aff;color: #fff;border-radius: 8rpx;height: 90rpx;line-height: 90rpx;font-size: 32rpx;&[disabled] {background-color: #cccccc;color: #ffffff;}}
}
</style>
实战案例:完整的个人中心模块
将上面的代码整合起来,我们可以构建一个完整的个人中心模块,包含个人信息查看和编辑功能。整个模块的流程是:
- 用户进入个人中心页面,查看基本信息
- 点击"编辑资料"按钮,进入个人信息编辑页面
- 进行头像、昵称等信息的编辑
- 保存后返回个人中心页面,显示更新后的信息
这种模块在社交、电商、内容平台等各类应用中都非常常见,实现思路基本一致。
多端适配与性能优化
在 UniApp 开发中,多端适配是一个重要的问题。对于头像上传和图片裁剪功能,我们需要针对不同平台进行适配:
// 头像选择的多端适配
chooseAvatar() {// #ifdef APP-PLUS || MP-WEIXIN || MP-ALIPAY// 这些平台支持原生裁剪uni.showActionSheet({itemList: ['拍照', '从相册选择'],success: (res) => {if (res.tapIndex === 0) {this.takePhoto();} else if (res.tapIndex === 1) {this.chooseFromAlbum();}}});// #endif// #ifdef H5// H5需要自定义裁剪uni.showActionSheet({itemList: ['拍照', '从相册选择'],success: (res) => {if (res.tapIndex === 0) {this.takePhotoH5();} else if (res.tapIndex === 1) {this.chooseFromAlbumH5();}}});// #endif
}
另外,对于资源加载和表单提交,我们也可以进行一些优化:
- 使用uni.previewImage()进行图片预览,提升用户体验
- 表单提交时进行防抖处理,避免重复提交
- 使用本地缓存保存表单状态,防止用户误操作导致数据丢失
总结
通过本文,我们详细介绍了如何在UniApp中实现个人信息编辑界面与头像上传功能。主要包括以下几个方面:
- 设计合理的页面结构和样式
- 实现头像上传和裁剪功能
- 处理表单验证和数据提交
- 多端适配与性能优化
这些功能在实际开发中非常常见,掌握这些技巧可以帮助你更快地开发出用户体验良好的应用。在实现过程中,最重要的是要考虑用户的实际使用场景,提供简单易用的操作流程。
最后,希望这篇文章对你的开发工作有所帮助。如果有任何问题或建议,欢迎在评论区交流讨论。
参考资料
- UniApp官方文档 - 图片处理
- 微信小程序开发指南 - 用户信息
- 前端图片裁剪实现方案
相关文章:
鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp
UniApp 制作个人信息编辑界面与头像上传功能 前言 最近在做一个社交类小程序时,遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单,但要做好用户体验和兼容多端,还是有不少细节需要处理。经过一番摸索,总结出了一套…...
系统漏洞扫描服务:维护网络安全的关键与服务原理?
系统漏洞扫描服务是维护网络安全的关键措施,能够迅速发现系统中的潜在风险,有效预防可能的风险和损失。面对网络攻击手段的日益复杂化,这一服务的重要性日益显著。 服务原理 系统漏洞扫描服务犹如一名恪尽职守的安全守护者。它运用各类扫描…...
[原创](现代C++ Builder 12指南): 在界面开发中, 如何利用C++高级特性“折叠表达式“?.
[序言] 在现代C++编程中, 现代C++引入的折叠表达式(Fold Expressions)是一项极具价值的特性, 它为模板编程带来了更高的灵活性和简洁性. 折叠表达式允许在参数包上执行简洁的折叠操作, 从而减少冗余代码, 提升代码的可读性与维护性. 在界面开发领域, 特别是使用C++ Builder 12进…...
KUKA机器人中断编程3—暂停功能的编程
在KUKA机器人的使用过程中,对于调试一个项目,当遇到特殊情况时需要暂停机器人,等异常情况处理完成后再继续机器人的程序运行。wait for指令是等待一个输入信号指令,没有输入信号,机器人一直等待。在一定程度上程序也不…...
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
⭐️个人主页:小羊 ⭐️所属专栏:LeetCode 热题 100 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 相交链表反转链表回文链表环形链表环形链表 II合并两个有序链表两数相加删除链表的倒数第 N 个结点两两交换链表中的…...
Seata源码—1.Seata分布式事务的模式简介
大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…...
牛客——签到题
分析 我拿到题就去看了示例,可以发现,并非是让难度最小,或者难度系数出现次数最多的成为签到题的难度。那我就有点懵了。。。。。。 但仔细观察题目本身的特定条件和目标,即在满足选择 m 道题的前提下,尽可能多地选择…...
【idea】调试篇 idea调试技巧合集
前言:之前博主写过一篇idea技巧合集的文章,由于技巧过于多了,文章很庞大,所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的,用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...
k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持
k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...
直流电机风速仪
在处理直流电机风速仪的 ADC 读取问题时,下面为你详细介绍实现方法。 硬件连接 风速仪的输出通常是模拟信号,所以需要把它连接到微控制器的 ADC 输入引脚。比如,在 Arduino 上可以连接到 A0 - A5 这类模拟输入引脚。 ADC 读取原理 风速仪…...
dify 连接不上ollama An error occurred during credentials validation:
三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…...
19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis
76个工业组件库示例汇总 云端工业物联网生态组件 - 工厂能效与预测维护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟一个云端工业物联网 (IIoT) 平台的核心界面,专注于工厂层面的能效分析和基于传感器数据的预测性维护概念。用户可以监控模拟的设…...
python打卡day25
python的异常处理机制 知识点回顾: 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深对代码和流程的理解。…...
Jmeter变量传递介绍
文章目录 一、Jmeter变量类型及作用域二、变量传递方式1. 用户定义变量(User Defined Variables)2. CSV 数据文件(CSV Data Set Config)3.正则表达式提取器4.后置处理器(Post Processor)4.1BeanShell/JSR223 后置处理器…...
机器学习 Day16 聚类算法 ,数据降维
聚类算法 1.简介 1.1 聚类概念 无监督学习:聚类是一种无监督学习算法,不需要预先标记的训练数据 相似性分组:根据样本之间的相似性自动将样本归到不同类别 相似度度量:常用欧式距离作为相似度计算方法 1.2 聚类vs分类 聚类&…...
白日梦:一个方便快捷的将故事制作成视频的工具
我有故事,但我想把它制作成视频,有没有什么好用的工具可以使用呢?如果你也被类似的问题困扰,那么今天分享的这个工具将会解决这个问题。从需求来看,我们希望的是纯文本的故事输入,完整的故事视频输出&#…...
ultralytics中tasks.py---parse_model函数解析
一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...
Codeforces Round 1003 (Div. 4)
A. Skibidus and Amog’u 题目大意 给你一个字符串,把末尾的us换成i 解题思路 删掉最后两个加上“i”即可 代码实现 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int …...
基于RFSOC ZU28DR+DSP 6U VPX处理板
板卡概述 基于RFSOC ZU28DRDSP 6U VPX处理板,是一款基于6U VPX总线架构的高速信号处理平台,数模混合信号处理卡,采用 Xilinx ZYNQ UltraScale RFSoC ZU28DR和TI DSP TMS320C6678组合设计,两者之间通过4x 5G SRIO互联。本板卡可实…...
C# 通过脚本实现接口
以前C#脚本用的委托注入模式,今天在AI提示下,尝试用脚本直接实现接口,然后C#可以动态或指定新类型创建接口实现对象。从代码角度看,稍显复杂,但脚本方面显得更简洁和有条理。 引用包需要Microsoft.CodeAnalysis、Micro…...
代码随想录算法训练营Day58
力扣695.岛屿的最大面积【medium】 力扣827.最大人工岛【hard】 一、力扣695.岛屿的最大面积【medium】 题目链接:力扣695.岛屿的最大面积 视频链接:代码随想录 1、思路 和岛屿数量那道题很像,只是递归这边要多一个怎么计算面积,…...
若依框架页面
1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习,不要攻击哦,谢谢啊...
redis 缓存穿透,缓存击穿,缓存雪崩
一:什么是缓存 (1)计算机:cpu、内存、磁盘,cpu任何需要的数据都要从内容中读入数据放入cpu,从cup内部添加一个缓存 (2)web开发的每个阶段都可以添加缓存 (3)缓存优缺点&a…...
ORACLE查看归档是否打开
一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明: ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明: STARTED - 归档进程已启动(归档模…...
Python环境管理工具深度指南:pip、Poetry、uv、Conda
Python环境管理工具深度指南:pip、Poetry、uv、Conda Python开发中,环境管理和依赖管理是不可避开的重要话题。合理地管理项目的Python环境(尤其是虚拟环境)有助于隔离不同项目的依赖,避免版本冲突,并确保…...
高等数学第七章---微分方程(§7.4-§7.5可降阶的高阶微分方程、二阶线性微分方程)
7.4 可降阶的高阶微分方程 某些类型的高阶微分方程可以通过适当的变量代换,将其阶数降低,从而化为阶数较低的方程进行求解。 一、 y ( n ) f ( x ) y^{(n)}f(x) y(n)f(x) 型方程 特征:方程的左端是 y y y 的 n n n 阶导数,右…...
Jmeter对服务端进行压测快速上手
安装 下载 安装jmeter的之前必须先装有JDK 官网下载地址:https://archive.apache.org/dist/jmeter/binaries/ jmeter3.0的对应jdk1.7,jmeter4.0对应jdk1.8以上,否者启用jmeter也会报错 配置 配置环境变量 在系统变量PATH上加上: %JMET…...
【嵌入模型与向量数据库】
目录 一、什么是向量? 二、为什么需要向量数据库? 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 🔍 示例任务:…...
鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp
使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域,实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面,从布局设计到核心逻辑实现,带领大家一步步打造专…...
React构建组件
React构建组件 React 组件构建方式详解 React 组件的构建方式随着版本迭代不断演进,目前主要有 函数组件 和 类组件 两种核心模式,并衍生出多种高级组件设计模式。以下是完整的构建方式指南: 文章目录 React构建组件React 组件构建方式详解…...
auto.js面试题及答案
以下是常见的 Auto.js 面试题及参考答案,涵盖基础知识、脚本编写、运行机制、权限、安全等方面,适合开发岗位的技术面试准备: 一、基础类问题 什么是 Auto.js?它的主要用途是什么? 答案: Auto.js 是一个…...
OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南
🚀📊 OPC UA ABP vNext 企业级实战:高可用数据采集框架指南 🚀 📑 目录 🚀📊 OPC UA ABP vNext 企业级实战:高可用数据采集框架指南 🚀一、前言 🎯二、系统…...
【springcloud学习(dalston.sr1)】Ribbon负载均衡(七)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) (一)Ribbon 负载均衡的理解 ribbon是一种客户端的负载均衡。类似于比如我们在火车站窗口…...
编程题 03-树1 树的同构【PAT】
文章目录 题目输入格式输出格式输入样例1(对应图一)输出样例1输入样例2(对应图二)输出样例2 题解解题思路完整代码 编程练习题目集目录 题目 给定两棵树 T 1 T_1 T1 和 T 2 T_2 T2 。如果 T 1 T_1 T1 可以通过若干次左右…...
团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级
光照、材质与交互效果的精细控制,通常意味着复杂的技术挑战,但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中),这一切都变得简单易用。通过最新团结引擎官方车模 Sample,开发者能切身感受到全新光照优化与编辑功能…...
Chrome安装最新vue-devtool插件
本vue-devtool版本是官方的 v7.6.8版本,兼容性好、功能齐全且稳定。 操作步骤: 方法一: 打开谷歌浏览器 --> 右上角三个点 --> 扩展程序 --> 管理扩展程序 --> 加载已解压的扩展程序, 然后选择解压后的文件夹即可。…...
鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp
使用UniApp打造多功能图表展示组件 在当前移动应用开发领域,数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标,一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架,如何在其中实现…...
海量数据Top k 与查重问题
海量数据求top k 问题: - 求最大的前k个元素、求最小的前k个元素 - 求最大的第k个元素、求最小的第k个元素 解法: - 大根堆、小跟堆 -》 优先级队列(priority_queue) - 快速分割函数 priority_queue<int,vector<int>…...
Beats
Beats是一个开放源代码的数据发送器。我们可以把Beats作为一种代理安装在我 们的服务器上,这样就可以比较方便地将数据发送到Elasticsearch或者Logstash 中。Elastic Stack提供了多种类型的Beats组件。 Beats可以直接将数据发送到Elasticsearch或者发送到Logstash&a…...
微型PCB打样厂家选型指南
智能手机、可穿戴设备、医疗电子等高精尖领域,微型PCB(印制电路板)如同设备的“神经中枢”,承载着信号传输、电源分配、元件互联等核心功能。其设计精度与制造质量直接决定了产品的性能上限与可靠性。而打样环节,则是从…...
ISP有感自发
一、黑电平 由于传感器,即便在无光的情况下,依然会产生微小的暗电流,这些暗电流可能是噪点会影响后期的调试。因此,我们便将这些电流处理为0,成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平: …...
编程技能:字符串函数04,直接使用 strcpy,解决报错
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:字符串函数03,strncpy 回到目录…...
网络编程超时检测,unix域套接字,粘包
刷题: # 超时检测核心要点## 1. 基本类型### 阻塞模式- 永久等待数据,无超时机制- 典型函数:recv()阻塞调用### 非阻塞模式- 立即返回结果(成功/错误)- 设置方式:fcntl(fd, F_SETFL, O_NONBLOCK)### 超时检…...
springboot AOP 接口限流(基于IP的接口限流和黑白名单)
使用 Spring Boot 自定义注解和AOP实现基于IP的接口限流和黑白名单 在我们日常开发的项目中为了保证系统的稳定性,很多时候我们需要对系统做限流处理,它可以有效防止恶意请求对系统造成过载。常见的限流方案主要有: 网关限流: NG…...
Python uv包管理器使用指南:从入门到精通
Python uv包管理器使用指南:从入门到精通 作为一名Python开发者,你是否曾经为虚拟环境管理和依赖包安装而头疼?今天我要向大家介绍一个强大的工具——uv包管理器,它将彻底改变你的Python开发体验。 什么是uv包管理器?…...
【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证
TLS工作流程简化版 证书验证流程 客户端通过CA的公钥验证服务器数字证书的签名,确保服务器身份可信,防止中间人攻击。 预主密钥加密传输 客户端生成预主密钥,用服务器证书中的公钥加密后发送给服务器,只有服务器(持有…...
Stable Diffusion WebUI 插件大全:功能详解与下载地址
Stable Diffusion WebUI 的强大之处在于其丰富的插件生态,这些插件可以大幅提升 AI 绘画的效率和质量。本文将详细介绍 21 个常用插件,包括它们的功能、效果说明以及下载地址,帮助你更好地使用 Stable Diffusion WebUI。 插件的安装方式 直…...
【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略
文章目录 🎮 策略模式(Strategy Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(动态伤害计算系统)1. 定义策略接口与上下文2. 实现具体策略3. 客户端使用 四、模式进阶技巧1. 策略组合2. 策…...
第二十九节:直方图处理-直方图均衡化
在数字图像处理中,直方图均衡化(Histogram Equalization)是一种经典的对比度增强技术。它通过重新分配图像像素的亮度值,使图像的灰度级分布更加均匀,从而显著提升图像的视觉效果。 一、直方图基础 1.1 什么是直方图? 直方图(Histogram)是图像处理中用于描述图像像素…...
性能比拼: Nginx vs. Envoy
本内容是对知名性能评测博主 Anton Putra Nginx vs. Envoy performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 Envoy 被设计为服务网格中的高性能代理。 你可以将它部署在虚拟机(VM)中,或作为 sidecar 方式部…...