FullCalendar日历组件:进行任务增删改,参考gitee例子修改

效果

参考路径

zxj/FullCalendar开发示例 - 码云 - 开源中国 (gitee.com)

代码

主页面:codeset.php

<?php
ob_start();
include('includes/session.inc');
?>
<!DOCTYPE html>
<html>

<head>
    <title>日程管理</title>
    <meta charset="UTF-8">
    <style>
        #calendar {
            max-width: 1100px;
            height: auto;
            margin: 0 auto;
        }

        .qtip-default {
            border: 1px solid #ffffff !important;
            background-color: #ffffff !important;
            color: #555;
        }


        .qtip-event-detail .qtip-content {
            width: 255px;
            background-color: #ffffff;
            border: 1px solid #e0e0e0;
            border-radius: 2px;
            border-top: 3px solid #2878f0;
            padding: 2px;
            box-shadow: 0 0 8px rgba(0, 0, 0, .2);
        }

        .event-detail-wrap {
            padding: 10px;
            font-size: 14px;
            line-height: 26px;
            color: #666
        }

        .detail-info-list {
            color: #999;
        }

        .event-detail-wrap .action-group {
            border-top: 1px solid #e0e0e0;
            padding-top: 8px;
            margin-top: 8px;
            text-align: right;
        }

        .event-detail-wrap .action-group a {
            color: #2878f0;
            text-decoration: none;
            display: inline-block;
            margin-left: 6px;
        }
    </style>
    <link href="dist/jquery.qtip.min.css" rel="stylesheet" type="text/css" />
    <link href="dist/layui/css/layui.css" rel="stylesheet" type="text/css" />
</head>

<body>
    <div class="layui-three-main">
        <div class="layui-card">
            <div class="layui-card-body zgui-marginTop10">
                <div id="calendar"></div>
            </div>
        </div>

        <div id="add-wrapper" style="display: none;padding: 10px">
            <form class="layui-form" id="add-filter" lay-filter="add-filter">
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">任务标题<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" required="required" class="layui-input" lay-verify="required" name="title" placeholder="请输入" type="text">
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">任务内容<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <textarea class="layui-textarea" required="required" name="content" placeholder="请输入内容"></textarea>
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">开始时间<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" class="layui-input" id="start" lay-verify="required|date" name="start" placeholder="请选择任务开始时间">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">结束时间<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" class="layui-input" id="end" lay-verify="required|date" name="end" placeholder="请选择任务结束时间">
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">整天事件</label>
                        <div class="layui-input-block">
                            <input lay-skin="switch" name="allDay" title="是|否" type="checkbox" value="1">
                        </div>
                    </div>
                </div>
            </form>
        </div>
        <div id="edit-wrapper" style="display: none;padding: 10px">
            <form class="layui-form" id="edit-filter" lay-filter="edit-filter">
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">任务标题<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" required="required" class="layui-input" lay-verify="required" name="title" placeholder="请输入" type="text">
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">任务内容<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <textarea class="layui-textarea" required="required" name="content" placeholder="请输入内容"></textarea>
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">开始时间<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" class="layui-input" id="start" lay-verify="required|date" name="start" placeholder="请选择任务开始时间">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">结束时间<text style="color:red">*</text></label>
                        <div class="layui-input-block">
                            <input autocomplete="off" class="layui-input" id="end" lay-verify="required|date" name="end" placeholder="请选择任务结束时间">
                        </div>
                    </div>
                </div>
                <div class="layui-row">
                    <div class="layui-form-item">
                        <label class="layui-form-label">整天事件</label>
                        <div class="layui-input-block">
                            <input lay-skin="switch" name="allDay" title="是|否" type="checkbox" value="1">
                        </div>
                    </div>
                </div>
            </form>
        </div>
    </div>
</body>
<script src="dist/index.global.min.js"></script>
<script src="dist/jquery-3.7.1.min.js"></script>
<script src="dist/jquery.qtip.min.js"></script>
<script src="dist/zh-cn.global.min.js"></script>
<script src="dist/layui/layui.js"></script>
<script type="text/javascript">
    layui.use(['layer', 'laydate', 'form', 'jquery'], function() {
        let layer = layui.layer; //创建各种弹出式窗口。
        let $ = layui.jquery; //可以通过 $ 来使用 jQuery 的功能
        let laydate = layui.laydate; //引入 layui 框架中的日期选择器模块,用于方便地选择日期和时间。
        let form = layui.form;
        //这行代码是调用 laydate 模块的 render 方法来渲染一个日期选择器,指定了要渲染的 HTML 元素为 id 为 start 的元素,
        //并且设置日期选择器的类型为 datetime,即包括日期和时间
        laydate.render({
            elem: '#start',
            type: 'datetime',
        });
        //这行代码也是渲染一个日期选择器,但是针对的是 id 为 end 的元素。
        laydate.render({
            elem: '#end',
            type: 'datetime',
        });
        //这里使用 layui 的 form 模块的 val 方法,通过传入表单的 id 或 class(这里是 'add-filter')和一个对象来设置对应字段的值。
        //这是一个对象字面量(Object Literal),表示要设置的字段名和对应的值。在这里,start 和 end 是表单字段的名称,startTime 和 endTime 是传入函数的参数,表示要设置的值。
        function setData(startTime, endTime) {
            form.val('add-filter', {
                "start": startTime,
                "end": endTime,
            });
        }

        //新增任务
        function addTask(arg) {
            //调用函数 setData() 并传入上述三个参数,用于将事件的开始时间、结束时间填充到表单中。
            setData(arg.startStr, arg.endStr, arg.allDay);
            let index = layer.open({ //layui 的 layer.open() 方法创建一个弹出层,并将返回的索引值赋给变量 index。该方法接收一个配置对象作为参数,用于指定弹出层的各种属性和行为。
                type: 1, //弹出层的类型为普通层,即内容区域为一个固定大小的盒子。
                title: "新增任务",
                shade: false, //用于设置弹出层不显示遮罩层。
                area: ["800px", "600px"], //配置对象中的属性,用于设置弹出层的宽度为 800 像素,高度为 600 像素。
                btn: ['保存', '取消'], //配置对象中的属性,用于设置弹出层的底部按钮,第一个按钮显示文本 "保存",第二个按钮显示文本 "取消"。
                content: $('#add-wrapper'), // 用于设置弹出层的内容区域为 id 为 "add-wrapper" 的元素。该元素可能是一个表单或者其他需要展示的内容。
                //保存
                yes: function() {
                    let data = form.val('add-filter');
                    // 判断必填项是否已填写
                    if (data.title && data.content && data.start && data.end) {
                        // 发送数据到后端进行保存
                        $.ajax({
                            type: "POST",
                            url: "save_calendar.php", // 后端 PHP 文件的路径
                            data: {
                                action: 'save_event', // 指定要执行的方法
                                title: data.title,
                                content: data.content,
                                start: data.start,
                                end: data.end,
                                allDay: data.allDay ? 1 : ''
                            },
                            success: function(response) {
                                var response = JSON.parse(response);
                                if (response == 'success') {
                                    calendar.addEvent({
                                        action: 'save_event', // 指定要执行的方法
                                        title: data.title,
                                        content: data.content,
                                        start: data.start,
                                        end: data.end,
                                        allDay: data.allDay ? 1 : ''
                                    });
                                    calendar.unselect();
                                    layer.msg("保存成功", {
                                        time: 1000
                                    }, function() {
                                        // 删除成功后刷新整个页面
                                        location.reload();
                                    });
                                } else {
                                    layer.msg("保存失败");
                                }
                            }
                        });
                    } else {
                        layer.msg("请填写必填项", {
                            icon: 5
                        }); // 给出提示
                        return false; // 阻止提交
                    }
                },
                end: function() {
                    document.getElementById("add-filter").reset(); //来重置表单的字段值,将其恢复到初始状态
                }
            });
        };
        //日历组件
        let calendarEl = document.getElementById('calendar');
        //通过 new 关键字创建一个 FullCalendar 的日历对象。
        //第一个参数 calendarEl 是一个表示日历要插入的 DOM 元素的选择器或者元素对象。第二个参数是一个配置对象,用于设置日历的各种属性和行为
        let calendar = new FullCalendar.Calendar(calendarEl, {
            locale: 'zh-cn', //设置日历的语言为中文,即使用中文的月份和星期名称。
            headerToolbar: { //配置日历头部的工具栏,用于显示导航按钮和标题。
                left: 'prev,next today', //在左侧显示上一个、下一个和今天的导航按钮
                center: 'title', //在中间显示当前日期范围的标题。
                // right: 'multiMonthYear,dayGridMonth,timeGridWeek,timeGridDay' //在右侧显示多月份选择器、月视图、周视图和日视图的切换按钮。
                right: 'dayGridMonth,timeGridWeek'
            },
            // initialDate: "2023-09-13",//设置初始日期为 "2023-09-13",即日历加载时所显示的日期。
            navLinks: true, //启用导航链接功能,即当用户点击日期时可以跳转到对应的日视图。
            selectable: true, //启用选择功能,允许用户通过拖动鼠标选择日期范围。
            selectMirror: true, //启用选择镜像效果,即在用户拖动鼠标选择日期范围时,会显示一个半透明的镜像效果来预览选择的范围。
            select: function(arg) { //当用户完成选择日期范围时,执行的回调函数。在这段代码中,调用了 addTask(arg) 函数来处理新增任务的逻辑。参数 arg 包含了用户选择的日期范围信息。
                //新增任务
                addTask(arg);
            },
            eventClick: function(args) { //当用户点击日历中的事件时,执行的回调函数

            },
            eventDidMount: function(args) {
                var start = new Date(args.event.start);
                var end = new Date(args.event.end);
                var options = {
                    year: 'numeric',
                    month: '2-digit',
                    day: '2-digit',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                };
                var startFormatted = start.toLocaleString('zh-CN', options); // 格式化开始时间为本地日期时间字符串
                var endFormatted = end.toLocaleString('zh-CN', options); // 格式化结束时间为本地日期时间字符串
                var timeRange = startFormatted + ' - ' + endFormatted;
                console.log(endFormatted)
                // var timeRange = args.event.startStr + ' - ' + args.event.endStr;
                $(args.el).qtip({ //将 jQuery 对象 $(args.el) 转换为 qTip2 插件对象,并设置相关配置选项。
                    content: { //设置提示框的内容,包括日期范围、团队名称、科目和教师等信息,以及编辑和删除操作的链接。
                        text: `
							<div class="event-detail-wrap">
								<div class="detail-info-list">
									<div class="js_event_detail_time">${timeRange}</div>
									<div class="js_event_detail_team">${args.event.title}</div>
									<div class="js_event_detail_subject"></div>
									<div class="js_event_detail_teacher"></div>
								</div>
							
								<div class="action-group">
									<a href="#" id="edit">编辑</a>
									<a href="#" id="delete">删除</a>
								</div>
							</div>
							` //要提示的内容,就是上面创建的那个浮层
                    },
                    position: { //设置提示框在事件元素下方居中显示。
                        my: 'bottom center',
                        at: 'top center'
                    },
                    show: { //设置提示框只能单独显示,而不会同时出现多个。
                        solo: true //保证每次只显示一个提示框
                    },
                    hide: { //设置提示框隐藏的方式,包括是否可以操作提示框、隐藏延迟时间和触发隐藏的事件
                        fixed: true, //能够操作提示框
                        delay: 100, //多久之后隐藏提示框
                        event: ' mouseleave',
                    },
                    style: { //设置提示框的样式,这里使用了自定义的样式类 qtip-event-detail
                        classes: 'qtip-event-detail' //自定义的弹层样式
                    },
                    events: {
                        visible: function(event, api) {
                            // 在提示框显示完成后给删除按钮绑定点击事件
                            api.elements.content.find('#delete').on('click', function(e) {
                                e.preventDefault();
                                var eventId = args.event.id; // 获取事件的唯一标识符,用于指定要删除的事件
                                // 发送 AJAX 请求删除事件
                                $.ajax({
                                    url: 'save_calendar.php', // 后端处理删除事件的接口地址
                                    method: 'POST',
                                    data: {
                                        action: 'del_event',
                                        eventId: eventId
                                    }, // 传递要删除的事件ID
                                    success: function(response) {
                                        var response = JSON.parse(response);
                                        console.log(response)
                                        // 处理删除成功的情况
                                        if (response == 'success') {
                                            layer.msg("删除成功", {
                                                time: 1000
                                            }, function() {
                                                // 删除成功后刷新整个页面
                                                location.reload();
                                            });
                                        } else {
                                            layer.msg("删除失败");
                                        }
                                    },
                                });
                            });
                            //编辑
                            // 在提示框显示完成后给编辑按钮绑定点击事件
                            api.elements.content.find('#edit').on('click', function(e) {
                                e.preventDefault();
                                var eventId = args.event.id; // 获取事件的唯一标识符,用于指定要编辑的事件
                                $.ajax({
                                    url: 'save_calendar.php', // 后端处理获取事件详细信息的接口地址
                                    method: 'POST',
                                    data: {
                                        action: 'details_event',
                                        eventId: eventId
                                    }, // 传递要获取详细信息的事件ID
                                    success: function(response) {
                                        var eventDetails = JSON.parse(response);
                                        // 将事件详细信息填充到编辑表单中
                                        $('#edit-filter input[name="title"]').val(eventDetails.title);
                                        $('#edit-filter textarea[name="content"]').val(eventDetails.content);
                                        $('#edit-filter input[name="start"]').val(eventDetails.start);
                                        $('#edit-filter input[name="end"]').val(eventDetails.end);
                                        // 设置整天事件的默认值并更新复选框状态
                                        var form = layui.form;
                                        $('#edit-filter input[name="allDay"]').prop('checked', eventDetails.allDay === '1');
                                        form.render('checkbox'); // 重新渲染复选框,确保样式正确显示

                                        // 打开弹窗,显示填充好信息的编辑表单
                                        let index = layer.open({
                                            type: 1,
                                            title: "编辑任务",
                                            shade: false,
                                            area: ["800px", "600px"],
                                            btn: ['保存', '取消'],
                                            content: $('#edit-wrapper'),
                                            yes: function() {
                                                // 获取编辑表单中的数据并保存到后端
                                                var editedData = form.val('edit-filter');
                                                if (editedData.title && editedData.content && editedData.start && editedData.end) {
                                                    console.log(editedData)
                                                    // 发送数据到后端进行保存
                                                    $.ajax({
                                                        type: "POST",
                                                        url: "save_calendar.php",
                                                        data: {
                                                            action: 'edit_event',
                                                            eventId: eventId, // 传递要编辑的事件ID
                                                            title: editedData.title,
                                                            content: editedData.content,
                                                            start: editedData.start,
                                                            end: editedData.end,
                                                            allDay: editedData.allDay ? 1 : '',
                                                        },
                                                        success: function(response) {
                                                            var response = JSON.parse(response);
                                                            if (response == 'success') {
                                                                layer.msg("修改成功", {
                                                                    time: 1000
                                                                }, function() {
                                                                    // 删除成功后刷新整个页面
                                                                    location.reload();
                                                                });
                                                            } else {
                                                                layer.msg("修改失败");
                                                            }
                                                        }
                                                    });
                                                } else {
                                                    layer.msg("请填写必填项", {
                                                        icon: 5
                                                    }); // 给出提示
                                                    return false; // 阻止提交
                                                }
                                            },
                                        });
                                    }
                                });
                            });
                        }
                    }
                });
            },
            editable: true, //启用可编辑功能,允许用户通过拖拽事件元素来修改事件的时间和日期等信息。
            dayMaxEvents: true, // 启用“更多”链接功能,当某一天的事件数量过多时,会在日历中显示一个“更多”链接,点击链接可以查看所有事件。
            //静态数据
            events: [], // 初始时先为空,后续通过 AJAX 请求获取事件数据
        });
        // 发送 AJAX 请求获取数据库中的事件数据
        $.ajax({
            type: "POST",
            url: "save_calendar.php", // 后端 PHP 文件的路径
            data: {
                action: 'get_event', // 指定要执行的方法
            },
            success: function(response) {
                if (response) {
                    var eventsData = JSON.parse(response);
                    // console.log(eventsData)
                    // 将获取到的事件数据填充到日历组件中
                    calendar.addEventSource(eventsData);
                    // 重新渲染日历,显示最新的事件数据
                    calendar.render();
                }
            }
        });
        calendar.render();
    })
</script>

</html>

全后端连接:save_calendar.php

<?php
// 数据库连接参数
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "tianhao";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
//执行保存事件
if ($_POST['action'] === 'save_event') {
    $title = $_POST['title'];
    $content = $_POST['content'];
    $start = strtotime($_POST['start']);
    $end = strtotime($_POST['end']);
    $allDay = $_POST['allDay'];
    $sql = "INSERT INTO calendar_info (title,content, start, end,allDay) VALUES ('$title', '$content', '$start', '$end', '$allDay')";
    $sql_result = mysqli_query($conn, $sql);
    if ($sql_result) {
        // 插入成功
        $response = 'success';
    } else {
        // 插入失败
        $response = 'failed';
    }
    // 返回处理结果给前端
    echo json_encode($response);
}
//获取事件
if ($_POST['action'] === 'get_event') {
    $sql_get = "select * from calendar_info";
    $sqlget_result = mysqli_query($conn, $sql_get);
    while ($row = mysqli_fetch_assoc($sqlget_result)) {
        $event = array(
            'id' => $row['id'],
            'title' => $row['title'],
            'content' => $row['content'],
            'start' => ($row['start'] ? date('Y-m-d H:i:s', $row['start']) : ''),
            'end' => ($row['end'] ? date('Y-m-d H:i:s', $row['end']) : ''),
            'allDay' => $row['allDay']
        );
        $events[] = $event; // 将每个事件添加到事件数组中
    }
    // 如果有数据,输出数组$events;如果没有数据,输出为0
    if (!empty($events)) {
        echo json_encode($events);
    } else {
        echo 0;
    }
}
//删除事件
if ($_POST['action'] === 'del_event') {
    $eventId = $_POST['eventId'];
    $sql_del = "DELETE FROM calendar_info WHERE id = $eventId";
    if (mysqli_query($conn, $sql_del)) { // 假设你使用的是 MySQL 数据库,$conn 是数据库连接对象
        $response = 'success';
    } else {
        // 插入失败
        $response = 'failed';
    }
    // 返回处理结果给前端
    echo json_encode($response);
}
//详细信息事件
if ($_POST['action'] === 'details_event') {
    $eventId = $_POST['eventId'];
    $sql_details = "SELECT * FROM calendar_info WHERE id = $eventId LIMIT 1";
    $sqldetails_result = mysqli_query($conn, $sql_details);

    if ($row = mysqli_fetch_assoc($sqldetails_result)) {
        $event = array(
            'id' => $row['id'],
            'title' => $row['title'],
            'content' => $row['content'],
            'start' => ($row['start'] ? date('Y-m-d H:i:s', $row['start']) : ''),
            'end' => ($row['end'] ? date('Y-m-d H:i:s', $row['end']) : ''),
            'allDay' => $row['allDay']
        );

        echo json_encode($event);
    } else {
        echo 0;
    }
}
//编辑事件
if ($_POST['action'] === 'edit_event') {
    $eventId = $_POST['eventId'];
    $title = $_POST['title'];
    $content = $_POST['content'];
    $start = strtotime($_POST['start']);
    $end = strtotime($_POST['end']);
    $allDay = $_POST['allDay'];
    // 更新数据库中对应事件ID的记录
    $sql_edit = "UPDATE calendar_info SET title = '$title ', content = '$content', start = '$start', end = '$end', allDay = '$allDay' WHERE id = $eventId";
    // 执行更新操作
    $result_edit = mysqli_query($conn, $sql_edit);
    if ($result_edit) {
        $response = 'success';
    } else {
        $response = 'failed';
    }
    echo json_encode($response);
}

数据库

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法&#xff08;VLN论文阅读&#xff09; 摘要 视觉和语言导航&#xff08;VLN&#xff09;是一项具有挑战性的任务&#xff0c;它需要代理基于自然语言指令在复杂的环境中导航。 在视觉语言导航任务中&#xff0c;之前的研究主要是在空间…

海南云仓酒庄拜会三亚市贸促会与三亚国际商会共谋发展 共绘蓝图

2024年2月23日上午&#xff0c;三亚市贸促会党组书记、会长、三亚国际商会会长方玉来在三亚国际商会会议室与海南云仓酒庄有限公司党支部书记蒋义一行进行了深入座谈交流&#xff0c;本次还有副会长张成山、秘书处副秘书长孙秋丽、李婧参加了座谈会。此次座谈会旨在加强双方的合…

JavaScript+PHP实现视频文件分片上传

摘要 视频文件分片上传&#xff0c;整体思路是利用JavaScript将文件切片&#xff0c;然后循环调用上传接口 upload.php 将切片上传到服务器。这样将由原来的一个大文件上传变为多个小文件同时上传&#xff0c;节省了上传时间&#xff0c;这就是文件分片上传的其中一个好处。 上…

基于SpringBoot+Apache ECharts的前后端分离外卖项目-苍穹外卖(十八)

数据展示 1. Apache ECharts1.1 介绍1.2 入门案例 2. 营业额统计2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.1 VO设计2.2.2 Controller层2.2.3 Service层接口2.2.4 Service层实现类2.2.5 Mapper层 2.3 功能测试 3. 用户统计3.1 需求分析和设计3.1.1 产品…

AI时代 编程高手的秘密武器:世界顶级大学推荐的计算机教材

文章目录 01 《深入理解计算机系统》02 《算法导论》03 《计算机程序的构造和解释》04 《数据库系统概念》05 《计算机组成与设计&#xff1a;硬件/软件接口》06 《离散数学及其应用》07 《组合数学》08《斯坦福算法博弈论二十讲》 清华、北大、MIT、CMU、斯坦福的学霸们在新学…

C# Onnx Yolov8-OBB 旋转目标检测

目录 效果 模型信息 项目 代码 下载 C# Onnx Yolov8-OBB 旋转目标检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-26T08:38:44.171849 description&#xff1a;Ultralytics YOLOv8s-obb model trained on runs/DOTAv1.0-ms.ya…

【大数据】Flink SQL 语法篇(四):Group 聚合、Over 聚合

Flink SQL 语法篇&#xff08;四&#xff09;&#xff1a;Group 聚合、Over 聚合 1.Group 聚合1.1 基础概念1.2 窗口聚合和 Group 聚合1.3 SQL 语义1.4 Group 聚合支持 Grouping sets、Rollup、Cube 2.Over 聚合2.1 时间区间聚合2.2 行数聚合 1.Group 聚合 1.1 基础概念 Grou…

医院LIS(全称Laboratory Information Management System)系统源码

目录 一、医院LIS系统概况 二、医院LIS系统建设必要性 三、为什么要使用LIS系统 四、技术框架 &#xff08;1&#xff09;总体框架 &#xff08;2&#xff09;技术细节 &#xff08;3&#xff09;LIS主要功能模块 五、LIS系统优势 &#xff08;1&#xff09;客户/用户…

docker创建mongodb数据库容器-主从模式

介绍 本文将通过docker创建三个mongodb数据库容器&#xff0c;分别设置一个主数据库mongodb-master:27017&#xff0c; 两个从数据库mongodb-slave-1:27018, mongodb-slave-2:27019 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本&#xff0c;可以选择安装…

Linux学习之vi/vim详细介绍

目录 ​编辑 1. 什么是 vim&#xff1f; 2. vi/vim 的使用 2.1 命令模式 2.2 输入模式 2.3 底线命令模式 3. vi/vim 使用实例 3.1 使用 vi/vim 进入一般模式 3.2 按下 i 进入输入模式(也称为编辑模式)&#xff0c;开始编辑文字 3.3 按下 ESC 按钮回到一般模式…

JavaWeb——007MYSQL(DQL多表设计)

# 数据库开发-MySQL 一级目录二级目录三级目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

2024-02-25 Unity 编辑器开发之编辑器拓展7 —— Inspector 窗口拓展

文章目录 1 SerializedObject 和 SerializedProperty2 自定义显示步骤3 数组、List 自定义显示3.1 基础方式3.2 自定义方式 4 自定义属性自定义显示4.1 基础方式4.2 自定义方式 5 字典自定义显示5.1 SerizlizeField5.2 ISerializationCallbackReceiver5.3 代码示例 1 Serialize…

Git Windows安装教程

Git的下载 去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com 或者 gitforwindows.org git-scm 是 Git 的官方&#xff0c;里面有不同系统不同平台的安装包和源代码gitforwindows.org 里只有 windows 系统的安装包 安装 使用许可声明 选择安装目录 选择安…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多&#xff0c;首先最简单的就是直接通过jedis类来连接&#xff0c;jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是&#xff1a;StringRedisTemplate和RedisTemplate&#xff0c;所以jedis只做简单的介绍。 一、Jedis…

勒索攻击新趋势,DarkSide解密工具

勒索攻击新趋势 2020年通过勒索病毒攻击已经成为网络犯罪分子热崇追捧的一种方式&#xff0c;全球几乎每天都有企业被勒索病毒攻击勒索&#xff0c;而且勒索的金额也越来越高&#xff0c;从几万美元到几千万美元不等&#xff0c;越来越多的黑客组织使用勒索病毒对企业发起攻击…

【Java系列】JDK 1.8 新特性之 Lambda表达式

目录 1、Lambda表达式介绍2、从匿名类到Lambda转换3、Lambda表达式 六种语法格式语法格式一&#xff1a;无参数、无返回值&#xff0c;只需要一个Lambda体语法格式二&#xff1a;lambda有一个参数、无返回值​语法格式三&#xff1a;Lambda只有一个参数时&#xff0c;可以省略&…

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat&#xff08;加创建自启动脚本&#xff09; 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

prometheus监控带安全认证的elasticsearch

1.下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.lin…

【Prometheus】概念和工作原理介绍

目录 一、概述 1.1 prometheus简介 1.2 prometheus特点 1.3 prometheus架构图 1.4 prometheus组件介绍 1、Prometheus Server 2、Client Library 3、pushgateway 4、Exporters 5、Service Discovery 6、Alertmanager 7、grafana 1.5 Prometheus 数据流向 1.6 Pro…