使用Vue3来实现一个倒计时器以及倒计时任务

news2024/11/26 7:16:20

本内容使用Vue3,以及element-plus辅助开发。

首先展示倒计时器的功能:

  1. 手动设置倒计时器的倒计时时间
  2. 开始倒计时按钮
  3. 暂停倒计时按钮
  4. 重新开始倒计时按钮

 其次展示倒计时任务管理界面功能:

  1. 创建倒计时任务
  2. 选择任务并进行倒计时
  3. 删除任务

目录

一.倒计时器:

1.html:

 2.script:

(1)状态变量:

(2)格式化显示时间:

 (3)初始化倒计时:

(4)开始按钮startCountdown -> 启动倒计时器:

(5)暂停按钮pauseCountdown -> 暂停倒计时器:

(6)重启倒计时器restartCountdown -> 重新开始倒计时:

(7)确定按钮 -> 修改倒计时时间:

(8)页面卸载时清理计时器(onUnMounted):

 3.css:

二.倒计时任务管理界面:

1.html:

2.script:

三.倒计时器完整代码展示:


一.倒计时器:

最后面会附有完整代码,可直接CV。 

1.html:

使用element-plus下拉框组件选择设置的时分秒的时间,点击确定按钮就可以将设置的时间在formattedTime显示,随后使用操作按钮进行对计时器的操作。 

<el-card>
    <h2>倒计时器</h2>
    <!-- 倒计时时间选择框 -->
    <div>
        <el-form inline>
            <!-- 小时选择器 -->
            <el-form-item label="小时:">
                <el-select v-model="selectedHours" :disabled="isRunning" placeholder="选择小时" style="width: 100px;">
                    <el-option v-for="h in 24" :key="'h' + h" :label="h - 1" :value="h - 1"/>
                </el-select>
            </el-form-item>
            <!-- 分钟选择器 -->
            <el-form-item label="分钟:">
                <el-select v-model="selectedMinutes" :disabled="isRunning" placeholder="选择分钟" style="width: 100px;">
                <el-option v-for="m in 60" :key="'m' + m" :label="m - 1" :value="m - 1"/>
                </el-select>
            </el-form-item>
            <!-- 秒选择器 -->
            <el-form-item label="秒:">
                <el-select v-model="selectedSeconds" :disabled="isRunning" placeholder="选择秒" style="width: 100px;">
                <el-option v-for="s in 60" :key="'s' + s" :label="s - 1" :value="s - 1"/>
                </el-select>
            </el-form-item>
        </el-form>
        <el-button type="info" @click="getTrue()">确定</el-button>
    </div>                   
    <!-- 倒计时显示 -->
    <div class="timer-display">
        <h1>{{ formattedTime }}</h1>
    </div>
    <!-- 操作按钮 -->
    <div class="controls">
        <!-- 倒计时器 -->
        <el-button type="success" @click="startCountdown()" :disabled="isRunning">开始</el-button>
        <el-button type="warning" @click="pauseCountdown()" :disabled="!isRunning">暂停</el-button>
        <el-button type="primary" @click="restartCountdown()">重新开始</el-button>
        <el-button type="info" @click="nextProcess()">下一阶段</el-button>
    </div>
</el-card>

 2.script:

(1)状态变量:

// 选择的倒计时初始值
const selectedHours = ref(0);
const selectedMinutes = ref(0);
const selectedSeconds = ref(0);

// 当前剩余的倒计时时间,以秒为单位动态更新
const totalSeconds = ref(0);

// 表示倒计时是否正在运行,用来防止重复启动计时器
const isRunning = ref(false);

// 存储定时器的句柄,用于管理 setInterval
let timer = null;

(2)格式化显示时间:

// computed:这是一个计算属性,动态计算剩余时间的格式化显示。
const formattedTime = computed(() => {
    const hours = Math.floor(totalSeconds.value / 3600);
    const minutes = Math.floor((totalSeconds.value % 3600) / 60);
    const seconds = totalSeconds.value % 60;
    // 返回格式用于倒计时器的显示 hh:mm:ss
    return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
});

格式化逻辑

  • 小时Math.floor(totalSeconds.value / 3600),将总秒数除以3600得到小时数(向下取整)。
  • 分钟:取余后计算分钟数:Math.floor((totalSeconds.value % 3600) / 60)
  • 秒数:取余后直接取 totalSeconds.value % 60
  • 格式化:使用 padStart(2, '0') 保证个位数前补 0,显示为两位数。

 (3)初始化倒计时:

// 将计算结果赋值给 totalSeconds,作为倒计时的起始值。
const initializeCountdown = () => {
    totalSeconds.value = selectedHours.value * 3600 + selectedMinutes.value * 60 + selectedSeconds.value;
};

(4)开始按钮startCountdown -> 启动倒计时器:

const startCountdown = () => {
    if (totalSeconds.value === 0) {
        initializeCountdown(); // 如果总秒数为0,重新初始化
    }
    // 通过 isRunning 确保倒计时只能启动一次
    if (!isRunning.value) {
        isRunning.value = true;
        // 使用 setInterval 每秒执行一次回调
        timer = setInterval(() => {
            if (totalSeconds.value > 0) {
                totalSeconds.value -= 1; // 每秒减1
            } else {
                // 调用 pauseCountdown 停止计时器
                pauseCountdown();
            }
        }, 1000);
    }
};

(5)暂停按钮pauseCountdown -> 暂停倒计时器:

const pauseCountdown = () => {
    // 将 isRunning 设置为 false,标记倒计时暂停
    isRunning.value = false;
    // 如果计时器已存在(timer 不为 null),调用 clearInterval 停止计时器,并将 timer 置空
    if (timer) {
        clearInterval(timer);
        timer = null;
    }
};

(6)重启倒计时器restartCountdown -> 重新开始倒计时:

const restartCountdown = () => {
    // 停止当前计时器
    pauseCountdown();
    // 重置 totalSeconds 为初始值
    initializeCountdown();
    // 重新启动倒计时
    startCountdown();
};

(7)确定按钮 -> 修改倒计时时间:

// 停止当前计时器,重新计算并设置倒计时总秒数
const getTrue = () => {
    pauseCountdown();
    initializeCountdown();
};

(8)页面卸载时清理计时器(onUnMounted):

// 当组件卸载时触发
onUnmounted(() => {
    // 清理计时器,防止内存泄漏
    if (timer) {
        clearInterval(timer);
    }
});

 3.css:

<style lang="css" scoped>
.countdown-timer {
    text-align: center;
    font-family: Arial, sans-serif;
}

.timer-display h1 {
    font-size: 48px;
    margin: 20px 0;
}

.controls button {
    margin: 5px;
    padding: 10px 20px;
    font-size: 16px;
}

select {
    margin: 5px;
    padding: 5px;
}
</style>

二.倒计时任务管理界面:

通过弹窗填写任务名称和时间(时、分、秒),并将任务提交到任务列表中。 

1.html:

<el-card>
    <!-- 倒计时时间选择框 -->
    <el-button type="primary" @click="addTaskDialog()">创建任务</el-button>
    <!-- 任务队列 -->
    <h3>任务队列</h3>
    <el-table :data="timeTaskData" style="width: 100%" height="250">
        <el-table-column prop="name" label="任务名称" width="120" />
        <el-table-column prop="time" label="倒计时间" width="120" />
        <el-table-column label="操作" width="100">
            <template #default="{ row }">
                <el-button type="success" @click="setCountdownTime(row)" :icon="Check" circle />
                <el-button type="danger" @click="deleteTimeTask(row)" :icon="Delete" circle />
            </template>
        </el-table-column>
    </el-table>
</el-card>
<!-- 任务创建弹窗 -->
<el-dialog v-model="taskDialogVisible" title="创建新任务" width="500" draggable>
    <el-form>
        <el-form-item label="任务名称">
            <el-input v-model="newTask.name" placeholder="请输入任务名称" />
        </el-form-item>
        <el-form-item label="小时">
            <el-select v-model="newTask.hours" placeholder="选择小时">
                <el-option :key="'h0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="h in 24" :key="'h' + h" :label="h" :value="h" />
            </el-select>
        </el-form-item>
        <el-form-item label="分钟">
            <el-select v-model="newTask.minutes" placeholder="选择分钟">
                <el-option :key="'m0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="m in 60" :key="'m' + m" :label="m" :value="m" />
            </el-select>
        </el-form-item>
        <el-form-item label="秒">
            <el-select v-model="newTask.seconds" placeholder="选择秒">
                <el-option :key="'s0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="s in 60" :key="'s' + s" :label="s" :value="s" />
            </el-select>
        </el-form-item>
    </el-form>
    
    <template #footer>
        <div class="dialog-footer">
            <el-button @click="taskDialogVisible = false">取消</el-button>
            <el-button type="primary" @click="addTimeTask()">创建任务</el-button>
        </div>
    </template>
</el-dialog>

2.script:

// 用于控制弹窗的显示和隐藏状态
const taskDialogVisible = ref(false);
// 打开弹窗
const addTaskDialog = () =>{
    taskDialogVisible.value = true;
    console.log('弹窗状态:', taskDialogVisible.value); // 调试日志
}
// 用于绑定用户输入的任务数据
const newTask = reactive({
    name: '', // 任务名称
    // 用户输入的时、分、秒,表示任务的时间
    hours: '',
    minutes: '',
    seconds: ''
})
// 任务列表
const timeTaskData = ref([]);
const timeTask = reactive({
    name: "",
    time: null, // 任务时间,格式为 HH:mm:ss
    roomGroup : ""
});
// 清空 timeTask 中的任务数据
const cleantimeRask = () =>{
    timeTask.value = {
        name: "",
        time: null,
        roomGroup : ""
    };
}
const addTimeTask = async () =>{
    taskDialogVisible.value = false;
    // 使用用户输入的时、分、秒来设置时间
    const hours = parseInt(newTask.hours) || 0;
    const minutes = parseInt(newTask.minutes) || 0;
    const seconds = parseInt(newTask.seconds) || 0;
    // 将时间合并为 HH:mm:ss 格式
    const timeString = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
    // 设置任务数据
    timeTask.time = timeString; // 使用标准的 HH:mm:ss 格式
    // 从 userStore 获取当前用户的分组
    timeTask.roomGroup = userStore.user.roomGroup;
    timeTask.name = newTask.name;
    if (timeTask.name !== '' && timeTask.time !== '') {
        await insertTimeTask(timeTask); // 插入任务(异步操作)
        ElMessage.success("任务添加成功");
        getTimeTaskByRGToShow(); // 更新任务列表
        console.log(timeTaskData.value);
        cleantimeRask(); // 清空当前任务数据
    } else {
        ElMessage.error("任务名称或时间不能为空");
    }
}
// 设置倒计时的时、分、秒
const setCountdownTime = (row) => {
    let date;
    if (row.time instanceof Date) {
        date = row.time; // 如果是 Date 对象,直接赋值
    } else if (typeof row.time === "string") {
        const [hours, minutes, seconds] = row.time.split(":").map(Number); // 按 HH:mm:ss 分割
        date = new Date(); // 使用当前日期
        date.setHours(hours, minutes, seconds); // 设置时间
    } else {
        console.error("无效的时间格式");
        return;
    }
    selectedHours.value = date.getHours();      // 获取小时
    selectedMinutes.value = date.getMinutes();  // 获取分钟
    selectedSeconds.value = date.getSeconds();  // 获取秒数
    initializeCountdown(); // 更新总时间
};
// 删除倒计时的任务
const deleteTimeTask = async (row) =>{
    await deleteTimeTaskById(row.id);
    ElMessage.success("任务删除成功");
    getTimeTaskByRGToShow();
    console.log(timeTaskData.value);
};
// 根据组别获取所有任务信息
const getTimeTaskByRGToShow = async () =>{
    let roomGroup = userStore.user.roomGroup;
    let result = await getTimeTaskByRG(roomGroup);
    timeTaskData.value = result.data;
}
getTimeTaskByRGToShow();

三.倒计时器完整代码展示:

1.html:

<el-main style="background-color:darkgray">
    <div>
        <el-card>
            <!-- 倒计时时间选择框 -->
            <el-button type="primary" @click="addTaskDialog()">创建任务</el-button>
            <!-- 任务队列 -->
            <h3>任务队列</h3>
            <el-table :data="timeTaskData" style="width: 100%" height="250">
                <el-table-column prop="name" label="任务名称" width="120" />
                <el-table-column prop="time" label="倒计时间" width="120" />
                <el-table-column label="操作" width="100">
                    <template #default="{ row }">
                        <el-button type="success" @click="setCountdownTime(row)" :icon="Check" circle />
                        <el-button type="danger" @click="deleteTimeTask(row)" :icon="Delete" circle />
                    <!-- <el-button type="success" >开始倒计时</el-button> -->
                    </template>
                </el-table-column>
            </el-table>
        </el-card>
    </div>
    <div class="countdown-timer">
        <el-card>
            <h2>倒计时器</h2>
            <!-- 倒计时时间选择框 -->
            <div>
                <el-form inline>
                    <!-- 小时选择器 -->
                    <el-form-item label="小时:">
                        <el-select v-model="selectedHours" :disabled="isRunning" placeholder="选择小时" style="width: 100px;">
                            <el-option v-for="h in 24" :key="'h' + h" :label="h - 1" :value="h - 1"/>
                        </el-select>
                    </el-form-item>
                    <!-- 分钟选择器 -->
                    <el-form-item label="分钟:">
                        <el-select v-model="selectedMinutes" :disabled="isRunning" placeholder="选择分钟" style="width: 100px;">
                        <el-option v-for="m in 60" :key="'m' + m" :label="m - 1" :value="m - 1"/>
                        </el-select>
                    </el-form-item>
                    <!-- 秒选择器 -->
                    <el-form-item label="秒:">
                        <el-select v-model="selectedSeconds" :disabled="isRunning" placeholder="选择秒" style="width: 100px;">
                        <el-option v-for="s in 60" :key="'s' + s" :label="s - 1" :value="s - 1"/>
                        </el-select>
                    </el-form-item>
                </el-form>
                <el-button type="info" @click="getTrue()">确定</el-button>
            </div>                   
            <!-- 倒计时显示 -->
            <div class="timer-display">
                <h1>{{ formattedTime }}</h1>
            </div>
            <!-- 操作按钮 -->
            <div class="controls">
                <!-- 倒计时器 -->
                <el-button type="success" @click="startCountdown()" :disabled="isRunning">开始</el-button>
                <el-button type="warning" @click="pauseCountdown()" :disabled="!isRunning">暂停</el-button>
                <el-button type="primary" @click="restartCountdown()">重新开始</el-button>
                <el-button type="info" @click="nextProcess()">下一阶段</el-button>
            </div>
        </el-card>
    </div>
</el-main>
<!-- 任务创建弹窗 -->
<el-dialog v-model="taskDialogVisible" title="创建新任务" width="500" draggable>
    <el-form>
        <el-form-item label="任务名称">
            <el-input v-model="newTask.name" placeholder="请输入任务名称" />
        </el-form-item>
        <el-form-item label="小时">
            <el-select v-model="newTask.hours" placeholder="选择小时">
                <el-option :key="'h0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="h in 24" :key="'h' + h" :label="h" :value="h" />
            </el-select>
        </el-form-item>
        <el-form-item label="分钟">
            <el-select v-model="newTask.minutes" placeholder="选择分钟">
                <el-option :key="'m0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="m in 60" :key="'m' + m" :label="m" :value="m" />
            </el-select>
        </el-form-item>
        <el-form-item label="秒">
            <el-select v-model="newTask.seconds" placeholder="选择秒">
                <el-option :key="'s0'" :label="0" :value="0" /> <!-- 手动添加 0 -->
                <el-option v-for="s in 60" :key="'s' + s" :label="s" :value="s" />
            </el-select>
        </el-form-item>
    </el-form>
    
    <template #footer>
        <div class="dialog-footer">
            <el-button @click="taskDialogVisible = false">取消</el-button>
            <el-button type="primary" @click="addTimeTask()">创建任务</el-button>
        </div>
    </template>
</el-dialog>

2.script:

<script setup>
import { reactive, ref, computed, onUnmounted } from 'vue';
import {  Check,Delete,Star } from '@element-plus/icons-vue';
import { getCpByRG, insertByRG } from '@/api/competition';
import { getTimeTaskByRG,insertTimeTask,deleteTimeTaskById } from '@/api/timetask';
import { useUserStore } from '@/stores/user';
import { ElMessage } from 'element-plus';

const userStore = useUserStore();



// 弹窗组件
const taskDialogVisible = ref(false);
const addTaskDialog = () =>{
    taskDialogVisible.value = true;
    console.log('弹窗状态:', taskDialogVisible.value); // 调试日志
}
const newTask = reactive({
    name: '',
    hours: '',
    minutes: '',
    seconds: ''
})
const timeTaskData = ref([]);
const timeTask = reactive({
    name: "",
    time: null,
    roomGroup : ""
});
const cleantimeRask = () =>{
    timeTask.value = {
        name: "",
        time: null,
        roomGroup : ""
    };
}
const addTimeTask = async () =>{
    taskDialogVisible.value = false;
    // 用用户输入的时、分、秒来设置时间
    const hours = parseInt(newTask.hours) || 0;
    const minutes = parseInt(newTask.minutes) || 0;
    const seconds = parseInt(newTask.seconds) || 0;
    // 将时间合并为 HH:mm:ss 格式
    const timeString = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
    // 设置任务数据
    timeTask.time = timeString; // 使用标准的 HH:mm:ss 格式
    timeTask.roomGroup = userStore.user.roomGroup;
    timeTask.name = newTask.name;
    if (timeTask.name !== '' && timeTask.time !== '') {
        await insertTimeTask(timeTask);
        ElMessage.success("任务添加成功");
        getTimeTaskByRGToShow();
        console.log(timeTaskData.value);
        cleantimeRask();
    } else {
        ElMessage.error("任务名称或时间不能为空");
    }
}
// 设置倒计时的时、分、秒
const setCountdownTime = (row) => {
    let date;
    if (row.time instanceof Date) {
        date = row.time; // 如果是 Date 对象,直接赋值
    } else if (typeof row.time === "string") {
        const [hours, minutes, seconds] = row.time.split(":").map(Number); // 按 HH:mm:ss 分割
        date = new Date(); // 使用当前日期
        date.setHours(hours, minutes, seconds); // 设置时间
    } else {
        console.error("无效的时间格式");
        return;
    }
    selectedHours.value = date.getHours();      // 获取小时
    selectedMinutes.value = date.getMinutes();  // 获取分钟
    selectedSeconds.value = date.getSeconds();  // 获取秒数
    initializeCountdown(); // 更新总时间
};
// 删除倒计时的任务
const deleteTimeTask = async (row) =>{
    await deleteTimeTaskById(row.id);
    ElMessage.success("任务删除成功");
    getTimeTaskByRGToShow();
    console.log(timeTaskData.value);
};
// 根据组别获取所有任务信息
const getTimeTaskByRGToShow = async () =>{
    let roomGroup = userStore.user.roomGroup;
    let result = await getTimeTaskByRG(roomGroup);
    timeTaskData.value = result.data;
}
getTimeTaskByRGToShow();
/
// 倒计时器
// 选择的倒计时初始值
const selectedHours = ref(0);
const selectedMinutes = ref(0);
const selectedSeconds = ref(0);
// 当前倒计时时间(以秒为单位)
const totalSeconds = ref(0);
const isRunning = ref(false);
let timer = null;
// 格式化显示的时间
const formattedTime = computed(() => {
    const hours = Math.floor(totalSeconds.value / 3600);
    const minutes = Math.floor((totalSeconds.value % 3600) / 60);
    const seconds = totalSeconds.value % 60;
    return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
});
// 初始化倒计时
const initializeCountdown = () => {
    totalSeconds.value = selectedHours.value * 3600 + selectedMinutes.value * 60 + selectedSeconds.value;
};
// 开始倒计时
const startCountdown = () => {
    // 如果当前总秒数为 0,自动初始化倒计时
    if (totalSeconds.value === 0) {
        initializeCountdown();
    }
    if (!isRunning.value) {
        isRunning.value = true;
        playSound('start'); // 播放开始音效
        timer = setInterval(() => {
            if (totalSeconds.value > 0) {
                totalSeconds.value -= 1;
            } else {
                pauseCountdown();
                playSound('end'); // 倒计时结束时播放音效
            }
        }, 1000);
    }
};
// 暂停倒计时
const pauseCountdown = () => {
    isRunning.value = false;
    playSound('pause'); // 播放暂停音效
    if (timer) {
        clearInterval(timer);
        timer = null;
    }
};
// 重新开始倒计时
const restartCountdown = () => {
    pauseCountdown();
    initializeCountdown();
    playSound('reset'); // 播放重置音效
    startCountdown();
};
// 确定修改倒计时时间
const getTrue = () => {
    pauseCountdown();
    initializeCountdown();
};
// 页面卸载时清理计时器
onUnmounted(() => {
    if (timer) {
    clearInterval(timer);
    }
});

</script>

3.css:

<style lang="css" scoped>
.countdown-timer {
    text-align: center;
    font-family: Arial, sans-serif;
}

.timer-display h1 {
    font-size: 48px;
    margin: 20px 0;
}

.controls button {
    margin: 5px;
    padding: 10px 20px;
    font-size: 16px;
}

select {
    margin: 5px;
    padding: 5px;
}
</style>

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

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

相关文章

VMware Workstation 虚拟机运行卡顿解决方案

前言 由于我们网站主力是模拟器多开&#xff0c;VMware虚拟机纯属我个人使用的经验&#xff0c;仅供参考。顺带一提&#xff1a;多开鸭的系统精简掉的是Hyper-V&#xff0c;跟VMware完全没有任何关系&#xff0c;Hyper-V跟雷电这些模拟器会冲突&#xff0c;但是移除之后不会影…

GitLab|应用部署

创建docker-compose.yaml文件 输入docker-compose配置 version: 3.8 services:gitlab:image: gitlab/gitlab-ce:15.11.2-ce.0restart: alwayscontainer_name: gitlab-ceprivileged: truehostname: 192.168.44.235environment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |exter…

ssm182在线作业管理系统的设计与实现+vue(论文+源码)_kaic

设计题目&#xff1a;在线作业管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所…

LeetCode-632. Smallest Range Covering Elements from K Lists [C++][Java]

目录 题目描述 解题思路 【C】 【Java】 LeetCode-632. Smallest Range Covering Elements from K Listshttps://leetcode.com/problems/smallest-range-covering-elements-from-k-lists/description/ 题目描述 You have k lists of sorted integers in non-decreasing o…

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中&#xff0c;指针作为一种独特的数据类型&#xff0c;它不仅是C语言的核心&#xff0c;也是理解计算机内存管理的基石。指针的概念虽然强大&#xff0c;但对于初学者来说&#xff0c;它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处&#xff1a; 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

红日靶场-4

环境搭建 我们这里会拿到三台主机&#xff0c;一台web主机&#xff0c;一台win7主机&#xff0c;一台DC主机 机器密码 WEB主机 ubuntu:ubuntu WIN7主机 douser:Dotest123 (DC)WIN2008主机 administrator:Test2008 登陆后需修改密码&#xff0c;我这里修改为1qazWSX 网络配…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的&#xff0c;可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容&#xff0c;分析各种电动汽车口碑数据。 之前&#xff0c;我写过很多Python网络爬虫的案例&#xff0c;使用requests、selenium等技术采集数据&#xff0c;这次尝试去采集小米SU7在微博、汽车…

具有多个表盘、心率传感器、指南针和游戏的 DIY 智能手表

在此&#xff0c;我们将使用所学到的知识&#xff0c;结合使用硬件和软件组件从头开始创建自己的智能手表。在项目的这一部分&#xff0c;您将被指导完成组装硬件组件、设置软件以及配置智能手表的设置和功能的过程。到本项目结束时&#xff0c;您将拥有一款功能齐全的智能手表…

Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片

在DjangoNginxuwsgi网站Channelsredisdaphne多人在线的基础上&#xff08;详见DjangoNginxuwsgi网站使用Channelsredisdaphne实现简单的多人在线聊天及消息存储功能-CSDN博客&#xff09;&#xff0c;实现在输入框粘贴或打开本地图片&#xff0c;上传到网站后返回图片路径&…

[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案

问题log /tmp/ccByifPx.o: In function main: read.c:(.text0x1a): undefined reference to shm_open read.c:(.text0xd9): undefined reference to shm_unlink collect2: error: ld returned 1 exit status 程序代码 #include <stdio.h> #include <stdlib.h> #…

Otter 安装流程

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着公司的发展&#xff0c;订单库的数据目前已达到千万级别&#xff0c;需要进行分表分库&#xff0c;就需要对数据进行迁移&#xff0c;我们使用了otter&#xff0c;这里简单整理下&#xff0c;otter 的安装过程&#xff0c;希望对…

wsl2的Ubuntu18.04安装ros和anaconda

参考&#xff1a;超详细 WSL2 安装 ros 和 anaconda_wsl2安装anaconda-CSDN博客 一.安装ros 1. 更换系统源 输入 wget http://fishros.com/install -O fishros && . fishros 和上面的链接一样&#xff0c;依次输入5-2-1 2. 安装ros 输入 wget http://fishros.c…

鸿蒙NEXT开发案例:字数统计

【引言】 本文将通过一个具体的案例——“字数统计”组件&#xff0c;来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量&#xff0c;还具有良好的用户界面设计&#xff0c;使用户能够直观地了解输入文本…

【经典】抽奖系统(HTML,CSS、JS)

目录 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍&#xff1a; 使用方法&#xff1a; 完整代码&#xff1a; 一个简单但功能强大的抽奖系统的示例&#xff0c;用于在网页上实现抽奖。 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍&#xff1a; 参与者添加&…

用树莓派Pico控制8×8 LED点阵屏:深入解析C++核心知识与动态显示实现

88 LED点阵屏是一种直观的硬件显示工具,广泛应用于嵌入式开发中。本项目结合树莓派Pico和HT16K33驱动芯片,通过C++编程实现动态图案和文字的显示功能。本文将全面解析项目中的C++核心知识点,帮助读者深入理解C++在硬件编程中的实际应用。 一、项目背景与硬件简介 1. 项目目…

什么是 WPF 中的依赖属性?有什么作用?

依赖属性&#xff08;Dependency Property&#xff09;是 WPF 的一个核心概念&#xff0c;它为传统的 .NET 属性提供了增强功能&#xff0c;支持绑定、样式、动画和默认值等功能。通过依赖属性&#xff0c;WPF 提供了一种灵活的数据驱动的方式来处理 UI 属性。 1. 什么是依赖属…

视频分析设备平台EasyCVR视频设备轨迹回放平台与应急布控球的视频监控方案

在现代社会&#xff0c;随着城市化进程的加快和信息技术的不断进步&#xff0c;对于公共安全、交通管理、城市管理以及环境保护等领域的监控需求日益增长。应急布控球与EasyCVR视频监控方案的结合&#xff0c;正是为了满足这些领域对实时监控和快速响应的需求。这一组合利用最新…

MySQL原理简介—12.MySQL主从同步

大纲 1.异步复制为MySQL搭建一套主从复制架构 2.半同步复制为MySQL搭建一套主从复制架构 3.GTID为MySQL搭建一套主从复制架构 4.并行复制降低主从同步延迟或强制读主库 1.异步复制为MySQL搭建一套主从复制架构 (1)MySQL主从复制的原理 (2)搭建主从复制架构的配置 (1)MySQ…

Node报错:npm error code ETIMEDOUT

1、报错详细信息 npm error code ETIMEDOUT npm error syscall connect npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/express failed, reason: connect ETIMEDOUT 104.16.1.35:443 npm error network This is a problem related to ne…