• 【微信小程序】数字化会议OA系统之投票模块(附源码)


    🎉🎉欢迎来到我的CSDN主页!🎉🎉

    🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

    🌟推荐给大家我的专栏《微信小程序开发实战》。🎯🎯

    👉点击这里,就可以查看我的主页啦!👇👇

    Java方文山的个人主页

    🎁如果感觉还不错的话请给我点赞吧!🎁🎁

    💖期待你的加入,一起学习,一起进步!💖💖

    请添加图片描述

    前言

    开会是企业中必不可少的一种沟通方式,可以让团队成员之间交流思想,协调工作进度,解决问题等。但是,过于频繁和冗长的会议可能会浪费时间和资源,影响工作效率。

    在公司中,如果每个小事情都要开会,那么很容易造成员工的厌烦和不满。这样的会议可能会让人感到无聊、浪费时间,甚至失去动力。因此,企业应该合理安排会议,选择适当的时间和场合,避免不必要的会议,并确保会议的目的明确、内容简洁、效率高效,因此鄙人开发了一个数字化会议OA系统。

    这篇文章主讲投票模块的实现,其中包括发布投票信息,用户选择所属会议的投票标题内容进行投票、投票的数据报表等实现。

    一、投票模块页面搭建

    【微信小程序】自定义组件布局会议OA其他页面(附源码)icon-default.png?t=N7T8http://t.csdnimg.cn/lLeMU页面搭建与自定义组件的编写在这篇文章中提过,这里只做粗略的讲述。

    1.顶部导航栏

    我们可以根据自定义组件完成,首先在相应的json文件中引用自定义组件。

    1. "usingComponents": {
    2. "tabs": "/components/tabs/tabs"
    3. }

     随后在js文件中定义我们所需要展示的内容。

      tabs: ['发起投票', '投票进行中', '已结束投票', '全部投票']

     最后直接在wxml中应用即可。

    <tabs tabList="{{tabs}}" bindtabsItemChange="tabsItemChange">tabs>

     效果展示:

     2.定义内容切换事件

    我们这里与会议管理有些不同,我们会议管理是点击不同的菜单显示不同的数据,但是这个的内容可就不是数据了,而是各不相同的组件,所以针对这个事情我们要做一个内容切换事件。

    首先在我们的wxml中定义好每个菜单需要展示的内容并写好hidden样式

    1. <view class="{{componentStatus[0] ? '' : 'hidden'}}">发起投票view>
    2. <view class="{{componentStatus[1] ? '' : 'hidden'}}">投票进行中view>
    3. <view class="{{componentStatus[2] ? '' : 'hidden'}}">已结束投票view>
    4. <view class="{{componentStatus[3] ? '' : 'hidden'}}">全部投票view>
    1. .hidden {
    2. display: none;
    3. }

    在js中定义好属性与事件

     componentStatus: [true,false, false, false]
    1. tabsItemChange(e) {
    2. let index = e.detail.index;
    3. //全部的组件赋值为false
    4. const lists = [false, false, false, false];
    5. //将所点击的组件赋值为true
    6. lists[index] = true;
    7. this.setData({
    8. componentStatus: lists // 更新 data 中的 componentStatus 属性值
    9. });
    10. }

     效果展示:

     温馨提示:

    因为在写这篇博客之前,我就已经完成了功能,并且模块中的样式没有进行相应的标记,所以这里就放上我投票模块的所有样式,避免大家在进行编写的时候因为样式问题而导致效果出不来的情况。

    wxss

    1. /* pages/vote/list/list.wxss */
    2. .hidden {
    3. display: none;
    4. }
    5. .title-view {
    6. background-color: beige;
    7. font-weight: 700;
    8. padding-left: 7px;
    9. }
    10. .info-title {
    11. padding: 5px 5px 10px 5px;
    12. border-top: 1px solid rgb(129, 129, 127);
    13. }
    14. .info-text {
    15. height: 100px;
    16. padding: 5px 5px 10px 5px;
    17. border-top: 1px solid rgb(129, 129, 127);
    18. }
    19. .image {
    20. padding-left: 55px;
    21. display: flex;
    22. align-items: center;
    23. }
    24. .time {
    25. border-top: 1px solid rgb(129, 129, 127);
    26. padding: 5px 0px 5px 0px;
    27. display: flex;
    28. align-items: center;
    29. }
    30. .image-container {
    31. padding-left: 60px;
    32. }
    33. .info-sousuo {
    34. margin-left: 85px;
    35. padding-left: 20px;
    36. border-radius: 25px;
    37. border: 4px solid rgb(214, 214, 98);
    38. width: 250px;
    39. }
    40. /* pages/meeting/list/list.wxss */
    41. .section{
    42. color: #aaa;
    43. display: flex;
    44. justify-content: center;
    45. }
    46. .list-info {
    47. margin-top: 10px;
    48. color: #aaa;
    49. }
    50. .list-num {
    51. color: #e40909;
    52. font-weight: 700;
    53. }
    54. .join {
    55. padding: 0px 0px 0px 10px;
    56. color: #aaa;
    57. }
    58. .state {
    59. margin: 0px 6px 0px 6px;
    60. border: 1px solid #93b9ff;
    61. color: #93b9ff;
    62. }
    63. .list-tag {
    64. padding: 3px 0px 10px 0px;
    65. display: flex;
    66. align-items: center;
    67. }
    68. .list-title {
    69. display: flex;
    70. justify-content: space-between;
    71. color: #333;
    72. font-weight: 900;
    73. }
    74. .yyy{
    75. display: flex;
    76. align-items: center;
    77. }
    78. .list-img{
    79. height: 300rpx;
    80. width: 90%;
    81. border-radius: 50rpx;
    82. margin: 5px 5px 5px 20px;
    83. }
    84. .centered {
    85. display: flex; /* 设置为弹性容器 */
    86. justify-content: center; /* 子元素水平方向居中对齐 */
    87. }
    88. .video-img {
    89. width: 100px;
    90. height: 100px;
    91. }
    92. .list {
    93. border-bottom: 1px solid #6b6e74;
    94. padding: 10px;
    95. }
    96. .mobi-text {
    97. font-weight: 700;
    98. padding: 15px;
    99. }
    100. .mobi-icon {
    101. border-left: 5px solid #e40909;
    102. }
    103. .mobi-title {
    104. background-color: rgba(158, 158, 142, 0.678);
    105. margin: 10px 0px 10px 0px;
    106. }
    107. .swiper-item {
    108. height: 300rpx;
    109. width: 100%;
    110. border-radius: 10rpx;
    111. }
    112. .userinfo {
    113. display: flex;
    114. flex-direction: column;
    115. align-items: center;
    116. color: #aaa;
    117. }
    118. .userinfo-avatar {
    119. overflow: hidden;
    120. width: 128rpx;
    121. height: 128rpx;
    122. margin: 20rpx;
    123. border-radius: 50%;
    124. }
    125. .usermotto {
    126. margin-top: 200px;
    127. }
    128. .filx{
    129. display: flex;
    130. align-items: center;
    131. }
    132. .container {
    133. padding: 20px;
    134. }
    135. .modal-container {
    136. position: fixed;
    137. top: 50%;
    138. left: 50%;
    139. transform: translate(-50%, -50%);
    140. background-color: #fff;
    141. width: 80%;
    142. max-height: 80%;
    143. overflow-y: auto;
    144. padding: 20px;
    145. }
    146. .mask {
    147. position: fixed;
    148. top: 0;
    149. left: 0;
    150. width: 100%;
    151. height: 100%;
    152. background-color: rgba(0, 0, 0, 0.5);
    153. }
    154. button {
    155. display: block;
    156. margin-top: 10px;
    157. }
    158. .content {
    159. margin-top: 10px;
    160. border: 1px solid #ccc;
    161. padding: 10px;
    162. }
    163. .right{
    164. display: flex;
    165. align-items: center;
    166. }

    二、发起投票

    1.初始数据

    首先最基本的就是要拿到数据,但是这个数据可不是乱拿的,我们先来看一下表数据。

    我们要拿到state值为5的数据,只有该数据才是通过了审核并且还未结束的会议,所以能进行投票,明确了目标现在开始敲代码吧。

    InfoMapper.xml

    1. <select id="votelist" resultMap="BaseResultMap" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_oa_meeting_info
    5. where state=5
    6. select>

    Controller代码

    1. //创建投票的会议信息
    2. @RequestMapping("/vote")
    3. public Object votelist(Info info) {
    4. List infoList = infoMapper.votelist(info);
    5. Map data = new HashMap();
    6. data.put("infoList",infoList);
    7. return ResponseUtil.ok(data);
    8. }

     在config/api.js配置后端接口

    1. // 以下是业务服务器API地址
    2. // 本机开发API地址
    3. var WxApiRoot = 'http://localhost:8080/wx/';
    4. // 测试环境部署api地址
    5. // var WxApiRoot = 'http://192.168.0.101:8070/demo/wx/';
    6. // 线上平台api地址
    7. //var WxApiRoot = 'https://www.oa-mini.com/demo/wx/';
    8. module.exports = {
    9. IndexUrl: WxApiRoot + 'home/index', //首页数据接口
    10. SwiperImgs: WxApiRoot+'swiperImgs', //轮播图
    11. MettingInfos: WxApiRoot+'meeting/list', //会议信息
    12. VoteInfos:WxApiRoot+'home/vote',//可发起投票会议信息
    13. OptionInfos:WxApiRoot+'home/add',//发布投票信息
    14. SelectOption:WxApiRoot+'home/selectOptions'//查看可进行投票信息
    15. };

     JS代码

    引入后端接口配置文件 

    const api = require("../../config/api.js")

     可发起投票会议信息的ajax

    1. loadvoteInfos() {
    2. util.request(api.VoteInfos).then(res => {
    3. // console.log(res.data.infoList)
    4. this.setData({
    5. lists: res.data.infoList
    6. })
    7. })
    8. }

     在onLoad函数中调用该方法

    WXML代码

    1. <view class="{{componentStatus[0] ? '' : 'hidden'}}">
    2. <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    3. <view>
    4. <image bindtap="showModal" data-id="{{item}}" class="list-img" mode="scaleToFill" src="{{item.seatpic !=null? item.seatpic : '/static/persons/6.png'}}">image>
    5. view>
    6. <view class="centered">
    7. <view class="list" data-id="{{item.id}}">
    8. <view class="yyy">
    9. <view class="list-title"><text>{{item.title}}text>view>
    10. <view class="join"><text class="list-num">{{tools.getNumber(item.canyuze,item.liexize,item.item.zhuchiren)}}text>人报名view>
    11. view>
    12. <view class="list-info"><text>{{item.location}}text>|<text>{{tools.formatDate(item.starttime)}}text>view>
    13. view>
    14. view>
    15. block>
    16. view>

     注意:将代码放入所需要展示内容的view中。

    效果展示

    2.模态框实现发布 

    这里我给大家捋一下我的思路,当我点击会议信息的时候就会弹出一个模态框,模态框的内容有显示该会议的标题、输入投票的标题、新增选项、删除选项、发布投票、取消发布等。我需要将我所点击的会议信息的标题传入模态框中,并且可以获取投票标题和选项内容的文本内容并进行保存,等我点击发布投票的时候就会将保存的内容传值给后端。

    数据库展示

    OptionMapper.xml

    1. <insert id="insertSelective" parameterType="com.zking.minoa.model.Option">
    2. INSERT INTO t_oa_meeting_option
    3. <trim prefix="(" suffix=")" suffixOverrides=",">
    4. <if test="id != null">
    5. id,
    6. if>
    7. <if test="meetingId != null">
    8. meetingId,
    9. if>
    10. <if test="optionValue != null">
    11. optionValue,
    12. if>
    13. <if test="optionText != null">
    14. optionText,
    15. if>
    16. trim>
    17. <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
    18. <if test="id != null">
    19. #{id, jdbcType=INTEGER},
    20. if>
    21. <if test="meetingId != null">
    22. #{meetingId, jdbcType=INTEGER},
    23. if>
    24. <if test="optionValue != null">
    25. #{optionValue, jdbcType=VARCHAR},
    26. if>
    27. <if test="optionText != null">
    28. #{optionText, jdbcType=VARCHAR},
    29. if>
    30. trim>
    31. insert>

    Controller代码

    1. //发布投票
    2. @RequestMapping("/add")
    3. public Object add(@RequestBody Map obj) {
    4. System.out.println(obj);
    5. //获取选项数组的长度来控制新增的次数
    6. int optionsLength = ((List)obj.get("options")).size();
    7. //循环添加投票数据
    8. for (int i = 0; i < optionsLength; i++) {
    9. //初始化option
    10. Option option = new Option();
    11. List options = (List) obj.get("options");
    12. option.setmeetingId((Integer) obj.get("modalConId"));//会议id
    13. String firstOption = options.get(i);
    14. option.setoptionValue((String)obj.get("title"));//投票标题
    15. option.setoptionText(firstOption);//选项内容
    16. //调取添加的方法
    17. int insert = optionMapper.insertSelective(option);
    18. }
    19. return ResponseUtil.ok();
    20. }

    这里需要注意是一个投票选项就是一条数据,所以我们要先拿到前端的选择数组的长度,从而进行遍历添加数据,同一批请求的投票标题与会议id肯定是一致的所以不用变动。

     在config/api.js配置后端接口

     OptionInfos:WxApiRoot+'home/add',//发布投票信息

    JS代码

    1. //投票标题的监听事件
    2. bindTitle: function (e) {
    3. this.setData({
    4. title: e.detail.value
    5. })
    6. },
    7. // 输入框输入事件,保存输入的内容到相应的选项
    8. bindInput(e) {
    9. console.log(e)
    10. const { index } = e.currentTarget.dataset; // 获取当前选项的索引
    11. const { value } = e.detail;
    12. const { options } = this.data;
    13. options[index] = value;
    14. this.setData({
    15. options: options
    16. });
    17. },
    18. // 添加选项
    19. addOption() {
    20. const { options, optionCount } = this.data;
    21. options.push('');
    22. this.setData({
    23. options: options,
    24. optionCount: optionCount + 1
    25. });
    26. },
    27. // 删除选项
    28. deleteOption() {
    29. const { options, optionCount } = this.data;
    30. options.pop();
    31. this.setData({
    32. options: options,
    33. optionCount: optionCount - 1
    34. });
    35. },
    36. // 确认按钮点击事件
    37. confirm() {
    38. let modalConId = this.data.modalConId;//会议id
    39. let title = this.data.title;//投票标题
    40. let options = this.data.options;//选项内容
    41. let data = {
    42. modalConId: modalConId,
    43. options: options,
    44. title: title
    45. };
    46. // console.log(data)
    47. util.request(api.OptionInfos, data, 'POST').then(res => {
    48. // console.log(res)
    49. this.setData({
    50. modalVisible: false,
    51. optionCount: 1
    52. });
    53. })
    54. },
    55. // 取消按钮点击事件
    56. cancel() {
    57. this.setData({
    58. modalVisible: false,
    59. optionCount: 1
    60. });
    61. }

     事件中提到的变量在data中定义即可,这里就不做展示了

    WXML代码

    1. <view wx:if="{{modalVisible}}">
    2. <view class="mask">view>
    3. <view class="modal-container">
    4. <h1>{{modalContent}}h1>
    5. <view style="margin-top: 20px;" class="filx">
    6. <l-button type="default" bindtap="addOption" style="padding: 0px 10px 0px 0px;">添加选项l-button>
    7. <l-button type="warning" bindtap="deleteOption" wx:if="{{optionCount > 1}}">删除选项l-button>
    8. view>
    9.   <span style="margin-right: 30px;">投票标题:span>
    10. <input type="text" placeholder="请输入投票标题" bindinput="bindTitle" style="width: 300px;border: 3px solid rgb(7, 7, 7);" />
    11. <view wx:for="{{options}}" wx:key="{{index}}">
    12. <span style="margin-right: 30px;">选项{{index+1}}:span>
    13. <input type="text" value="{{item}}" bindinput="bindInput" data-index="{{index}}" style="width: 300px;border: 3px solid rgb(7, 7, 7);" />
    14. view>
    15. <view class="filx" style="margin-top: 20px;">
    16. <l-button bindtap="confirm" type="success" style="padding: 0px 10px 0px 0px;">发布投票l-button>
    17. <l-button bindtap="cancel" type="error">取消l-button>
    18. view>
    19. view>
    20. view>

     我这里还引用了小程序框架LinUI可以丰富我的页面,不懂的可以看官网哦!!

    结合我们刚刚的页面数据再看看效果

    三、用户投票

    1.初始数据

    OptionMapper.xml

    1. <select id="selecttoupiao" resultType="java.util.Map" parameterType="java.lang.String">
    2. SELECT
    3. id,
    4. optionValue,
    5. optionText,
    6. title,
    7. seatPic
    8. FROM (
    9. SELECT
    10. t_oa_meeting_option.id,
    11. t_oa_meeting_option.optionValue,
    12. t_oa_meeting_option.optionText,
    13. t_oa_meeting_info.title,
    14. t_oa_meeting_info.seatPic,
    15. ROW_NUMBER() OVER (PARTITION BY t_oa_meeting_option.optionValue ORDER BY t_oa_meeting_option.id) AS row_num
    16. FROM
    17. t_oa_meeting_option
    18. JOIN t_oa_meeting_info ON t_oa_meeting_option.meetingId = t_oa_meeting_info.id
    19. WHERE
    20. t_oa_meeting_info.state = 5
    21. ) subquery
    22. WHERE row_num = 1
    23. <if test="title != null and title != ''">
    24. AND title LIKE CONCAT('%', #{title}, '%')
    25. if>
    26. select>

    Controller代码

    1. //带模糊查询的会议信息
    2. @RequestMapping("/selectOptions")
    3. public Object selectOptions(String title) {
    4. System.out.println(title);
    5. List selecttoupiao = optionMapper.selecttoupiao(title);
    6. Map data = new HashMap();
    7. data.put("selecttoupiao", selecttoupiao);
    8. return ResponseUtil.ok(data);
    9. }

     在config/api.js配置后端接口

       SelectOption:WxApiRoot+'home/selectOptions'//查看可进行投票信息

    在投票页面我使用了LinUI的滑动菜单和卡片布局。

     利用好框架我们写起来就会简单许多只需要将数据进行绑定即可,但为了让用户有更好的体验,所以我加了一个搜索框,用户可进行模糊查询自己所需要投票的会议。

    JS代码

    1. //加载投票会议信息的ajax
    2. loadoptinos() {
    3. util.request(api.SelectOption).then(res => {
    4. // console.log(res.data.selecttoupiao)
    5. this.setData({
    6. Options: res.data.selecttoupiao
    7. })
    8. })
    9. },
    10. // 监听搜索事件
    11. onSearch: function(event) {
    12. var title = event.detail.value;
    13. let data = {
    14. title: title
    15. };
    16. util.request(api.SelectOption,data).then(res => {
    17. this.setData({
    18. Options: res.data.selecttoupiao
    19. })
    20. })
    21. }

     WXML代码

    1. "height: 20px;">
    2. <view class="view-suo">
    3. <input class="info-sousuo" type="text" placeholder="请输入会议标题进行搜索" bindconfirm="onSearch"/>
    4. view>
    5. <block wx:for-items="{{Options}}" wx:for-item="item" wx:key="item.id">
    6. <l-card type="cover" image="{{item.seatPic !=null? item.seatPic : '/static/persons/6.png'}}" title="{{item.title}}" style="margin-top: 10px;">
    7. <l-slide-view height="120" width="650" slide-width="340">
    8. <view slot="left" class="left">
    9. <view class='left-con' style="margin-top: 30px;">
    10. <text class='left-title'>投票标题:《{{item.optionValue}}》text>
    11. view>
    12. view>
    13. <view slot="right" class="right">
    14. <view style="background-color:#9eb0fb;width: 100px;height: 100px;color: white;" >
    15. <view style="margin: 20px 5px 5px 14px;">投票view>
    16. view>
    17. <view style="background-color: #728cf8;width: 100px;height: 100px;color: white;">
    18. <view style="margin: 20px 5px 5px 14px;">报表view>
    19. view>
    20. <view style="background-color: #e45c6c;width: 100px;height: 100px;color: white;">
    21. <view style="margin: 10px 5px 5px 14px;">结束会议view>
    22. view>
    23. view>
    24. l-slide-view>
    25. l-card>
    26. block>

     效果展示

    2.模态框显示选项

    投票数据表的字段非常简单,只需要拿到所选投票的id与投票人员的id即可

    首先我们需要一个模态框作为载体来加载投票标题的投票选项

    OptionMapper.xml

    1. <select id="voting" resultType="java.util.Map" parameterType="java.lang.String" >
    2. select *from t_oa_meeting_option where 1=1
    3. <if test="optionValue != null and optionValue != '' ">
    4. AND optionValue LIKE CONCAT('%', #{optionValue}, '%')
    5. if>
    6. select>

     Controller代码

    1. //根据投票标题查询选项
    2. @RequestMapping("/voting")
    3. public Object voting(String optionValue) {
    4. List voting = optionMapper.voting(optionValue);
    5. Map data = new HashMap();
    6. data.put("voting", voting);
    7. return ResponseUtil.ok(data);
    8. }

     在config/api.js配置后端接口

      voting:WxApiRoot+'home/voting',//根据投票标题查询选项

    JS代码

    1. //打开投票模态框并向后端拿值
    2. openModal: function (e) {
    3. let optionValue = e.currentTarget.dataset.value;
    4. // console.log('传递的值:', optionValue);
    5. let data = {
    6. optionValue: optionValue
    7. };
    8. util.request(api.voting, data).then(res => {
    9. this.setData({
    10. votes: res.data.voting,
    11. showModal: true
    12. })
    13. })
    14. },
    15. //关闭投票模态框
    16. closeModel(){
    17. this.setData({
    18. selectedOption:'',
    19. showModal: false
    20. })
    21. },
    22. //保存用户所选择的选项
    23. radioChange: function (e) {
    24. const value = e.detail.value;
    25. this.setData({
    26. selectedOption: value
    27. });
    28. }

    WXML代码

    1. <view wx:if="{{showModal}}" class="modal">
    2. <view class="modal-content">
    3. <radio-group bindchange="radioChange">
    4. <label wx:for="{{votes}}" wx:key="{{index}}" class="radio-label">
    5. <radio value="{{item.id}}" checked>{{item.optionText}}radio>
    6. label>
    7. radio-group>
    8. <view>
    9. <button bindtap="confirmVote">确定button>
    10. <button bindtap="closeModel">取消button>
    11. view>
    12. view>
    13. view>

    这里有个小地方需要注意我在投票的view上绑定了data-value="{{item.optionValue}}也就是投票标题,当打开模态框的时候,就会带着这个投票标题找到相应的选项出来。

    效果演示

    3.确认投票

     到这一步就可以说是非常简单了,我们只需要保存用户所选的是什么选项,并将值传到后端进行保存即可。

    VoteMapper.xml

    1. <insert id="insertSelective" parameterType="com.zking.minoa.model.Vote" >
    2. insert into t_oa_meeting_vote
    3. <trim prefix="(" suffix=")" suffixOverrides="," >
    4. <if test="id != null" >
    5. id,
    6. if>
    7. <if test="optionid != null" >
    8. optionId,
    9. if>
    10. <if test="personid != null" >
    11. personId,
    12. if>
    13. trim>
    14. <trim prefix="values (" suffix=")" suffixOverrides="," >
    15. <if test="id != null" >
    16. #{id,jdbcType=VARCHAR},
    17. if>
    18. <if test="optionid != null" >
    19. #{optionid,jdbcType=VARCHAR},
    20. if>
    21. <if test="personid != null" >
    22. #{personid,jdbcType=BIGINT},
    23. if>
    24. trim>
    25. insert>

     Controller代码

    1. //投票
    2. @RequestMapping("/option")
    3. public Object add(int optionId) {
    4. System.out.println(optionId);
    5. Vote vote=new Vote();
    6. vote.setOptionid(optionId);
    7. vote.setPersonid(7);
    8. int i = voteMapper.insertSelective(vote);
    9. return ResponseUtil.ok();
    10. }

    这里没有进行用户登录的操作所以人的id就先定死 。

     在config/api.js配置后端接口

       option:WxApiRoot+'home/option',//用户投票

    JS代码

    1. //用户投票
    2. confirmVote: function () {
    3. const optionId = this.data.selectedOption;
    4. let data = {
    5. optionId: optionId
    6. };
    7. util.request(api.option, data).then(res => {
    8. console.log(res)
    9. this.setData({
    10. showModal: false
    11. })
    12. })
    13. }

    效果展示

    四、整体效果演示

     请添加图片描述

    到这里我的分享就结束了,欢迎到评论区探讨交流!!

    💖如果觉得有用的话还请点个赞吧 💖

  • 相关阅读:
    远距离WiFi模组方案,实现移动设备之间高效通信,无人机远程图传应用
    八叉树的范围和射线检测
    读《凤凰架构》- RPC的历史与知识
    Kafka~基础原理与架构了解
    Vant组件库入门知识
    高性能mysql-查询性能优化
    【k8s 高级调度--亲和力/反亲和力】
    5原型模式
    linux批量修改多个文件的同一部分内容
    Linux环境安装mysql8.0
  • 原文地址:https://blog.csdn.net/weixin_74318097/article/details/134019145