微信小程序开发第八课

一 公告

1.1 微信小程序端

#js###const api = require("../../config/settings.js")
Page({data: {noticeList: [{title: '公告标题1',create_time: '2024-04-25',content: '公告内容描述1,公告内容描述1,公告内容描述1。', // 可以根据实际情况添加更多内容igm: '/images/notice/notice1.jpg' // 图片路径,根据实际情况修改},{title: '公告标题2',create_time: '2024-04-26',content: '公告内容描述2,公告内容描述2,公告内容描述2。', // 可以根据实际情况添加更多内容igm: '/images/notice/notice2.jpg' // 图片路径,根据实际情况修改},// 可以添加更多社区公告数据]},onLoad: function () {// 页面加载时执行的逻辑this.refresh()},refresh(){wx.showLoading({mask: true})wx.request({url: api.notice,method: "GET",success: (res) => {this.setData({noticeList: res.data})},complete() {wx.hideLoading()}})}
})#####wxml##
<!-- community_notice.wxml -->
<view class="container"><!-- 使用wx:for循环遍历社区公告列表 --><view wx:for="{{noticeList}}" wx:key="index" class="notice-item"><!-- 左侧图片 --><image class="notice-image" src="{{item.igm}}" mode="aspectFill"></image><!-- 右侧内容 --><view class="notice-content"><view class="notice-title">{{item.title}}</view><view class="notice-time">{{item.create_time}}</view><view class="notice-details">{{item.content}}</view></view></view>
</view>###wxss###
/* community_notice.wxss */
.container {padding: 20rpx;
}.notice-item {display: flex;align-items: flex-start;margin-bottom: 20rpx; /* 添加间距 */border-bottom: 1px solid #f0f0f0; /* 添加底部边框 */padding-bottom: 20rpx; /* 增加底部内边距 */
}.notice-image {width: 150rpx;height: 120rpx;border-radius: 6rpx;margin-right: 20rpx;
}.notice-content {flex: 1;
}.notice-title {font-size: 28rpx;font-weight: bold;margin-bottom: 10rpx;
}.notice-time {font-size: 24rpx;color: #666666;margin-bottom: 10rpx;
}.notice-details {font-size: 24rpx;color: #333333;
}

1.2 后端接口

####views.py######
from .models import Notice
from .serializer import NoticeSerializer
class NoticeView(GenericViewSet,ListModelMixin):queryset =Notice.objects.all().order_by('create_time')serializer_class = NoticeSerializer###serilizer.py#######
class NoticeSerializer(serializers.ModelSerializer):class Meta:model = Noticefields = ['id', 'title','igm','create_time','content']extra_kwargs={'create_time':{'format':"%Y-%m-%d"}}

二 活动列表

2.1 小程序端

##### js####
var app = getApp();
var api = require("../../config/settings.js")
Page({data: {activityList: []},onLoad: function () {// 页面加载时执行的逻辑this.refresh()},refresh(){wx.showLoading({mask: true})wx.request({url: api.activity,method: "GET",success: (res) => {this.setData({activityList: res.data})},complete() {wx.hideLoading()}})},handleSignup: function (event) {// 处理报名按钮点击事件var index = event.currentTarget.dataset.index; // 获取当前点击的活动索引console.log('点击了报名按钮,索引为:', index);}
})
###wxml#####
<!-- activity_signup.wxml -->
<view class="container"><!-- 使用wx:for循环遍历活动报名列表 --><view wx:for="{{activityList}}" wx:key="index" class="activity-item"><!-- 活动内容 --><view class="activity-content"><view class="activity-title">{{item.title}}</view><view class="activity-enrollment">报名人数:{{item.count}}  |  总人数:{{item.total_count}}</view><view class="activity-time">获得积分:{{item.score}}</view><view class="activity-time">{{item.date}}</view><view class="activity-description">{{item.text}}</view> </view><!-- 报名按钮 --><button class="signup-btn" bindtap="handleSignup">报名</button></view>
</view>###wxss###
/* activity_signup.wxss */
.container {padding: 20rpx;
}.activity-item {display: flex;align-items: flex-start;justify-content: space-between;margin-bottom: 20rpx;border-bottom: 1px solid #ebebeb;padding-bottom: 20rpx;
}.activity-content {flex: 1;
}.activity-title {font-size: 28rpx;font-weight: bold;margin-bottom: 10rpx;
}.activity-time {font-size: 24rpx;color: #666666;margin-bottom: 10rpx;
}.activity-enrollment {font-size: 24rpx;color: #999999;margin-bottom: 10rpx;
}.activity-description {font-size: 24rpx;color: #333333;margin-top: 10rpx;white-space: pre-wrap; /* 自动换行 */
}.signup-btn {background-color: #50c8ff;color: #ffffff;border: none;border-radius: 4rpx;padding: 10rpx 20rpx;font-size: 24rpx;
}

2.2 后端接口

####视图类
from .models import Activity
from .serializer import ActivitySerializer
class ActivityView(GenericViewSet,ListModelMixin):queryset =Activity.objects.all().order_by('date')serializer_class = ActivitySerializer
### 序列化类
class ActivitySerializer(serializers.ModelSerializer):class Meta:model = Activityfields = ['id', 'title','text','date','count','score','total_count']extra_kwargs={'date':{'format':"%Y-%m-%d"}}
##表模型
class UserInfo(models.Model):name = models.CharField(verbose_name="姓名", max_length=32)avatar = models.FileField(verbose_name="头像", max_length=128, upload_to='avatar')create_date = models.DateField(verbose_name="日期", auto_now_add=True)score = models.IntegerField(verbose_name="积分", default=0)class Meta:verbose_name_plural = '用户表'def __str__(self):return self.name#  活动表
class Activity(models.Model):title = models.CharField(verbose_name="活动标题", max_length=128)text = models.TextField(verbose_name="活动描述", null=True, blank=True)date = models.DateField(verbose_name="举办活动日期")count = models.IntegerField(verbose_name='报名人数', default=0)total_count = models.IntegerField(verbose_name='总人数', default=0)score = models.IntegerField(verbose_name="积分", default=0)join_record = models.ManyToManyField(verbose_name="参与者",through="JoinRecord",through_fields=("activity", "user"),to="UserInfo")class Meta:verbose_name_plural = '活动表'def __str__(self):return self.title
#  活动报名记录
class JoinRecord(models.Model):user = models.ForeignKey(verbose_name='用户', to="UserInfo", on_delete=models.CASCADE)activity = models.ForeignKey(verbose_name="活动", to="Activity", on_delete=models.CASCADE, related_name='ac')exchange = models.BooleanField(verbose_name="是否已兑换", default=False)class Meta:verbose_name_plural = '活动报名记录'

三 登录功能

login

3.1 小程序端 my页面

############ wxml##############<block wx:if="{{userInfo==null}}">
<!-- login.wxml -->
<view class="container1"><view class="main"><view class="icon-view"><!-- 应用图标 --><image src="/images/icon/icon.png" class="app-icon"></image><text class="title">智慧社区</text></view></view><van-cell-group><van-cell><button type="warn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">手机号快捷登录</button></van-cell></van-cell-group><!-- 其他手机号登录 --><van-cell-group><van-cell><button type="primary" plain bindtap="handleOtherLogin">其他手机号登录</button></van-cell></van-cell-group><!-- 用户协议同意 --><view class="agreement-container"><checkbox class="checkbox" value="{{agreed}}" bindchange="handleAgreeChange"></checkbox><text class="agreement-text">我已阅读并同意</text><navigator url="" class="agreement-link">《用户协议》</navigator></view>
</view>
</block>
<block wx:else><view class="container"><view class="top-view"><view class="user"><view class="row"><image class="avatar" src="{{userInfo.avatar}}"></image><view class="name"><view bindtap="logout">{{userInfo.name}}</view></view></view></view><view class="numbers"><view class="row"><text>{{userInfo.score}}</text><text>积分</text></view><view class="row"><text>55</text><text>其他</text></view><view class="row"><text>77</text><text>其他</text></view><view class="row"><text>56</text><text>其他</text></view></view></view><van-list><van-cell title="积分兑换记录" is-link /><van-cell title="我参加的活动" is-link /><van-cell title="分享应用" is-link /><van-cell title="联系客服" is-link /><van-cell title="退出登录" is-link bind:tap="handleLogout"/></van-list>
</view></block>##################js####################
var app = getApp();
var api = require("../../config/settings.js")
Page({data: {userInfo: null,},getPhoneNumber(event) {console.log(event)// 通过获取手机号返回的code--传递给后端--后端调用:POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN -->获取手机号--》后端签发token给前端wx.request({url: api.quick_login,method: 'POST',data: {code: event.detail.code},success: (res) => {console.log(res)//在此返回登录信息,用户登录var data = res.data;console.log(data)if (data.code == 100) {console.log('---', data)var token = data.tokenvar name = data.namevar score = data.scorevar avatar = data.avatarapp.initUserInfo(name, score, avatar, token)var info = app.globalData.userInfoconsole.log('globalData.userInfo', info)if (info) {this.setData({userInfo: info})}} else {wx.showToast({title: '登录失败',})}}})},handleOtherLogin(e) {wx.navigateTo({url: '/pages/otherlogin/otherlogin'})},onShow() {var info = app.globalData.userInfoconsole.log('globalData.userInfo', info)if (info) {this.setData({userInfo: info})}},handleLogout() {app.logoutUserInfo()this.setData({userInfo: null})}
})#################wxss##################page{height: 100%;
}.login-area{height: 100%;display: flex;flex-direction: column;justify-content: center;align-items: center;
}
.login-area .btn{width: 200rpx;height: 200rpx;border-radius: 500%;background-color: #5cb85c;color: white;display: flex;flex-direction: row;align-items: center;justify-content: center;
}.user-area{height: 100%;display: flex;flex-direction: column;justify-content: center;align-items: center;
}
.user-area image{width: 200rpx;height: 200rpx;border-radius: 500%;
}
.user-area .name{font-size: 30rpx;padding: 30rpx 0;
}.user-area .logout{color: #a94442;
}.top-view{background-color: #01ccb6;color: white;padding: 40rpx;
}.top-view .user{display: flex;flex-direction: row;justify-content: space-between;align-items: center;
}
.top-view .user .row{display: flex;flex-direction: row;justify-content: flex-start;align-items: center;
}
.top-view .user .avatar{width: 100rpx;height: 100rpx;border-radius: 50%;
}.top-view .user .name{display: flex;flex-direction: row;justify-content: flex-start;padding-left: 20rpx;
}
.top-view .user .name navigator{padding: 0 5rpx;
}.top-view .site{background-color: rgba(0, 0, 0, 0.16);padding: 20rpx;border-top-left-radius: 32rpx;border-bottom-left-radius: 32rpx;
}.top-view .numbers{display: flex;flex-direction: row;justify-content: space-between;font-size: 28rpx;padding: 40rpx;padding-bottom: 0rpx;
}.top-view .numbers .row{display: flex;flex-direction: column;align-items: center;
}/* login.wxss */
.container1 {padding: 20rpx;
}
.main{display: flex;justify-content: center;align-items: center;
}
.icon-view{display: flex;flex-direction: column;margin-bottom: 50rpx;
}.app-icon {width: 100rpx;height: 100rpx;margin: 40rpx auto 20rpx; /* 上边距为40rpx,下边距为20rpx,左右居中 */
}.quick-login-header {display: flex;align-items: center;
}.icon {width: 40rpx;height: 40rpx;margin-right: 20rpx;
}.title {font-size: 28rpx;font-weight: bold;color: #333333;
}.divider {height: 20rpx;
}.login-option {font-size: 28rpx;color: #333333;
}.login-option .van-cell__icon {color: #07c160;
}.agreement-container {display: flex;align-items: center;margin-top: 20rpx;
}.checkbox {margin-right: 10rpx;
}.agreement-text {font-size: 24rpx;color: #666666;
}.agreement-link {font-size: 24rpx;color: #07c160;
}

3.2 小程序端-app.js

// app.js
App({globalData: {userInfo: null},initUserInfo: function(name,score,avatar,token) {var info = {name: name,score: score,avatar: avatar,token:token};this.globalData.userInfo = infowx.setStorageSync('userInfo', info);},logoutUserInfo:function(){wx.removeStorageSync('userInfo');this.globalData.userInfo=null;},onLaunch(){var info =wx.getStorageSync('userInfo')console.log(info)this.globalData.userInfo = info}
})####app.json###"usingComponents": {"van-field": "@vant/weapp/field/index","van-button": "@vant/weapp/button/index","van-cell-group": "@vant/weapp/cell-group/index","van-nav-bar": "@vant/weapp/nav-bar/index", "van-grid": "@vant/weapp/grid/index","van-grid-item": "@vant/weapp/grid-item/index", "van-cell": "@vant/weapp/cell/index","van-notice-bar": "@vant/weapp/notice-bar/index","van-image": "@vant/weapp/image/index","van-divider": "@vant/weapp/divider/index","van-tab": "@vant/weapp/tab/index","van-tabs": "@vant/weapp/tabs/index","van-dropdown-menu": "@vant/weapp/dropdown-menu/index","van-dropdown-item": "@vant/weapp/dropdown-item/index"},

3.3 小程序端-settings.js

//const rootUrl = 'http://127.0.0.1:8000/app01';
const rootUrl = 'http://192.168.71.100:8000/app01';module.exports = {welcome:rootUrl+'/welcome/',banner:rootUrl+'/banner/',collection:rootUrl+'/collection/',statistics:rootUrl+'/statistics/',face:rootUrl+'/face/',voice:rootUrl+'/voice/',notice:rootUrl+'/notice/',activity:rootUrl+'/activity/',quick_login:rootUrl+'/user/quick_login/',send_sms:rootUrl+'/user/send_sms/',login:rootUrl+'/user/login/',}

3.4 小程序端-login

######wxml#####
<view class="container"><view class="main"><view class="icon-view"><!-- 应用图标 --><image src="/images/icon/icon.png" class="app-icon"></image><text class="title">智慧社区</text></view></view><van-field value="{{ phone }}" bind:input="onPhoneInput" label="手机号" type="tel" placeholder="请输入手机号" clearable="{{ true }}" /><van-field value="{{code}}" bind:input="onCodeInput" center clearable label="验证码" placeholder="请输入验证码" use-button-slot><van-button slot="button" size="small" type="primary" bind:tap="sendCode" disabled='{{sendCodeDisabled}}'>{{buttonText}}</van-button></van-field><van-button type="info" block="{{ true }}" bind:tap="login">登录</van-button>
</view>
######wxss####
.container {padding: 20rpx;}
.main{display: flex;justify-content: center;align-items: center;
}
.icon-view{display: flex;flex-direction: column;margin-bottom: 50rpx;
}
.title {font-size: 28rpx;font-weight: bold;color: #333333;
}
.app-icon {width: 100rpx;height: 100rpx;margin: 40rpx auto 20rpx; /* 上边距为40rpx,下边距为20rpx,左右居中 */
}#####js#####
const api = require("../../config/settings.js")
var app = getApp()
Page({data: {phone: '',code: '',agreed: false,sendCodeDisabled: false,buttonText: '发送验证码',loading: false,timer: null,countDown: 60},// 监听手机号输入
onPhoneInput(event) {this.setData({phone: event.detail});
},// 监听验证码输入
onCodeInput(event) {this.setData({code: event.detail});
},// 发送验证码sendCode() {// 在这里编写发送验证码的逻辑,此处仅做示例console.log('发送验证码',this.data.phone,this.data.code);if(this.data.phone){wx.request({url: api.send_sms+'?mobile='+this.data.phone,method:'GET',success:(res)=>{wx.showToast({title: res.data.msg,})}})this.setData({sendCodeDisabled: true,timer: setInterval(this.countDown, 1000)});}else{wx.showToast({title: '请输入手机号',})}},// 登录login() {// 在这里编写登录逻辑,此处仅做示例console.log('登录');if(this.data.phone&&this.data.code){wx.request({url: api.login,method:'POST',data:{mobile:this.data.phone,code:this.data.code},success:(res)=>{var data = res.data;console.log(data)if (data.code == 100) {console.log('---', data)var token = data.tokenvar name = data.namevar score = data.scorevar avatar = data.avatarapp.initUserInfo(name, score, avatar, token)var info = app.globalData.userInfoconsole.log('globalData.userInfo', info)wx.navigateBack()} else {wx.showToast({title: '登录失败',})}}})this.setData({sendCodeDisabled: true,timer: setInterval(this.countDown, 1000)});}else{wx.showToast({title: '请输入手机号和验证码',})}},// 倒计时countDown() {let countDown = this.data.countDown;if (countDown === 0) {clearInterval(this.data.timer);this.setData({buttonText: '发送验证码',sendCodeDisabled: false,countDown: 60});return;}this.setData({buttonText: countDown + 's',countDown: countDown - 1});},onUnload() {clearInterval(this.data.timer);}
});

3.3 后端接口

##### 路由##########
router.register('user', LoginView, 'user')####视图函数#############
# 登录接口
from libs.send_tx_sms import get_code, send_sms_by_phone
from django.core.cache import cache
from rest_framework.decorators import action
from .models import UserInfo
from rest_framework_simplejwt.tokens import RefreshToken
from faker import Fakerclass LoginView(GenericViewSet):@action(methods=['GET'], detail=False)def send_sms(self, request, *args, **kwargs):# 1 取出前端传入手机号mobile = request.query_params.get('mobile')# 2 获取随机验证码code = get_code()# 3 验证码放到缓存cache.set(f'sms_{mobile}', code)# 4 发送短信res = send_sms_by_phone(mobile, code)if res:return Response({'code': 100, 'msg': '短信发送成功'})else:return Response({'code': 101, 'msg': '短信发送失败,请稍后再试'})@action(methods=['POST'], detail=False)def login(self, request, *args, **kwargs):# 1 取出手机号和验证码mobile = request.data.get('mobile')code = request.data.get('code')# 2 校验验证码是否正确old_code = cache.get(f'sms_{mobile}')if old_code == code:# 3 数据库查询用户,如果存在直接签发token登录成功user = UserInfo.objects.filter(mobile=mobile).first()if not user:# 4 如果用户不存在,创建用户,再签发tokenfake = Faker('zh_CN')username = fake.name()user = UserInfo.objects.create(mobile=mobile, name=username)refresh = RefreshToken.for_user(user)return Response({'code': 100, 'msg': '登录成功', 'token': str(refresh.access_token), 'name': user.name,'score': user.score,'avatar':'http://127.0.0.1:8000/media/'+str(user.avatar)})else:return  Response({'code':101,'msg':'验证码错误'})@action(methods=['POST'], detail=False)def quick_login(self, request, *args, **kwargs):# 1 取出前端传入的codecode = request.data.get('code')# 2 通过code,调用微信开发平台接口,换取手机号# 3 拿到手机号再自己库中查,能查到,签发token# 4 查不到注册再签发token# 假数据---》都签发成第一个用户user=UserInfo.objects.filter(pk=1).first()refresh = RefreshToken.for_user(user)return Response({'code': 100, 'msg': '登录成功', 'token': str(refresh.access_token), 'name': user.name,'score': user.score,'avatar':'http://127.0.0.1:8000/media/'+str(user.avatar)})

四 活动报名

4.1 小程序端

#### js####handleSignup: function (event) {// 1 校验用户是否登录var info = app.globalData.userInfoif (info) {//2 处理报名按钮点击事件var index = event.mark.id; // 获取当前点击的活动索引console.log('点击了报名按钮,索引为:', index);wx.request({url: api.join,method:'POST',data:{'id':index},header:{token:info.token},success:(res)=>{wx.showToast({title: res.data.msg,})}})} else {wx.showToast({title: '请先登录',})}}

4.2 后端接口

####视图类#####
class ActivityJoinView(GenericViewSet):authentication_classes = [MyJSONWebTokenAuthentication]@action(methods=['POST'], detail=False)def join(self, request, *args, **kwargs):# 1 取出要参加的活动idactivity_id = request.data.get('id')# 2 取出当前登录用户user = request.user# 2 查到当前活动activity = Activity.objects.filter(pk=activity_id).first()# 3 判断时间,判断人数# 4 判断是否报名过join_record=JoinRecord.objects.filter(activity_id=activity_id,user=user).first()if join_record:return Response({'code': 101, 'msg': "已经报名过,不用重复报名"})else:# 5 包名人数+1,报名报存入activity.count = activity.count + 1activity.save()JoinRecord.objects.create(activity=activity,user=user)# 6 返回报名成功return Response({'code': 100, 'msg': "报名成功"})#####认证类#####
from .models import UserInfo
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_simplejwt.authentication import JWTAuthenticationclass MyJSONWebTokenAuthentication(JWTAuthentication):def authenticate(self, request):jwt_value = request.META.get("HTTP_TOKEN")if not jwt_value:raise AuthenticationFailed('token 字段是必须的')validated_token = self.get_validated_token(jwt_value)print(validated_token['user_id'])user = UserInfo.objects.filter(pk=validated_token['user_id']).first()return user, jwt_value

五 积分商城

5.1 小程序端

#####wxml####
<van-dropdown-menu active-color="#1989fa"><van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" /><van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" />
</van-dropdown-menu><van-grid column-num="3" border="{{ true }}"><van-grid-item use-slot wx:for="{{ 8 }}" wx:for-item="index" border><image style="width: 100%; height: 90px;" src="https://img.yzcdn.cn/vant/apple-{{ index + 1 }}.jpg" /><view class="desc"><view class="title">{{item.title}}</view><view class="exchange"><view>{{item.price}}积分</view><van-button color="linear-gradient(to right, #4bb0ff, #6149f6)" bindtap="doExchange" data-gid="{{item.id}}" size="mini">兑换</van-button></view></view></van-grid-item></van-grid>#### js###
const api = require("../../config/settings")
var app = getApp()
Page({data: {option1: [{ text: '全部商品', value: 0 },{ text: '最新上架', value: 1 },{ text: '活动商品', value: 2 },],option2: [{ text: '默认排序', value: 'a' },{ text: '好评排序', value: 'b' },{ text: '销量排序', value: 'c' },],value1: 0,value2: 'a',},})####json###
{"usingComponents": {},"navigationBarTitleText": "积分商城"
}

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

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

相关文章

如何用Stable Diffusion XL模型,绘制精致的二次元插图,学完就能用!

哈喽大家好&#xff0c;我是画画的小强&#xff0c;持续分享AI相关知识干活。 今天给大家推荐一款Stable Diffusion XL二次元模型&#xff0c;这款模型在C站的下载排行很高&#xff0c;而且质量绘制出的二次元人物和场景都非常的棒&#xff01;那么首先介绍一些什么是Stable D…

火了!清华大学终于把Python整理成动画片了,教学通俗易懂,学完即可就业!

在当今人工智能时代&#xff0c;编程技能的重要性日益凸显。而Python作为一门广泛应用且易于学习的编程语言&#xff0c;就受到了众多学习者的青睐。 清华大学&#xff0c;作为国内顶尖的高等学府&#xff0c;其教育资源与师资力量无需多言。这部动画版教程&#xff0c;正是集…

Frontiers出版社系列SCISSCI合集

【SciencePub学术】本期&#xff0c;小编根据WOS数据库&#xff0c;整理了一下Frontiers出版社系列的SCI&SSCI合集&#xff0c;以供各位学者投稿参考&#xff01; 来源&#xff1a;WOS数据库 Frontiers系列期刊中&#xff0c;Frontiers in Immunology以其5.7分的影响因子位…

st7735调试记录

由于该模块陪我已经超过十年&#xff0c;最近想起来学习下lvgl&#xff0c;于是乎将其拿出来&#xff0c;尝试使能该模块从而学会lvgl 第一步肯定是找到资料确定下该模块是否好用。于是到网络上找到如下资料进行验证&#xff1a; https://pan.baidu.com/s/1CEunLuGUqLABR6I0UZ…

海外云手机在电商运营中的优势解析

近年来&#xff0c;海外云手机被越来越多人熟知&#xff0c;凭借云计算与电子商务的结合&#xff0c;成为出海电商企业高效、灵活的运营工具。本文将从多个角度详细解析海外云手机在电商运营中的主要优势。 一、成本节约 相比传统出海电商所依赖的实体设备如手机和电脑&#xf…

RPC框架开发——理解项目功能

目录 一、RPC的概念 二、使用分布式架构 三、进一步改进 四、最终框架 一、RPC的概念 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种通信机制&#xff0c;使得客户端能够像调用本地函数一样调用远程服务器上的函数。本质上是客户端需要…

均衡功能,保障安全丨基于极海 G32A1445 汽车通用 MCU 的 BMU 应用方案

BMS电池管理系统是每个电动汽车车企不断优化改进的应用产品&#xff0c;其组成中的BMU用于实现电流检测、绝缘检测、SOC估算、容量累积、报警功能、充放电管理、远程监控等功能。BMU组成包括微控制器系统、充放电管理单元、CAN通信网络单元&#xff08;采集所有从控单体电池信息…

螺丝头与螺杆检测系统源码分享

螺丝头与螺杆检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

如何使用ssm实现基于ssm的高校大学生党建系统

TOC ssm688基于ssm的高校大学生党建系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

Vue学习记录之八(局部组件,全局组件,递归组件,动态组件)

一、局部组件 在src\components\Card.vue 建立一个文件&#xff0c;代码如下&#xff1a; <template><div class"card"><header><div>标题</div><div>副标题</div></header><section>内容</section>&…

2024软件测试面试八股文(有答案版),金九银十季,涨薪涨薪_八股文软件测试面试题

因为我们项目的用户活动和三方合作平台比较多&#xff0c;一般半个月或者1个月肯定会有一个迭代版本&#xff0c; 假如用户或者合作方突然有很紧急的需求&#xff0c;那一般老大他们会向上发邮件和OA呈批给(产品经理&#xff0c;项目经理)&#xff0c;如果通过了就会马上加急处…

【Go语言】深入解读Go语言中的指针,助你拨开迷雾见月明

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

《操作系统 - 清华大学》1 -1:操作系统概述 —— 内容概述

文章目录 1. 内容摘要2. 实验内容 1. 内容摘要 在这里对学习内容做一个整体上的介绍&#xff0c;那在这里包括我们要学习的内容&#xff0c;实验的内容。操作系统课涉及到计算机系统当中的资源管理&#xff0c;所以我们围绕着操作系统的实现来介绍相关内容&#xff0c;那主要分…

优化 Go 语言数据打包:性能基准测试与分析

场景&#xff1a;在局域网内&#xff0c;需要将多个机器网卡上抓到的数据包同步到一个机器上。 原有方案&#xff1a;tcpdump -w 写入文件&#xff0c;然后定时调用 rsync 进行同步。 改造方案&#xff1a;使用 Go 重写这个抓包逻辑及同步逻辑&#xff0c;直接将抓到的包通过网…

大势智慧亮相“第十届博博会”,展现数字文旅新质生产力!

2024年8月23日至26日&#xff0c;由国家文物局指导&#xff0c;中国博物馆协会主办的第十届“中国博物馆及相关产品与技术博览会”&#xff08;简称“博博会”&#xff09;在呼和浩特敕勒川国际会展中心成功举办。 呼和浩特敕勒川国际会展中心 大势智慧携数字文旅全栈解决方案以…

SpringBoot框架下的客户管理策略

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;企业客户管理系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从员工的实际需求出发&#xff0c;通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

新能源汽车充电桩怎么选?

新能源汽车是我国七大战略性新兴产业之一&#xff0c;已成为汽车产业转型升级的重要推动力。毫无疑问。充电桩作为我国新能源汽车产业链下游的重要环节&#xff0c;在国家政策的大力支持和市场需求的带动下&#xff0c;有着非常广阔的前景。安科瑞叶西平187-06160015 新能源汽…

数据结构---顺序表之单链表

1.链表的概念 链表是一种逻辑上是线性的&#xff0c;但物理结构不一定是线性的数据结构&#xff0c;它通过链表中的指针链接次序实现的 链表的存储空间是我们通过动态内存开辟的内存空间&#xff0c;所以他们的地址可能是连续的也可能不是连续的 2.链表的分类 1.单向或者双向…

Footprint Analytics: 我们为何打造 Growthly 这款产品

在 Web3 的领域内&#xff0c;数据已成为新的“财富”。在 Footprint Analytics&#xff0c;我们始终站在区块链数据分析的最前沿&#xff0c;提供全方位的解决方案&#xff0c;为 Web3 生态中的企业和项目简化数据分析的复杂性。然而&#xff0c;随着我们对客户需求及行业趋势…

VLAN原理与接口

在学习之前&#xff0c;先抛出问题&#xff1a;什么是VLAN&#xff1f;VLAN工作原理是什么&#xff1f;VLAN如何配置&#xff1f; VLAN的定义 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种在逻辑上将局域网设备从物理上划分的网络技…