【微信小程序】实现投票功能(附源码)

一、Vant Weapp介绍

  1.         Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发者不同的需求。
  2.         Vant Weapp 包含了多个常用的组件,如按钮、导航栏、标签、列表、卡片、表单等,这些组件都经过精心设计和优化,可以帮助开发者快速构建出具有良好交互效果和用户体验的小程序页面。此外,Vant Weapp 还提供了常用的功能组件,例如加载提示、弹出框、下拉刷新、上拉加载等,方便开发者实现各种常用的交互功能。
  3.         Vant Weapp 采用了模块化的设计思路,每个组件都是独立的,不会对页面的其他部分产生影响,这样可以更加灵活地使用和维护组件库。同时,Vant Weapp 还提供了详细的文档和示例代码,方便开发者学习和使用。
  4.         Vant Weapp 是一个功能强大、易用性高的微信小程序组件库,它可以帮助开发者快速构建出现代化、具有良好用户体验的小程序应用。Vant Weapp - 轻量、可靠的小程序 UI 组件库 (youzan.github.io)icon-default.png?t=N7T8https://youzan.github.io/vant-weapp/#/dialog

二、后端

1、实体

编写会议实体和投票实体

会议实体

package com.zking.ssm.model;import java.util.Date;public class Info {private Long id;private String title;private String content;private String canyuze;private String liexize;private String zhuchiren;private String location;private Date starttime;private Date endtime;private String fujian;private Integer state;private String auditperson;private Date audittime;private String seatpic;private String remark;public Info(Long id, String title, String content, String canyuze, String liexize, String zhuchiren, String location, Date starttime, Date endtime, String fujian, Integer state, String auditperson, Date audittime, String seatpic, String remark) {this.id = id;this.title = title;this.content = content;this.canyuze = canyuze;this.liexize = liexize;this.zhuchiren = zhuchiren;this.location = location;this.starttime = starttime;this.endtime = endtime;this.fujian = fujian;this.state = state;this.auditperson = auditperson;this.audittime = audittime;this.seatpic = seatpic;this.remark = remark;}public Info() {super();}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getCanyuze() {return canyuze;}public void setCanyuze(String canyuze) {this.canyuze = canyuze;}public String getLiexize() {return liexize;}public void setLiexize(String liexize) {this.liexize = liexize;}public String getZhuchiren() {return zhuchiren;}public void setZhuchiren(String zhuchiren) {this.zhuchiren = zhuchiren;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public Date getStarttime() {return starttime;}public void setStarttime(Date starttime) {this.starttime = starttime;}public Date getEndtime() {return endtime;}public void setEndtime(Date endtime) {this.endtime = endtime;}public String getFujian() {return fujian;}public void setFujian(String fujian) {this.fujian = fujian;}public Integer getState() {return state;}public void setState(Integer state) {this.state = state;}public String getAuditperson() {return auditperson;}public void setAuditperson(String auditperson) {this.auditperson = auditperson;}public Date getAudittime() {return audittime;}public void setAudittime(Date audittime) {this.audittime = audittime;}public String getSeatpic() {return seatpic;}public void setSeatpic(String seatpic) {this.seatpic = seatpic;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}
}

投票实体

package com.zking.ssm.model;public class Option {private Long id;private Long meetingId;private String optionValue;private String optionText;public Option(Long id, Long meetingId, String optionValue, String optionText) {this.id = id;this.meetingId = meetingId;this.optionValue = optionValue;this.optionText = optionText;}public Option() {super();}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getmeetingId() {return meetingId;}public void setmeetingId(Long meetingId) {this.meetingId = meetingId;}public String getoptionValue() {return optionValue;}public void setoptionValue(String optionValue) {this.optionValue = optionValue;}public String getoptionText() {return optionText;}public void setoptionText(String optionText) {this.optionText = optionText;}
}

2、xmlsql

用来访问数据库的数据进行数据的访问,一个访问会议数据,一个访问投票数据。

<select id="voteList" resultMap="BaseResultMap" >select<include refid="Base_Column_List" />from t_oa_meeting_infowhere 1=1<if test="state!=null">and state=#{state}</if><if test="title!=null">and title like concat('%',#{title},'%')</if></select>

<insert id="insertSelective" parameterType="com.zking.ssm.model.Option" >insert into t_oa_meeting_option<trim prefix="(" suffix=")" suffixOverrides="," ><if test="id != null" >id,</if><if test="meetingId != null" >meetingId,</if><if test="optionValue != null" >optionValue,</if><if test="optionText != null" >optionText</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="id != null" >#{id,jdbcType=BIGINT},</if><if test="meetingId != null" >#{meetingId,jdbcType=BIGINT},</if><if test="optionValue != null" >#{optionValue,jdbcType=VARCHAR},</if><if test="optionText != null" >#{optionText,jdbcType=VARCHAR}</if></trim></insert>

3、实现接口

编写方法调用xml里面的sql命令,以便更好的操作数据库里面的数据

编写接口方法

会议

package com.zking.ssm.mapper;import com.zking.ssm.model.Info;import java.util.List;public interface InfoMapper {int deleteByPrimaryKey(Long id);int insert(Info record);int insertSelective(Info record);Info selectByPrimaryKey(Long id);int updateByPrimaryKeySelective(Info record);int updateByPrimaryKey(Info record);List<Info> list(Info info);List<Info> voteList(Info info);
}

投票

package com.zking.ssm.mapper;import com.zking.ssm.model.Option;public interface OptionMapper {int deleteByPrimaryKey(String id);int insert(Option record);int insertSelective(Option record);Option selectByPrimaryKey(String id);int updateByPrimaryKeySelective(Option record);int updateByPrimaryKey(Option record);
}

实现接口

实现会议的接口和投票的接口,需要进行数据的交互。

会议

package com.zking.ssm.service.impl;import com.zking.ssm.mapper.InfoMapper;
import com.zking.ssm.mapper.WxUserMapper;
import com.zking.ssm.model.Info;
import com.zking.ssm.service.InfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** @软件包名 com.zking.ssm.service.impl* @用户 tgq* @create 2023-10-24 上午11:24* @注释说明:*/
@Service
public class InfoServiceImpl implements InfoService {@Autowiredprivate InfoMapper infoMapper;@Overridepublic int updateByPrimaryKeySelective(Info record) {return infoMapper.updateByPrimaryKeySelective(record);}@Overridepublic List<Info> voteList(Info info) {return infoMapper.voteList(info);}
}

投票

package com.zking.ssm.service.impl;import com.zking.ssm.mapper.OptionMapper;
import com.zking.ssm.model.Option;
import com.zking.ssm.service.OptionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @软件包名 com.zking.ssm.service.impl* @用户 tgq* @create 2023-10-24 下午9:57* @注释说明:*/
@Service
public class OptionServiceImpl implements OptionService {@Autowiredprivate OptionMapper om;@Overridepublic int insertSelective(Option record) {return om.insertSelective(record);}
}

4、编写Controller

Controller类进行一个前端和后端的一个数据的交互。

会议

package com.zking.ssm.wxcontroller;import com.zking.ssm.mapper.InfoMapper;
import com.zking.ssm.model.Info;
import com.zking.ssm.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** */
@SuppressWarnings("all")
@RestController
@RequestMapping("/wx/info")
public class WxInfoController {@Autowiredprivate InfoMapper infoMapper;@RequestMapping("/list")public Object list (Info info){List<Info> list = infoMapper.list(info);Map<Object, Object> data = new HashMap<Object, Object>();data.put("infoList",list);return ResponseUtil.ok(data);}@RequestMapping("/votelist")public Object voteList (Info info){List<Info> list = infoMapper.voteList(info);Map<Object, Object> data = new HashMap<Object, Object>();data.put("voteList",list);return ResponseUtil.ok(data);}@RequestMapping("/update")public Object update (Info info){int i = infoMapper.updateByPrimaryKeySelective(info);return ResponseUtil.ok(i);}
}

投票

package com.zking.ssm.wxcontroller;import com.zking.ssm.mapper.InfoMapper;
import com.zking.ssm.mapper.OptionMapper;
import com.zking.ssm.model.Info;
import com.zking.ssm.model.Option;
import com.zking.ssm.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Autho donkee* @Since 2022/7/29*/
@SuppressWarnings("all")
@RestController
@RequestMapping("/wx/option")
public class WxOptionController {@Autowiredprivate OptionMapper optionMapper;@RequestMapping("/insert")public Object insertSelective(Option option) {int i = optionMapper.insertSelective(option);return ResponseUtil.ok(i);}}

三、前端

里面有一些技术这里就不多做讲解了,可以查看我的专栏微信小程序_无法自律的人的博客-CSDN博客。

在这里面运用到了一个小程序的插件Dialog 弹出框 - Vant Weapp (youzan.github.io)。在Vant Weapp里面有很多使用的插件,可以更便捷使用起来,主要引用需要自己查看官方文档了。

1、页面布置

编写主页面的页面布置,里面使用了外部插件的一个弹窗组件。

里面利用到了一个wxs的使用。

wxml

<tabs tabList="{{tabs}}" bindtabsItemChange="tabsItemChange"><view class="search-container"><input class="search-input" bindblur="ontitle" bindblur="onBlur" placeholder="会议标题" /><!-- <input class="search-input" bindinput="searchInputTwo" placeholder="投票标题" /> --><button type="primary" plain="true" size="mini" bindtap="likelist">搜索</button></view>
</tabs>
<view><view class="list" data-id=""><view class="list-img al-center"><image class="video-img" mode="scaleToFill" src=""></image></view><view class="list-detail"><view class="list-title"><text><text style="margin-right: 13rpx;"></text></text></view><view class="list-title"><text></text></view><view class="list-tag"><view class="state al-center"></view><view class="join al-center"><text class="list-count"></text></view></view><view class="list-info"><text style="font-weight: bold;"></text><text></text> <text style="float: right;"></text> </view><view><button class="btn"></button></view></view></view><wxs src="/utils/capture.wxs" module="tools" /><block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id"><view class="list" data-id="{{item.id}}"><view class="list-img al-center"><image class="video-img" mode="scaleToFill" src="/static/persons/7.jpg"></image></view><view class="list-detail"><view class="list-title"><text><text style="margin-right: 13rpx;"> 发 起 人</text> : {{item.zhuchiren}}</text></view><view class="list-title"><text>会议名称 : {{item.title}}</text></view><!-- <view class="list-title"><text>投票标题 : [ {{item.vote}} ]</text></view> --><view class="list-tag"><view class="state al-center">{{tools.getState(item.state)}}</view><view class="join al-center"><text class="list-count">{{tools.getNumber(item.canyuze,item.liexize,item.zhuzhiren)}}</text>人参与会议</view></view><view class="list-info"><text style="font-weight: bold;">地址:</text><text>{{item.location}}</text> <text style="float: right;">开始时间:{{tools.formatDate(item.starttime,'YY-MM-DD hh-mm-ss')}}结束时间:{{tools.formatDate(item.endTime,'YY-MM-DD hh-mm-ss')}}</text> </view><view data-id="{{item.id}}" bindtap="{{data.state == 5 ? 'show1' : 'showPopup'}}"><button class="btn">{{data.state == 5? '开启投票' : '参与投票'}}</button><!-- <button wx:if="{{data.state == 5}}"  class="btn" bindtap="show1">开启投票</button><button wx:else="{{data.state == 6}}" class="btn" bindtap="showPopup">参与投票</button> --></view></view></view></block><view class="section bottom-line"><text>到底啦</text></view>
</view><!-- 开启投票 弹窗-->
<van-dialog use-slot title="请添加投票选项" show="{{ show1 }}" show-cancel-button bind:close="onClose1" bind:confirm="getVoteState"><view class="container"><view class="input-box"><input placeholder="请输入投票选项" bindblur="onOptionValue" bindinput="bindInput"></input></view><view class="checkbox-group"><view class="checkbox-item" data-id="1" bindtap="toggleCheckbox">同意</view><view class="checkbox-item" data-id="2" bindtap="toggleCheckbox">不同意</view><view class="checkbox-item" data-id="3" bindtap="toggleCheckbox">保留意见</view><view class="checkbox-item" data-id="4" bindtap="toggleCheckbox">弃票</view></view></view>
</van-dialog>
<!-- 选择投票选项 弹窗 -->
<van-dialog use-slot title="选择投票" show="{{ show }}" show-cancel-button bind:close="onClose" bind:confirm="getVoteOption"><view class="container"><view class="input-box"><!-- <input placeholder="请输入投票选项" bindinput="bindInput"></input> --></view><view class="checkbox-group"><view class="checkbox-item {{ checkbox1 ? 'active' : '' }}" data-id="1" bindtap="toggleCheckbox">同意</view><view class="checkbox-item {{ checkbox2 ? 'active' : '' }}" data-id="2" bindtap="toggleCheckbox">不同意</view><view class="checkbox-item {{ checkbox3 ? 'active' : '' }}" data-id="3" bindtap="toggleCheckbox">保留意见</view><view class="checkbox-item {{ checkbox4 ? 'active' : '' }}" data-id="4" bindtap="toggleCheckbox">弃票</view></view></view>
</van-dialog>

2、功能实现

调用到了以上页面的功能、方法的使用,后台数据的交互。

js

// pages/vote/list/list.js ../../config/api.js
const api = require('../../../config/api.js');
const util = require('../../../utils/util.js');
const app = getApp();
Page({/*** 页面的初始数据*/data: {show: false,show1: false,tabs: ['未开启投票', '已开启投票'],lists: [],inputValue: '',//输入框内容data: {id: 0,state: 5,title: ''},option: {meetingId: 0,optionValue: ''},checkbox1: false,checkbox2: false,checkbox3: false,checkbox4: false},onBlur: function (e) {//输入框获取事件this.setData({inputValue: e.detail.value});},onOptionValue: function (e) {//弹窗1输入框获取this.setData({option: { optionValue: e.detail.value }});},likelist() {//搜索事件// console.log(this.data.inputValue);this.data.data.title = this.data.inputValuethis.InfoVote();},tabsItemChange(e) {//是否投票var tolists;if (e.detail.index == 0) {tolists = 5;this.data.data.state = 5// tolists = this.data.lists;} else if (e.detail.index == 1) {// tolists = this.data.lists;tolists = 6;this.data.data.state = 6}this.setData({data: {state: tolists}})console.log(e.detail, this.data.Profile, this.data.data, tolists);this.InfoVote();},InfoVote() {//初始化数据util.request(api.MettingInfoVote, this.data.data).then(res => {// console.log(res)this.setData({lists: res.data.voteList})}).catch(res => {console.log('服器没有开启,使用模拟数据!')})},toggleCheckbox: function (e) {var checkboxId = e.currentTarget.dataset.id;var data = {}; // 更新的状态数据// 遍历每个复选框的状态变量,根据点击的复选框的id确定是否选中Object.keys(this.data).forEach(key => {if (key.includes('checkbox') && key !== `checkbox${checkboxId}` && this.data[key]) {data[key] = false; // 将其他复选框的状态设为false}});// 切换当前复选框的选中状态data[`checkbox${checkboxId}`] = !this.data[`checkbox${checkboxId}`];this.setData(data);},// 1弹窗show1(e) {// console.log(e, e.currentTarget.dataset.id)this.setData({data: {id: e.currentTarget.dataset.id},})this.setData({show1: true})// console.log(e.currentTarget.dataset.id, this.data.data)},getVoteState(e) {//开启投票确认事件console.log(e, this.data.data, this.data.option.meetingId);var optiondata = {meetingId: this.data.data.id,optionValue: this.data.option.optionValue}// console.log(optiondata)util.request(api.MettingOptionInsert, optiondata).then(res => {//添加投票选项// console.log(api.MettingOptionInsert);if (res.errno == 0) {wx.showToast({title: '开启投票成功',icon: 'none',duration: 1500//持续的时间})util.request(api.MettingInfoupdate, { id: optiondata.meetingId, state: 6 }).then(r => {//更改会议状态// console.log(api.MettingInfoupdate);// this.InfoVote('');if (res.errno == 0) {this.data.data.state = 5this.InfoVote('');}}).catch(res => {console.log('服器没有开启,使用模拟数据!')})}}).catch(res => {console.log('服器没有开启,使用模拟数据!')})// console.log(123,i)},onClose1() {this.setData({ show1: false });},// 2弹窗showPopup(e) {this.setData({show: true,data: {id: e.currentTarget.dataset.id}})},getVoteOption(e) {//参与投票确认事件console.log(2, e.detail);},onClose() {this.setData({ show: false });},/*** 生命周期函数--监听页面加载*/onLoad(options) {// this.data.Profile=truethis.InfoVote('');}
})

3、页面美化

美化了页面的布局与美化,还有弹窗的美化,弹窗的布局美化,可以更好的操作。

wxss

/* pages/vote/list/list.wxss */.search-container {display: flex;justify-content: space-between;align-items: center;padding: 10px;background-color: #ffffff;border: cornsilk;
}.search-input {width: 45%;padding: 8px;border-radius: 20px;border: 1px solid rgb(255, 255, 255);font-size: 14px;transition: border-color 0.3s;border: cornsilk;
}.search-input:focus {outline: none;border-color: #51a7f9;
}.search-input::placeholder {color: #999;
}.search-input::-webkit-input-placeholder {color: #999;
}.search-input::-moz-placeholder {color: #999;
}.search-input:-ms-input-placeholder {color: #999;
}
.list {display: flex;flex-direction: row;width: 100%;padding: 0 20rpx 0 0;background-color: seashell;border-bottom: 1px solid #cecece;margin-bottom: 5rpx;height: 350rpx;
}.list-img {display: flex;margin: 10rpx 10rpx;width: 160rpx;height: 250rpx;justify-content: center;align-items: center;flex-direction: column;
}.list-img .video-img {width: 140rpx;height: 160rpx;border-radius: 6px;
}.list-detail {margin: 10rpx 10rpx;display: flex;flex-direction: column;width: 600rpx;height: 300rpx;
}.list-title text {font-size: 9pt;color: #333;font-weight: bold;
}.list-detail {display: flex;height: 100rpx;
}.list-tag {display: flex;
}.state {font-size: 9pt;color: blue;width: 120rpx;height: 40rpx;border: 1px solid blue;border-radius: 2px;margin: 10rpx 0rpx;display: flex;justify-content: center;align-items: center;
}.join {font-size: 11pt;color: #bbb;margin-left: 20rpx;display: flex;justify-content: center;align-items: center;
}.list-count {margin-right: 10rpx;font-size: 11pt;color: red;
}.list-info {font-size: 9pt;color: #bbb;
}.btn {background-color: #3388ff;color: #fff;border-radius: 4rpx;font-size: 16rpx;padding: 10rpx 20rpx;
}.bottom-line {display: flex;height: 60rpx;justify-content: center;align-items: center;background-color: #f3f3f3;
}.bottom-line text {font-size: 9pt;color: #666;
}/* 弹窗 */
.container {display: flex;flex-direction: column;justify-content: center;align-items: center;
}.input-box {margin-top: 20px;
}.checkbox-group {display: flex;flex-direction: column;margin-top: 15px;
}.checkbox-item {width: 100px;height: 40px;background-color: #eaf0f4;margin-bottom: 10px;display: flex;justify-content: center;align-items: center;
}
.container {display: flex;flex-direction: column;justify-content: center;align-items: center;}.input-box {margin-top: 20px;}.checkbox-group {display: flex;flex-direction: column;margin-top: 15px;}.checkbox-item {width: 100px;height: 40px;background-color: #eaf0f4;margin-bottom: 10px;display: flex;justify-content: center;align-items: center;border: 1px solid #ccc;}.checkbox-item.active {background-color: #4285f4;color: white;border-color: #4285f4;}

4、效果演示

演示效果较长,请耐心观看等待.....

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

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

相关文章

知识付费系统的移动应用开发:跨平台和原生应用的比较

移动应用在知识付费系统中发挥着重要作用&#xff0c;为用户提供了便捷的访问方式。在开发知识付费系统的移动应用时&#xff0c;开发团队通常需要考虑使用跨平台开发工具或原生开发。本文将比较这两种方法&#xff0c;讨论它们的优点和缺点&#xff0c;并提供示例代码来说明它…

用Python做数据分析之数据筛选及分类汇总

1、按条件筛选&#xff08;与&#xff0c;或&#xff0c;非&#xff09; 为数据筛选&#xff0c;使用与&#xff0c;或&#xff0c;非三个条件配合大于&#xff0c;小于和等于对数据进行筛选&#xff0c;并进行计数和求和。与 excel 中的筛选功能和 countifs 和 sumifs 功能相似…

面向对象设计原则之接口隔离原则

目录 定义接口隔离原则与单一职责原则示例 定义 接口隔离原则&#xff0c;全称为 Interface Segregation Principle&#xff0c;缩写ISP。 原始定义&#xff1a;Clients should not be forced to depend upon interfaces that they don’t use。 翻译&#xff1a; 不应该强行…

k8s 部署nginx前端

1.构建docker镜像&#xff0c;k8s拉取镜像运行 ​​​​​​​docker自己安装 [rootmaster1 ~]# docker pull nginx:1.24.0 [rootmaster1 ~]# mkdir k8s-nginx [rootmaster1 ~]# cd k8s-nginx [rootmaster1 k8s-nginx]# vim nginx.conf server_tokens off;server {listen …

MVC架构_Qt自己的MV架构

文章目录 前言模型/视图编程1.先写模型2. 视图3. 委托 例子&#xff08;Qt代码&#xff09;例1 查询本机文件系统例2 标准模型项操作例3 自定义模型示例:军事武器模型例4 只读模型操作示例例5 选择模型操作例6 自 定 义委 托(在testSelectionModel上修改) 前言 在Qt中&#xf…

ROS自学笔记十五:URDF工具

要使用工具之前&#xff0c;首先需要安装&#xff0c;安装命令: sudo apt install liburdfdom-tools 1.check_urdf 语法检查 在ROS中&#xff0c;你可以使用.check_urdf命令行工具来对URDF&#xff08;Unified Robot Description Format&#xff09;文件进行语法检查和验证。…

Pytorch实现深度学习常见问题

RuntimeError: stack expects each tensor to be equal size, but got [3, 300, 300] at entry 0 and [3, 301, 301] at entry 24 这里的问题出现的原因肯定是在数据预处理处&#xff0c;如下图&#xff0c;当数据使用不同的transforms处理方式时&#xff0c;会导致数据的尺寸大…

使用docker部署flask接口服务 一

文章目录 一&#xff1a;说明二&#xff1a;dockerfile 参数说明1. 一般常用的 参数&#xff0c;以及它的含义2. 我自己的 dockerfile 三&#xff1a;示例操作1. Gunicorn Gevent启动服务的好处2. 用Gunicorn Gevent的好处&#xff1a;3. Gunicorn Gevent的 使用示例4. 创建…

ChatGPT 与 Python Echarts 完成热力图实例

热力图是一种数据可视化方式&#xff0c;它通过颜色的变化来表示数据的差异和分布。以下是使用热力图的一些作用和好处&#xff1a; 数据可视化&#xff1a;热力图可以将复杂的数据集转化为更直观、更易理解的形式。这对于很多人来说&#xff0c;尤其是那些没有深入统计学或数…

Golang Struct 继承的深入讨论和细节

1&#xff09;结构体可以使用嵌套匿名结构体所有的字段和方法&#xff0c;即&#xff1a;首字母大写或者小写的字段、方法&#xff0c;都可以使用。 package mainimport "fmt"type A struct {Name stringage int }func (a *A) SayName() {fmt.Println("A say …

【软件测试】了解JUnit单元测试框架常用注解

目录 1、认识JUnit 2、Junit中常见的注解 1、Test 2、Disabled 3、BeforeAll和AfterAll 4、BeforeEach和AfterEach 5、 ParameterizedTest&#xff1a;参数化 6、order 3、断言 1、断言相等【Assertions.assertEquals(预期&#xff0c;比较值)】&#xff1b;相等测试通…

使用docker部署lnmp多站点

1. 创建一个 Docker 网络 以便容器可以在同一网络上进行通信 docker network create lnmpnetwork2. 运行 MySQL 容器&#xff1a; 运行 MySQL 容器并将其连接到创建的网络。确保将 MySQL 的端口映射到宿主机上&#xff0c;以便您可以从宿主机访问数据库。 将mysql的配置和数…

Spring-手写模拟Spring底层原理

概述 模拟大致的底层原理&#xff0c;为学习Spring源码做铺垫。 实现的功能&#xff1a;扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面 未实现的功能&#xff1a;构造器推断、循环依赖 重点&#xff1a;BeanDefinition、BeanPostProcessor 学习Spring…

SpringBoot日志+SpringMVC+UUID重命名文件+Idea热部署

目录 【SpringBoot日志】 什么是日志&#xff0c;日志的作用 关于日志的基本信息&#xff0c;又有哪些呢&#xff1f; 关于日志的级别 Springboot内置SLF4J【门面模式】 和 logback【日志框架】 在配置文件中可以设置日志级别【以.yml为例】 SpringBoot 持久化的保存日…

【ARM Coresight 系列文章19.2 -- Cortex-A720 AMU 详细介绍】

文章目录 1.1 PMU 与 AMU1.2 AMU 介绍1.2.1 AMU 编程模型1.2.2 AMU 的访问1.2.3 Activity monitors counters1.1 PMU 与 AMU A-Prolifile 构架中的 Performance Monitoring Unit(PMU)和Activity Monitoring Unit(AMU)都具有性能计数器。AMU和PMU可以计数的事件类似,那么AMU…

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理 参考链接: 一文梳理国产芯片巨头:紫光集团https://zhuanlan.zhihu.com/p/578232102 紫光展锐发展史,曾经的热血海归们如今都去哪了? 然而早在2013年和2014年,展讯和锐迪科就分别被紫光收购。相隔一…

客户端负载均衡策略:loadBalancer,ribbon

客户端负载均衡是指在分布式系统中&#xff0c;客户端通过某种策略将请求分发到多个服务提供者实例上&#xff0c;以达到负载均衡和提高系统的可用性和性能。 在 Java 生态系统中&#xff0c;Ribbon 是一个常用的客户端负载均衡框架&#xff0c;它是 Netflix 开源的一部分&…

Echarts 实现 设备运行状态图(甘特图) 工业大数据展示

let option{tooltip: {formatter: function (params) {let startTime new Date(params.value[1])let endTime new Date(params.value[2]);//北京时间/时间戳转成日常时间function convert(date){var y date.getFullYear();var m date.getMonth() 1;m m < 10 ? "0…

DBOW概要理解与记录

前言 DBOW作为一种视觉回环技术被广泛应用在各类VSLAM框架中&#xff0c;之前的经验主要集中在使用和抽象理解层面&#xff0c;近期花了一些时间仔细阅读了相关论文和源码&#xff0c;这里做一些记录。 两个关键概念 Vocabulary 通过预先训练得到的词汇库&#xff0c;以树状…

rust OJ实战

目录 力扣 414. 第三大的数 力扣 628. 三个数的最大乘积 力扣 414. 第三大的数 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;…