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

news2024/11/16 18:25:19

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

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

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

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

Java方文山的个人主页

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

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

请添加图片描述

前言

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

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

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

一、投票模块页面搭建

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

1.顶部导航栏

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

  "usingComponents": {
    "tabs": "/components/tabs/tabs"
  }

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

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

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

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

 效果展示:

 2.定义内容切换事件

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

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

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

在js中定义好属性与事件

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

 效果展示:

 温馨提示:

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

wxss

/* pages/vote/list/list.wxss */
.hidden {
  display: none;
}

.title-view {
  background-color: beige;
  font-weight: 700;
  padding-left: 7px;
}

.info-title {
  padding: 5px 5px 10px 5px;
  border-top: 1px solid rgb(129, 129, 127);
}

.info-text {
  height: 100px;
  padding: 5px 5px 10px 5px;
  border-top: 1px solid rgb(129, 129, 127);
}

.image {
  padding-left: 55px;
  display: flex;
  align-items: center;
}

.time {
  border-top: 1px solid rgb(129, 129, 127);
  padding: 5px 0px 5px 0px;
  display: flex;
  align-items: center;
}

.image-container {
  padding-left: 60px;
}

.info-sousuo {
  margin-left: 85px;
  padding-left: 20px;
  border-radius: 25px;
  border: 4px solid rgb(214, 214, 98);
  width: 250px;
}


/* pages/meeting/list/list.wxss */
.section{
  color: #aaa;
  display: flex;
  justify-content: center;
}

.list-info {
  margin-top: 10px;
  color: #aaa;
}

.list-num {
  color: #e40909;
  font-weight: 700;
}

.join {
  padding: 0px 0px 0px 10px;
  color: #aaa;
}

.state {
  margin: 0px 6px 0px 6px;
  border: 1px solid #93b9ff;
  color: #93b9ff;
}

.list-tag {
  padding: 3px 0px 10px 0px;
  display: flex;
  align-items: center;
}

.list-title {
  display: flex;
  justify-content: space-between;
  color: #333;
  font-weight: 900;


}
.yyy{
  display: flex;
  align-items: center;
}
.list-img{
  height: 300rpx;
  width: 90%;
  border-radius: 50rpx;
  margin: 5px 5px 5px 20px;
}
.centered {
  display: flex;  /* 设置为弹性容器 */
  justify-content: center;  /* 子元素水平方向居中对齐 */
}


.video-img {
  width: 100px;
  height: 100px;
}

.list {

  border-bottom: 1px solid #6b6e74;
  padding: 10px;
}

.mobi-text {
  font-weight: 700;
  padding: 15px;
}

.mobi-icon {
  border-left: 5px solid #e40909;
}

.mobi-title {
  background-color: rgba(158, 158, 142, 0.678);
  margin: 10px 0px 10px 0px;
}

.swiper-item {
  height: 300rpx;
  width: 100%;
  border-radius: 10rpx;
}

.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
  color: #aaa;
}

.userinfo-avatar {
  overflow: hidden;
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.usermotto {
  margin-top: 200px;
}


.filx{
  display: flex;
  align-items: center;
}
.container {
  padding: 20px;
}

.modal-container {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: #fff;
  width: 80%;
  max-height: 80%;
  overflow-y: auto;
  padding: 20px;
}

.mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

button {
  display: block;
  margin-top: 10px;
}

.content {
  margin-top: 10px;
  border: 1px solid #ccc;
  padding: 10px;
}
.right{
  display: flex;
  align-items: center;
}

二、发起投票

1.初始数据

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

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

InfoMapper.xml

  <select id="votelist" resultMap="BaseResultMap"  >
    select
    <include refid="Base_Column_List" />
    from t_oa_meeting_info
    where state=5
  </select>

Controller代码

//创建投票的会议信息
    @RequestMapping("/vote")
    public Object votelist(Info info) {
        List<Info> infoList = infoMapper.votelist(info);
        Map<Object, Object> data = new HashMap<Object, Object>();
        data.put("infoList",infoList);
        return ResponseUtil.ok(data);
    }

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

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

 JS代码

引入后端接口配置文件 

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

 可发起投票会议信息的ajax

  loadvoteInfos() {
    util.request(api.VoteInfos).then(res => {
      // console.log(res.data.infoList)
      this.setData({
        lists: res.data.infoList
      })
    })
  }

 在onLoad函数中调用该方法

WXML代码

<!-- 我创建的投票 -->
<view class="{{componentStatus[0] ? '' : 'hidden'}}">
  <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    <view>
      <image bindtap="showModal" data-id="{{item}}" class="list-img" mode="scaleToFill" src="{{item.seatpic !=null? item.seatpic : '/static/persons/6.png'}}"></image>
    </view>
    <view class="centered">
      <view class="list" data-id="{{item.id}}">
        <view class="yyy">
          <view class="list-title"><text>{{item.title}}</text></view>
          <view class="join"><text class="list-num">{{tools.getNumber(item.canyuze,item.liexize,item.item.zhuchiren)}}</text>人报名</view>
        </view>
        <view class="list-info"><text>{{item.location}}</text>|<text>{{tools.formatDate(item.starttime)}}</text></view>
      </view>
    </view>
  </block>

</view>

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

效果展示

2.模态框实现发布 

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

数据库展示

OptionMapper.xml

  <insert id="insertSelective" parameterType="com.zking.minoa.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=INTEGER},
      </if>
      <if test="meetingId != null">
        #{meetingId, jdbcType=INTEGER},
      </if>
      <if test="optionValue != null">
        #{optionValue, jdbcType=VARCHAR},
      </if>
      <if test="optionText != null">
        #{optionText, jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

Controller代码

//发布投票
    @RequestMapping("/add")
    public Object add(@RequestBody Map<String, Object> obj) {
        System.out.println(obj);

        //获取选项数组的长度来控制新增的次数
        int optionsLength = ((List)obj.get("options")).size();
        //循环添加投票数据
        for (int i = 0; i < optionsLength; i++) {
            //初始化option
            Option option = new Option();
            List<String> options = (List<String>) obj.get("options");
            option.setmeetingId((Integer) obj.get("modalConId"));//会议id
            String firstOption = options.get(i);
            option.setoptionValue((String)obj.get("title"));//投票标题
            option.setoptionText(firstOption);//选项内容
            //调取添加的方法
            int insert = optionMapper.insertSelective(option);
        }
        return ResponseUtil.ok();
    }

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

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

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

JS代码

//投票标题的监听事件
  bindTitle: function (e) {
    this.setData({
      title: e.detail.value
    })
  },
  // 输入框输入事件,保存输入的内容到相应的选项
  bindInput(e) {
    console.log(e)
    const { index } = e.currentTarget.dataset; // 获取当前选项的索引
    const { value } = e.detail;
    const { options } = this.data;
    options[index] = value;

    this.setData({
      options: options
    });
  },

  // 添加选项
  addOption() {
    const { options, optionCount } = this.data;
    options.push('');
    this.setData({
      options: options,
      optionCount: optionCount + 1
    });
  },

  // 删除选项
  deleteOption() {
    const { options, optionCount } = this.data;
    options.pop();
    this.setData({
      options: options,
      optionCount: optionCount - 1
    });
  }, 
  // 确认按钮点击事件
  confirm() {
    let modalConId = this.data.modalConId;//会议id
    let title = this.data.title;//投票标题
    let options = this.data.options;//选项内容

    let data = {
      modalConId: modalConId,
      options: options,
      title: title
    };
    // console.log(data)
    util.request(api.OptionInfos, data, 'POST').then(res => {
      // console.log(res)
      this.setData({
        modalVisible: false,
        optionCount: 1
      });
    })

  },
  // 取消按钮点击事件
  cancel() {
    this.setData({
      modalVisible: false,
      optionCount: 1
    });
  }

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

WXML代码

  <!-- 模态框 -->
  <view wx:if="{{modalVisible}}">
    <view class="mask"></view>
    <view class="modal-container">
      <h1>{{modalContent}}</h1>
      <view style="margin-top: 20px;" class="filx">
        <l-button type="default" bindtap="addOption" style="padding: 0px 10px 0px 0px;">添加选项</l-button>
        <l-button type="warning" bindtap="deleteOption" wx:if="{{optionCount > 1}}">删除选项</l-button>
      </view>
        <span style="margin-right: 30px;">投票标题:</span>
      <input type="text" placeholder="请输入投票标题" bindinput="bindTitle" style="width: 300px;border: 3px solid rgb(7, 7, 7);" />

      <view wx:for="{{options}}" wx:key="{{index}}">
        <span style="margin-right: 30px;">选项{{index+1}}:</span>
        <input type="text" value="{{item}}" bindinput="bindInput" data-index="{{index}}" style="width: 300px;border: 3px solid rgb(7, 7, 7);" />
      </view>

      <view class="filx" style="margin-top: 20px;">
        <l-button bindtap="confirm" type="success" style="padding: 0px 10px 0px 0px;">发布投票</l-button>
        <l-button bindtap="cancel" type="error">取消</l-button>
      </view>

    </view>
  </view>

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

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

三、用户投票

1.初始数据

OptionMapper.xml

 <select id="selecttoupiao" resultType="java.util.Map" parameterType="java.lang.String">
    SELECT
    id,
    optionValue,
    optionText,
    title,
    seatPic
    FROM (
    SELECT
    t_oa_meeting_option.id,
    t_oa_meeting_option.optionValue,
    t_oa_meeting_option.optionText,
    t_oa_meeting_info.title,
    t_oa_meeting_info.seatPic,
    ROW_NUMBER() OVER (PARTITION BY t_oa_meeting_option.optionValue ORDER BY t_oa_meeting_option.id) AS row_num
    FROM
    t_oa_meeting_option
    JOIN t_oa_meeting_info ON t_oa_meeting_option.meetingId = t_oa_meeting_info.id
    WHERE
    t_oa_meeting_info.state = 5
    ) subquery
    WHERE row_num = 1
    <if test="title != null and title != ''">
      AND title LIKE CONCAT('%', #{title}, '%')
    </if>
  </select>

Controller代码

  //带模糊查询的会议信息
    @RequestMapping("/selectOptions")
    public Object selectOptions(String title) {
        System.out.println(title);
        List<Map> selecttoupiao = optionMapper.selecttoupiao(title);
        Map<Object, Object> data = new HashMap<Object, Object>();
        data.put("selecttoupiao", selecttoupiao);
        return ResponseUtil.ok(data);
    }

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

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

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

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

JS代码

   //加载投票会议信息的ajax
   loadoptinos() {
    util.request(api.SelectOption).then(res => {
      // console.log(res.data.selecttoupiao)
      this.setData({
        Options: res.data.selecttoupiao
      })
    })
  },
 // 监听搜索事件
   onSearch: function(event) {
    var title = event.detail.value;
    let data = {
      title: title
    };
    util.request(api.SelectOption,data).then(res => {
      this.setData({
        Options: res.data.selecttoupiao
      })
    })
  }
    

 WXML代码

<view style="height: 20px;"></view>
  <view class="view-suo"> 
  <input class="info-sousuo" type="text" placeholder="请输入会议标题进行搜索" bindconfirm="onSearch"/>
  </view>

  <block wx:for-items="{{Options}}" wx:for-item="item" wx:key="item.id">
  <l-card type="cover" image="{{item.seatPic !=null? item.seatPic : '/static/persons/6.png'}}" title="{{item.title}}" style="margin-top: 10px;">
    <l-slide-view height="120" width="650" slide-width="340">
      <view slot="left" class="left">
        <view class='left-con' style="margin-top: 30px;">
          <text class='left-title'>投票标题:《{{item.optionValue}}》</text>
        </view>
      </view>
      <view slot="right" class="right">
        <view style="background-color:#9eb0fb;width: 100px;height: 100px;color: white;" >
        <view style="margin: 20px 5px 5px 14px;">投票</view>
        </view>
        <view style="background-color: #728cf8;width: 100px;height: 100px;color: white;">
          <view style="margin: 20px 5px 5px 14px;">报表</view>
        </view>
        <view style="background-color: #e45c6c;width: 100px;height: 100px;color: white;">
          <view style="margin: 10px 5px 5px 14px;">结束会议</view>
        </view>
      </view>
    </l-slide-view>
  </l-card>
</block>

 效果展示

2.模态框显示选项

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

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

OptionMapper.xml

  <!--根据投票标题查询选项  -->
  <select id="voting" resultType="java.util.Map" parameterType="java.lang.String" >
    select *from t_oa_meeting_option where 1=1
    <if test="optionValue != null and optionValue != '' ">
      AND optionValue LIKE CONCAT('%', #{optionValue}, '%')
    </if>
  </select>

 Controller代码

   //根据投票标题查询选项
    @RequestMapping("/voting")
    public Object voting(String optionValue) {
        List<Map> voting = optionMapper.voting(optionValue);
        Map<Object, Object> data = new HashMap<Object, Object>();
        data.put("voting", voting);
        return ResponseUtil.ok(data);
    }

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

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

JS代码

 //打开投票模态框并向后端拿值
  openModal: function (e) {
    let optionValue = e.currentTarget.dataset.value;
    // console.log('传递的值:', optionValue);
    let data = {
      optionValue: optionValue
    };
    util.request(api.voting, data).then(res => {
      this.setData({
        votes: res.data.voting,
        showModal: true
      })
    })
  },
  //关闭投票模态框
  closeModel(){
    this.setData({
      selectedOption:'',
      showModal: false
    })
  },
//保存用户所选择的选项
  radioChange: function (e) {
    const value = e.detail.value;
    this.setData({
      selectedOption: value
    });
  }

WXML代码

<!-- 模态框 -->
<view wx:if="{{showModal}}" class="modal">
  <view class="modal-content">
    <!-- 单选框 -->
    <radio-group bindchange="radioChange">
      <label wx:for="{{votes}}" wx:key="{{index}}" class="radio-label">
        <radio value="{{item.id}}" checked>{{item.optionText}}</radio>
      </label>
    </radio-group>
    <!-- 按钮 -->
    <view>
      <button bindtap="confirmVote">确定</button>
      <button bindtap="closeModel">取消</button>
    </view>
  </view>
</view>

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

效果演示

3.确认投票

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

VoteMapper.xml

<insert id="insertSelective" parameterType="com.zking.minoa.model.Vote" >
    insert into t_oa_meeting_vote
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="optionid != null" >
        optionId,
      </if>
      <if test="personid != null" >
        personId,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="optionid != null" >
        #{optionid,jdbcType=VARCHAR},
      </if>
      <if test="personid != null" >
        #{personid,jdbcType=BIGINT},
      </if>
    </trim>
  </insert>

 Controller代码

   //投票
    @RequestMapping("/option")
    public Object add(int optionId) {
        System.out.println(optionId);
        Vote vote=new Vote();
        vote.setOptionid(optionId);
        vote.setPersonid(7);
        int i = voteMapper.insertSelective(vote);
        return ResponseUtil.ok();
    }

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

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

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

JS代码

//用户投票
  confirmVote: function () {
    const optionId = this.data.selectedOption;
    let data = {
      optionId: optionId
    };
    util.request(api.option, data).then(res => {
      console.log(res)
      this.setData({
        showModal: false
      })
    })
  }

效果展示

四、整体效果演示

 请添加图片描述

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

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

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

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

相关文章

有粉丝被机器视觉培训机构忽悠培训贷款

最近有13个粉丝私下联系我&#xff0c;咨询我培训贷款&#xff0c;当时我听了&#xff0c;挺懵的。我详细了解后&#xff0c;我上大学毕业的时候&#xff0c;也遇到过此类学校鼓励我们去培训。合理维权&#xff0c;切不可采用极端手段&#xff0c;生命比什么都重要。不要做傻事…

Vue-dvadmin-d2-crud-plus-自定义后台菜单-添加页面

文章目录 1.新建数据模型2.新建数据序列类3.新建数据视图4.配置路由5.前端新建View组件6.配置后台7.总结 django-vue-admin是一套全部开源的快速开发平台&#xff0c;毫无保留给个人及企业免费使用。 &#x1f9d1;‍&#x1f91d;‍&#x1f9d1;前端采用D2Admin 、Vue、Eleme…

搭建nuxt3项目(框架构建)

需求 目标&#xff1a;我想搭建一个nuxt3的框架&#xff0c;实现一些基本的组件和路由、页面&#xff0c;方便后续遇到相关ssr项目直接复用。 同时&#xff1a;记录关于nuxt3的使用介绍关于Nuxt&#xff08;详解以及周边&#xff09; Nuxt 框架 1、一种基于 Node.js 的服务端…

Java-多线程进阶

文章目录 Java多线程进阶锁的类型乐观锁vs悲观锁读写锁重量级锁vs轻量级锁自旋锁公平锁vs非公平锁可重入锁vs不可重入锁 CASCAS介绍和原理CAS应用自旋锁CAS 的 ABA 问题 Synchronized 原理Callable 接口JUC常见类ReentrantLock原子类线程池信号量 SemaphoreCountDownLatch 线程…

Unity之ShaderGraph如何实现旋涡效果

前言 今天我们来通过ShaderGraph来实现一个旋涡的效果 如下图所示&#xff1a; 主要节点 Distance&#xff1a;返回输入 A 和输入 B 的值之间的欧几里德距离。除了其他方面的用途&#xff0c;这对于计算空间中两点之间的距离很有用&#xff0c;通常用于计算有符号距离函数 (…

JAVA基础(JAVA SE)学习笔记(八)面向对象编程(高级)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

C++标准模板(STL)- 类型支持 (类型特性,is_void,is_null_pointer,is_integral)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实…

【小呆的概率论学习笔记】抽样调查之用抽样样本估计母体数字特征

文章目录 1. 随机变量的数字特征1.1 随机变量的均值&#xff08;期望&#xff09;1.2 随机变量的方差1.3 随机变量的协方差 2. 抽样调查3. 用抽样样本估计母体数字特征3.1 估计母体样本均值3.2 抽样样本均值的方差3.2 估计母体样本方差 1. 随机变量的数字特征 随机变量本质上是…

手把手教你在项目中引入Excel报表组件

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 GrapeCity Documents for Excel&#xff08;以下简称GcExcel&#xff09;是葡萄城公司的…

《VS2013+ Qt5.6 创建Qt对话框(*.ui 文件, *.h, *.cpp )》

标题&#xff1a;如何在Visual Studio 2013中创建Qt对话框项目 简介 在本篇博客中&#xff0c;我们将介绍如何使用Visual Studio 2013和Qt 5.6创建一个Qt对话框项目&#xff0c;包括创建.ui文件、.h文件和.cpp文件&#xff0c;以及构建一个基本的用户界面和业务逻辑。&#x…

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序&#xff0c;即fft程序&#xff0c;但该程序是封装的&#xff0c;无法看到源码。为了比较清楚的了解matlab自带的实现过程&#xff0c;本文通过自建程序实现matlab程序&…

DenseNet 和 FractalNet学习笔记

文章目录 网络结构模型细节下采样增长率 代码实现FractalNet 模型(2016) 网络结构 假设输入为一个图片X0&#xff0c;经过一个L层的神经网络&#xff0c;第l层的特征输出记作Xl&#xff0c;那么残差连接的公式如下所示&#xff1a; x l H l ( X l − 1 ) X l − 1 x_lH_l(X…

【光电子技术+光纤通信】博资考

光电子技术与光纤通信基础总结 几何光学波动光学光电子器件激光器光调制器光探测器光纤 几何光学 折射率是比值定义式&#xff0c;定义为入射介质光速比上折射介质光速&#xff0c;它与optical density意义相似&#xff0c;可以表示传播介质对于光传播的阻碍程度&#xff0c;因…

Postman的简单使用

Postman简介 官网 Postman是Google公司开发的一款功能强大的网页调试与发送HTTP请求&#xff0c;并能运行测试用例的Chrome插件 使用Postman进行简单接口测试 新建测试 → 选择请求方式 → 请求URL&#xff0c;下面用百度作为例子&#xff1a; 参考文档 [1] Postman使用教程…

AIR101 LuatOS LVGL 显示多个标签例程

屏幕资料 AIR101与屏幕连接 PC端仿真环境合宙官方PC端版本环境搭建教程 PC电脑仿真 -- sys库是标配 _G.sys require("sys") sys.taskInit(function()local cnt0lvgl.init(480,320)--lvgl初始化local cont lvgl.cont_create(nil, nil);-- lvgl.cont_set_fit(cont, …

cocosCreator 之 dispatchEvent事件分发

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac Node事件派发 cocosCreator支持使用Node节点进行事件派发(dispatchEvent)&#xff0c;事件派发系统是按照 Web 的事件冒泡及捕获标准 实现的。 事件派发主要通过冒泡的方式逐渐向父节点传递。 在派…

整数智能·迪拜GITEX 2023 |探索未来科技,感受创新脉搏

第43届GITEX GLOBAL在迪拜世界贸易中心盛大开幕&#xff0c;聚集来自全球各地的6000多家参展企业&#xff0c;包含大量来自于人工智能、区块链、网络安全、可持续技术等领域的科技巨头和革命性初创企业&#xff0c;展示全球科技最新趋势和创新机遇。GITEX GLOBAL始办于1981年&a…

OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程

OpenText 安全取证软件&#xff0c;行业标准的数字调查解决方案&#xff0c;适用于各种规模和各种行业的组织 降低成本和复杂性 • 远程调查比轮流调查过程更有效 对结果持有信心 • 磁盘级可见性可以完成相关端点数据的搜索和收集 谨慎调查 • 完整的网络调查&#xf…

Linux常用文件和目录管理

本文旨在对y总的Linux基础课做学习记录&#xff0c;方便日后复习 参考视频&#xff1a;Linux基础课 参考教程&#xff1a;Linux教程 0 绝对路径和相对路径 Linux 的目录结构为树状结构 绝对路径&#xff1a;由根目录 / 写起&#xff0c;例如&#xff1a; /usr/share/doc相对…

华为云2023年双十一服务器优惠价格表及活动大全

2023华为云双11优惠活动「云上优选 特惠来袭」&#xff0c;阿腾云atengyun.com整理云服务器优惠价格表&#xff0c;华为云L实例-2核2G3M一年优惠价89元、L实例-2核2G4M价格108元一年、L实例-2核4G5M优惠价198元一年&#xff0c;三年1000元、HECS云服务器-1核2G1M带宽39元一年、…