微信小程序开发第八课

一 公告

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.rhkb.cn/news/431596.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 核心

Spring 核心 这篇文章&#xff0c;我们换个思路来学习&#xff0c;来践行一下以始为终&#xff0c;以面试题为引来重温一下Spring&#xff0c;毕竟孔子曾说&#xff0c;“温故而知新&#xff0c;可以为师矣。” &#xff0c;可以通过这个链接看看有哪些常见的面试题 Spring 面…

架构师案例思路:架构设计(附真题)

目录 案例题目规则 架构设计案例分析 知识总纲(理解并背诵) 架构风格(理解并背诵) 质量属性(理解并背诵) 性能 可靠性 可用性 可修改性 功能性 可变性 互操作性 架构评估(理解并背诵) 具体架构风格(理解) 层次架构 两层C/S架构 三层C/S架构 B/S架构…

使用 Nuxt Kit 的构建器 API 来扩展配置

title: 使用 Nuxt Kit 的构建器 API 来扩展配置 date: 2024/9/24 updated: 2024/9/24 author: cmdragon excerpt: 摘要:本文详细介绍了如何使用 Nuxt Kit 的构建器 API 来扩展和定制 Nuxt 3 项目的 webpack 和 Vite 构建配置,包括扩展Webpack和Vite配置、添加自定义插件、…

简单学习 原码反码补码 学会了你才是真正的程序员了

一、简单介绍原码反码补码 首先我们需要知道的是原码反码补码是一个人为的行为&#xff0c;因为机器看的都是所谓的补码&#xff0c;这个反码只是作为补码的到原码也就是人能看懂的跳板&#xff0c;所以计算机无论是计算器里面的东西还是他底层运行的二进制代码都是补码&#x…

思科认证难考吗?思科认证备考方法与技巧分享

思科认证在IT行业具有广泛的认可度&#xff0c;表明持有者拥有专业的技术能力水平&#xff0c;对未来的升职加薪有很大帮助。但在考思科认证之前很多人都担心“思科认证难考吗”这个问题&#xff0c;实际上这主要看你考的认证等级&#xff0c;ccna、ccnp等。此外&#xff0c;考…

代码随想录算法day40 | 动态规划算法part13 | 647. 回文子串,516.最长回文子序列

647. 回文子串 动态规划解决的经典题目&#xff0c;如果没接触过的话&#xff0c;别硬想 直接看题解。 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的…

2024/9/25 英语每日一段

“Banning phones or social media is something parents often do as a form of punishment, me included. But in doing so you make the phone even more important, taking on this totemic importance in your child’s eyes,” she says. Goodin says that young people …

基于springboot+vue超市管理系统

基于springbootvue超市管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本无人超市管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

CNN网络训练WISDM数据集:模型仿真及可视化分析

卷积神经网络&#xff08;CNN&#xff09;因其强大的特征提取能力和深度学习架构而备受推崇&#xff0c;CNN在处理图像数据时展现出的卓越性能&#xff0c;使其成为解决各种视觉识别任务的首选工具。WISDM数据集是一个广泛用于运动估计研究的基准数据集&#xff0c;它包含了多个…

腾讯邮箱上传附件卡、慢、无法上传问题处理

1、检查文件中转站容量是否已满 2、建议用户打开链接https://exmail.qq.com/qy_mng_logic/wasmHelper?typehashv2&#xff0c;看是否可以正常访问。&#xff08;能打开下载就表示可以正常访问&#xff09; 3、让用户切换到4G或者其他网络再重新上传附件是否会重现问题&#xf…

(14)关于docker如何通过防火墙做策略限制

关于docker如何通过防火墙做策略限制 1、iptables相关问题 在Iptables防火墙中包含四种常见的表&#xff0c;分别是filter、nat、mangle、raw。 filter&#xff1a;负责过滤数据包。 filter表可以管理INPUT、OUTPUT、FORWARD链。 nat&#xff1a;用于网络地址转换。 nat表…

FTP服务搭建

FTP服务搭建 yum install vsftp匿名用户模式 备份配置文件&#xff0c;并重新生成一个 mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak cat /etc/vsftpd/vsftpd.conf_bak | grep -v "#" > /etc/vsftpd/vsftpd.conf{local_enableYES write_enableYES …

Redis 分布式缓存服务(集群)

作者&#xff1a;程序那点事儿 日期&#xff1a;2023/11/17 13:05 准备6台虚拟机&#xff0c;ip分别是 192.168.10.101 192.168.10.102 192.168.10.103 192.168.10.104 192.168.10.105 192.168.10.106 创建6个节点 mkdir -p /usr/local/cluster/redis-node1 #对应192.168.10.…

【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别&#xff1a; 4.PCB&#xff08;程序控制块&#xff09; 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

心觉:如何重塑高效学习的潜意识(1)两种方法的优缺点

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作180/1000天 你的学习习惯是什么呢 学习的时候是感到轻松吗 很多人感觉现在是知识大爆炸的时代&#xff0c;每天都会产生海量的知…

人工智能助力阿尔茨海默症治疗:微软与上海精神卫生中心的新研究

最近&#xff0c;微软研究院与上海市精神卫生中心合作&#xff0c;基于微软 Azure OpenAI 服务中的多模态大模型&#xff0c;开发了一种名为“忆我”&#xff08;ReMe&#xff09;的个性化认知训练框架。这一创新项目旨在通过数字化手段扩展自动化认知训练的范围&#xff0c;为…

Spring MVC 参数校验 总结

1. 简介 Sping MVC提供了参数校验的方便注解。 2.代码 在pom.xml中添加依赖&#xff1a; <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version&g…

如何提升亚马逊与速卖通的关键词搜索排名?

在电商平台上&#xff0c;一个不可忽视的事实是&#xff0c;大部分消费者&#xff08;超过80%&#xff09;在搜索产品时&#xff0c;主要集中在搜索结果的前两页。如果你的产品未能跻身这些显眼的位置&#xff0c;很可能就会错失大量的潜在客户。因此&#xff0c;提升关键词搜索…

PG duckdb插件 pg_quack部署与使用

一.pg_quack简介 pg_quack 是一个创新的 PostgreSQL扩展&#xff0c;它将 DuckDB-—一个嵌入式列式数据库 管理系统集成到PostgreSQL中。这个开源项目为开发者提供了一种在同一个数据 库环境中利用高性能数据处理和存储的新方式,使得在PostgreSQL在OLAP的性能 上得到了很大的提…