当前位置: 首页 > news >正文

后台管理系统通用页面抽离=>高阶组件+配置文件+hooks

目录结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置文件和通用页面组件

content.config.ts

const contentConfig = {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px" },{ type: "index", label: "序号", width: "80px" },{ type: "normal", prop: "name", label: "角色名称", width: "180px" },{ type: "normal", prop: "intro", label: "角色权限", width: "180px" },{ type: "timer", prop: "createAt", label: "创建时间" },{ type: "timer", prop: "updateAt", label: "更新时间" },{ type: "handler", label: "操作", width: "180px" }]
};export default contentConfig;

modal.config.ts

const modalConfig = {pageName: "role",header: {newTitle: "新建角色",editTitle: "编辑角色"},formItems: [{type: "input",label: "角色名称",prop: "name",placeholder: "请输入角色名称"},{type: "input",label: "权限介绍",prop: "intro",placeholder: "请输入权限介绍"},{type: "custom",slotName: "menuList"}]
};export default modalConfig;

search.config.ts

const searchConfig = {formItems: [{type: 'input',prop: 'name',label: '角色名称',placeholder: '请输入查询的角色名称'},{type: 'input',prop: 'intro',label: '角色权限',placeholder: '请输入查询的角色权限'},{type: 'date-picker',prop: 'createAt',label: '创建时间'}]
}
export default searchConfig;

role.vue

<script setup lang="ts">
import PageSearch from "@/components/page-search/page-search.vue";
import PageModal from "@/components/page-modal/page-modal.vue";
import PageContent from "@/components/page-content/page-content.vue";
import searchConfig from "@/views/main/system/role/config/search.config";
import contentConfig from "@/views/main/system/role/config/content.config";
import modalConfig from "@/views/main/system/role/config/modal.config";
import usePageContent from "@/hooks/usePageContent";
import usePageModal from "@/hooks/usePageModal";
import useSystemStore from "@/stores/modules/main/system/system";
import { ref, useTemplateRef, nextTick } from "vue";
import { ElTree } from "element-plus";
import {mapMenuListToIds} from "@/utils/mapMenus";/*** 新增角色时,清空菜单列表*/
const newCallback = () => {nextTick(() => {treeRef.value?.setCheckedKeys([]);})
}/*** 编辑角色时,回显角色所拥有的菜单列表* @param itemData 当前编辑的角色信息*/
const editCallback = (itemData: any) => {nextTick(() => {const menuIds = mapMenuListToIds(itemData.menuList)treeRef.value?.setCheckedKeys(menuIds);})
}const { contentRef, handleQueryClick, handleResetClick } = usePageContent();
const { modalRef, handleNewClick, handleEditClick } = usePageModal(newCallback, editCallback); // editCallback 必须在 usePageModal() 方法前初始化const systemStore = useSystemStore();
const menuList = systemStore.menuList;const treeRef = useTemplateRef<InstanceType<typeof ElTree>>("treeRef");
const treeInfo = ref({});/*** 选择某菜单节点的回调函数* @param node 传递给 data 属性的数组中该节点所对应的对象* @param checked 树目前的选中状态对象*/
const handleElTreeCheck = (node: any, checked: any) => {const menuList = [...checked.checkedKeys, ...checked.halfCheckedKeys];treeInfo.value = { menuList };
};</script><template><div class="role"><page-search:searchConfig="searchConfig":query-click="handleQueryClick"@reset-click="handleResetClick"/><page-contentref="contentRef":content-config="contentConfig"@new-data-click="handleNewClick"@edit-data-click="handleEditClick"/><page-modal ref="modalRef" :modal-config="modalConfig" :treeInfo="treeInfo"><template #menuList><el-treeref="treeRef":data="menuList"show-checkboxnode-key="id":props="{ children: 'children', label: 'name' }"@check="handleElTreeCheck"/></template></page-modal></div>
</template><style scoped></style>

高阶组件

page-search.vue

<template><div class="search"><!-- 1.1.表单输入 --><el-form :model="searchForm" ref="formRef" label-width="120px" size="large"><el-row :gutter="20"><template v-for="item in searchConfig.formItems" :key="item.prop"><el-col :span="8"><el-form-item :label="item.label" :prop="item.prop"><template v-if="item.type === 'input'"><el-input v-model="searchForm[item.prop]" :placeholder="item.placeholder" /></template><template v-if="item.type === 'date-picker'"><el-date-pickerv-model="searchForm[item.prop]"type="daterange"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"/></template></el-form-item></el-col></template></el-row></el-form><!-- 1.2.搜索按钮  --><div class="btns"><el-button size="large" icon="Refresh" @click="handleResetClick">重置</el-button><el-button size="large" icon="Search" type="primary" @click="handleQueryClick">查询</el-button></div></div>
</template><script setup lang="ts" name="page-search">
import type {ElForm} from 'element-plus'
import {reactive, ref} from 'vue'const emit = defineEmits(['queryClick', 'resetClick'])// 根据配置初始化表单数据
const {searchConfig} = defineProps(['searchConfig'])
const initialForm: any = {}
for (const item of searchConfig.formItems) {initialForm[item.prop] = ""
}
// console.log('初始化表单数据', initialForm)
// 1.创建表单的数据
const searchForm = reactive(initialForm)// 2.监听按钮的点击
const formRef = ref<InstanceType<typeof ElForm>>()function handleResetClick() {formRef.value?.resetFields()emit('resetClick')
}function handleQueryClick() {emit('queryClick', searchForm)
}
</script><style scoped lang="less">
.search {background-color: #fff;padding: 20px;border-radius: 5px;.el-form-item {padding: 20px 40px;margin-bottom: 0;}
}.btns {text-align: right;padding: 0 50px 10px 0;
}
</style>

page-content.vue

  1. header
  2. propList
    1. 插槽(定制化)=> 作用域插槽
  3. pageName
<template><div class="content"><div class="header"><h3 class="title">{{ contentConfig?.header?.title ?? "数据列表" }}</h3><el-button v-if="isCreate" type="primary" @click="handleNewData">{{contentConfig?.header?.btnText ?? "新建数据"}}</el-button></div><div class="table"><el-table:data="pageList":border="true":row-key="contentConfig?.childrenTree?.rowKey"style="width: 100%"><template v-for="item in contentConfig.propsList" :key="item.prop"><!-- <el-table-column align="center" :label="item.label" :prop="item.prop" :width="item.width ?? '150px'"></el-table-column>--><el-table-columnv-if="item.type === 'index' || item.type === 'selection'"align="center"v-bind="item"/><el-table-column v-else-if="item.type === 'custom'" align="center" v-bind="item"><template #default="scope"><slot :name="item.slotName" v-bind="scope" :prop="item.prop" :leaderRange="10" /></template></el-table-column><el-table-column v-else align="center" v-bind="item"><template #default="scope"><span v-if="item.type === 'timer'">{{ formatUTC(scope.row[item.prop]) }}</span><span v-else-if="item.type === 'handler'"><el-buttonv-if="isUpdate"type="primary"size="small"icon="EditPen"link@click="handleEditClick(scope.row)">编辑</el-button><el-buttonv-if="isDelete"type="danger"size="small"icon="Delete"link@click="handleDeleteClick(scope.row.id)">删除</el-button></span><span v-else>{{ scope.row[item.prop] }}</span></template></el-table-column></template></el-table></div><div class="footer"><el-paginationv-model:currentPage="currentPage"v-model:pageSize="pageSize":page-sizes="[10, 20, 30]"layout="total, sizes, prev, pager, next, jumper":total="pageTotalCount"@update:currentPage="handleCurrentChange"@update:pageSize="handlePageSizeChange"/></div></div>
</template><script setup lang="ts" name="content">
import { storeToRefs } from "pinia";
import { ref } from "vue";
import useSystemStore from "@/stores/modules/main/system/system";
import { formatUTC } from "@/utils/format";
import usePermission from "@/hooks/usePermission";const { contentConfig } = defineProps(["contentConfig"]);
const emit = defineEmits(["newDataClick", "editDataClick"]);// 0.判断是否有增删改查的权限
const isCreate = usePermission(contentConfig.pageName, "create");
const isDelete = usePermission(contentConfig.pageName, "delete");
const isUpdate = usePermission(contentConfig.pageName, "update");
const isQuery = usePermission(contentConfig.pageName, "query");// 1.请求数据
const systemStore = useSystemStore();
const currentPage = ref(1);
const pageSize = ref(10);systemStore.$onAction(({ name, after }) => {after(() => {if (name === "deletePageByIdAction" ||name === "editPageDataAction" ||name === "newPageDataAction") {currentPage.value = 1;}})
});function fetchPageListData(queryInfo: any = {}) {// 0.判断是否具有查询权限if (!isQuery) return;// 1.获取offset和sizeconst size = pageSize.value;const offset = (currentPage.value - 1) * size;// 2.发生网络请求systemStore.postPageListAction(contentConfig.pageName, { offset, size, ...queryInfo });
}fetchPageListData();// 2.展示数据
const { pageList, pageTotalCount } = storeToRefs(systemStore);// 3.绑定分页数据
function handleCurrentChange() {fetchPageListData();
}function handlePageSizeChange(newPageSize: number) {pageSize.value = newPageSize;fetchPageListData();
}function handleResetClick() {currentPage.value = 1;pageSize.value = 10;fetchPageListData();
}// 4.新建数据的处理
function handleNewData() {emit("newDataClick");
}// 5.删除和编辑操作
function handleDeleteClick(id: number) {systemStore.deletePageByIdAction(contentConfig.pageName, id);
}function handleEditClick(data: any) {emit("editDataClick", data);
}// 暴露函数
defineExpose({fetchPageListData,handleResetClick
});
</script><style scoped lang="less">
.content {margin-top: 20px;padding: 20px;background-color: #fff;.header {display: flex;height: 45px;padding: 0 5px;justify-content: space-between;align-items: center;.title {font-size: 20px;font-weight: 700;}.handler {align-items: center;}}.table {:deep(.el-table__cell) {padding: 14px 0;}}.footer {display: flex;justify-content: flex-end;margin-top: 15px;}
}
</style>

page-modal.vue

  1. header
    1. newTitle
    2. editTitle
  2. pageName
  3. formItems
<template><div class="modal"><el-dialog v-model="dialogVisible" :title="modalConfig.header.newTitle" width="30%" center><div class="form"><el-form :model="formData" label-width="80px" size="large"><template v-for="item in modalConfig.formItems" :key="item.prop"><el-form-item :label="item.label" :prop="item.prop"><template v-if="item.type === 'input'"><el-input v-model="formData[item.prop]" :placeholder="item.placeholder" /></template><template v-if="item.type === 'password'"><el-inputshow-passwordv-model="formData[item.prop]":placeholder="item.placeholder"/></template><template v-if="item.type === 'select'"><el-selectv-model="formData.parentId":placeholder="item.placeholder"style="width: 100%"><template v-for="value in item.options" :key="value.value"><el-option :value="value.value" :label="value.label" /></template></el-select></template><template v-if="item.type === 'date-picker'"><el-date-pickertype="daterange"range-separator="-"start-placeholder="开始时间"end-placeholder="结束时间"v-model="formData[item.prop]"/></template><template v-if="item.type === 'custom'"><slot :name="item.slotName"></slot></template></el-form-item></template></el-form></div><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" @click="handleConfirmClick">确定</el-button></span></template></el-dialog></div>
</template><script setup lang="ts" name="modal">
import { storeToRefs } from "pinia";
import { reactive, ref } from "vue";
import useSystemStore from "@/stores/modules/main/system/system";const dialogVisible = ref(false);
const isEdit = ref(false);
const editData = ref();// 定义数据绑定
const formData = reactive<any>({name: "",leader: "",parentId: ""
});const { modalConfig, treeInfo } = defineProps(["modalConfig", "treeInfo"]);
// 点击确定
const systemStore = useSystemStore();
const { departmentList } = storeToRefs(systemStore);const initialData: any = {};
for (const item of modalConfig?.formItems) {initialData[item.prop] = item.initialValue ?? "";
}function handleConfirmClick() {dialogVisible.value = false;// 判断是否存在含树形菜单权限的formDatalet treeFormData = { ...formData };if (treeInfo) {treeFormData = {...treeFormData,...treeInfo};}console.log(treeFormData);if (!isEdit.value) {systemStore.newPageDataAction(modalConfig.pageName, treeFormData);} else {systemStore.editPageDataAction(modalConfig.pageName, editData.value.id, treeFormData);}
}// 新建或者编辑
function setDialogVisible(isNew: boolean = true, data: any = {}) {dialogVisible.value = true;isEdit.value = !isNew;editData.value = data;for (const key in formData) {if (isNew) {formData[key] = "";} else {formData[key] = data[key];}}
}defineExpose({setDialogVisible
});
</script><style scoped lang="less">
.form {padding: 10px 30px;
}
</style>

hooks

usePageContent.ts

import { useTemplateRef } from "vue";
import PageContent from "@/components/page-content/page-content.vue";function usePageContent() {const contentRef = useTemplateRef<InstanceType<typeof PageContent>>("contentRef");const handleQueryClick = (queryInfo: any) => {contentRef.value?.fetchPageListData(queryInfo);};const handleResetClick = () => {contentRef.value?.fetchPageListData();};return {contentRef,handleQueryClick,handleResetClick};
}export default usePageContent;

usePageModal.ts

import { useTemplateRef } from "vue";
import PageModal from "@/components/page-modal/page-modal.vue";function usePageModal(newCallback?: () => void, editCallback?: (itemData: any) => void) {const modalRef = useTemplateRef<InstanceType<typeof PageModal>>("modalRef");const handleNewClick = () => {modalRef.value?.setDialogVisible(true);if (newCallback) newCallback();};const handleEditClick = (itemData: any) => {modalRef.value?.setDialogVisible(false, itemData);if (editCallback) editCallback(itemData)};return {modalRef,handleNewClick,handleEditClick};
}export default usePageModal;

最终呈现

在这里插入图片描述

相关文章:

后台管理系统通用页面抽离=>高阶组件+配置文件+hooks

目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…...

RDP协议详解

以下内容包含对 RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;及其开源实现 FreeRDP 的较为系统、深入的讲解&#xff0c;涵盖协议概要、历史沿革、核心原理、安全机制、安装与使用方法、扩展与未来发展趋势等方面&#xff0c; --- ## 一、引…...

Spring Boot - 数据库集成06 - 集成ElasticSearch

Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一&#xff1a;前置工作1&#xff1a;项目搭建和依赖导入2&#xff1a;客户端连接相关构建3&#xff1a;实体类相关注解配置说明 二&#xff1a;客户端client相关操作说明1&#xff1a;检索流程1.1&…...

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…...

Flutter开发环境配置

下载 Flutter SDK 下载地址&#xff1a;https://docs.flutter.cn/get-started/install M1/M2芯片选择带arm64字样的Flutter SDK。 解压 cd /Applications unzip ~/Downloads/flutter_macos_arm64_3.27.3-stable.zip执行 /Applications/flutter/bin/flutterManage your Flut…...

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…...

rust操作pgsql、mysql和sqlite

rust中&#xff0c;有很多技术可以操作pgsql、mysql和sqlite&#xff0c;以sqlx为主流技术。我们以sqlx操作sqlite为示例&#xff0c;操作pgsql和mysql的办法是一样的。 Cargo.toml: [package] name "test" version "0.1.0" edition "2021"…...

5. 【Vue实战--孢子记账--Web 版开发】-- 主页UI

我们在实现个人中心的时候简单的搭建了一个主页UI&#xff0c;但是这个主页并不是我们需要的&#xff0c;在这一节我们将一起实现主页UI的搭建。 一、功能 主页UI的原型如下: 首页UI原型包括左侧菜单和顶部header&#xff0c;左侧菜单包含多个功能模块的链接&#xff1a;首页…...

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…...

使用 PyTorch 实现逻辑回归并评估模型性能

1. 逻辑回归简介 逻辑回归是一种用于解决二分类问题的算法。它通过一个逻辑函数&#xff08;Sigmoid 函数&#xff09;将线性回归的输出映射到 [0, 1] 区间内&#xff0c;从而将问题转化为概率预测问题。如果预测概率大于 0.5&#xff0c;则将样本分类为正类&#xff1b;否则分…...

Rust 函数使用详解

Rust 函数使用详解 函数是 Rust 程序的基本构建块之一。通过函数&#xff0c;我们可以将代码组织成可重用的模块。本文将从函数签名语法、函数参数、语句与表达式、函数返回值等角度详细介绍 Rust 函数的使用&#xff0c;并通过综合示例展示这些知识点的实际应用。 1. 函数签名…...

ARM TEE

在ARM的语境中&#xff0c;TEE是Trusted Execution Environment&#xff08;可信执行环境&#xff09;的缩写。ARM TEE就是基于ARM架构实现的可信执行环境&#xff0c;以下是具体介绍&#xff1a; 定义与原理 定义&#xff1a;ARM TEE是基于独立硬件&#xff0c;和主操作系统…...

Miniconda 安装及使用

文章目录 前言1、Miniconda 简介2、Linux 环境说明2.1、安装2.2、配置2.3、常用命令2.4、常见问题及解决方案 前言 在 Python 中&#xff0c;“环境管理”是一个非常重要的概念&#xff0c;它主要是指对 Python 解释器及其相关依赖库进行管理和隔离&#xff0c;以确保开发环境…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…...

C#面向对象(封装)

1.什么是封装? C# 封装 封装 被定义为“把一个或多个项目封闭在一个物理的或者逻辑的包中”。 在面向对象程序设计方法论中&#xff0c;封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。 抽象允许相关信息可视化&#xff0c;封装则使开发者实现所…...

【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索

深度与创新&#xff1a;AI领域的革新者 DeepSeek&#xff0c;这个由幻方量化创立的人工智能公司推出的一系列AI模型&#xff0c;不仅在技术架构上展现出了前所未有的突破&#xff0c;更在应用领域中开启了无限可能的大门。从其混合专家架构&#xff08;MoE&#xff09;到多头潜…...

【新春特辑】2025年1月科技浪潮中的AI最新时事与科技趋势

2025年1月科技浪潮中的AI最新时事与科技趋势 一、AI科技时事 人工智能代理&#xff08;AI Agent&#xff09;的发展 最新进展&#xff1a;人工智能代理正逐步成为科技领域的新热点。这些代理能够自主执行特定任务&#xff0c;如管理日程、回复邮件等。然而&#xff0c;它们仍…...

使用PyTorch实现逻辑回归:从训练到模型保存与性能评估

1. 引入必要的库 首先&#xff0c;需要引入必要的库。PyTorch用于构建和训练模型&#xff0c;pandas和numpy用于数据处理&#xff0c;scikit-learn用于计算性能指标。 import torch import torch.nn as nn import torch.optim as optim import pandas as pd import numpy as …...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.24 随机宇宙:生成现实世界数据的艺术

1.24 随机宇宙&#xff1a;生成现实世界数据的艺术 目录 #mermaid-svg-vN1An9qZ6t4JUcGa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vN1An9qZ6t4JUcGa .error-icon{fill:#552222;}#mermaid-svg-vN1An9qZ6t4JUc…...

C#面试常考随笔8:using关键字有哪些用法?

1. using 指令&#xff1a;引入命名空间 最常用的用法。通过using 命名空间名字&#xff0c;可以在程序中直接使用该命名空间中的类型&#xff0c;而无需指定类型的完整命名空间路径。例如&#xff1a; using System; using System.Collections.Generic; class Program {sta…...

lstm代码解析1.2

在使用 LSTM&#xff08;长短期记忆网络&#xff09;进行训练时&#xff0c;model.fit 方法的输入数据 X 和目标数据 y 的形状要求是不同的。具体来说&#xff1a; 1. 输入数据 X 的形状 LSTM 层期望输入数据 X 是三维张量&#xff0c;形状为 (samples, timesteps, features)…...

JavaScript系列(52)--编译优化技术详解

JavaScript编译优化技术详解 &#x1f680; 今天&#xff0c;让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术&#xff0c;我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript引擎通常…...

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_8264829…...

Electricity Market Optimization 探索系列(一)

​ 本文参考链接&#xff1a;Linear Programming Mini Example 先从一个线性规划的例子说起&#xff1a; 问题背景&#xff1a; 现在需要使用两台发电机满足用户的用电需求&#xff0c;发电机一的发电功率上限是 6MW&#xff0c;发电机二的发电功率上限是 4MW&#xff0c;发电…...

<iframe>标签和定时调用函数setInterval

iframe 标签和定时调用函数 setInterval 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 今天遇到一个前端问题&#xff0c;在浏览器页面上传Excel文件后&#xff0c;然后点击导入按钮&#xff0c;经后端Java类读取文件内容校验后&#xff0c;将校验结果返回…...

网工_HDLC协议

2025.01.25&#xff1a;网工老姜学习笔记 第9节 HDLC协议 9.1 HDLC高级数据链路控制9.2 HDLC帧格式&#xff08;*控制字段&#xff09;9.2.1 信息帧&#xff08;承载用户数据&#xff0c;0开头&#xff09;9.2.2 监督帧&#xff08;帮助信息可靠传输&#xff0c;10开头&#xf…...

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…...

【Go语言圣经】第六节:方法

第六章&#xff1a;方法 6.1 方法声明 在函数声明时&#xff0c;在其名字之前放上一个变量&#xff0c;这就是声明了变量对应类型的一个方法&#xff0c;相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法&#xff1a; package mai…...

[答疑]DDD伪创新哪有资格和仿制药比

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 远航 2025-1-24 10:40 最近的热门话题仿制药&#xff0c;想到您经常批评的伪创新&#xff0c;这两者是不是很像&#xff1f; UMLChina潘加宇 伪创新哪有资格和仿制药比。 仿制药的…...

MySQL(高级特性篇) 13 章——事务基础知识

一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 &#xff08;1&#xff09;存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务能看出在MySQL中&#xff0c;只有InnoDB是支持事务的 &#x…...

javascript常用函数大全

javascript函数一共可分为五类&#xff1a; •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数&#xff1a; (1)alert函数&#xff1a;显示一个警告对话框&#xff0c;包括一个OK按钮。 (2)confirm函数&#xff1a;显…...

第26节课:内容安全策略(CSP)—构建安全网页的防御盾

目录 CSP基础CSP的作用CSP的主要属性 配置CSP通过响应头配置CSP通过HTML <meta>标签配置CSP属性设置详解指定多个来源 配置示例说明 常见错误配置实践&#xff1a;CSP与XSS防护示例1&#xff1a;防止内联脚本和样式说明示例2&#xff1a;限制图片来源说明 限制与注意事项…...

【大坑】使用element-ui弹窗$confirm自动弹出

插入element-ui的弹窗后页面一刷新自动弹出&#xff0c;事件绑定、调用位置&#xff08;生命周期&#xff09;均没有问题&#xff0c;通过不断注释组件发现是main.js全局引入导致的问题。如果需要在某些组件中使用三方弹窗&#xff0c;可以按需引入&#xff0c;而不是全局注册 …...

Spring的AOP思想中事物管理注意点

我们以事务管理实现AOP思想 通过在Service层加入事务管理,因为Service层可能使用多个DAO(多条SQL语句) 要保证这些SQL要么同时成功,要么同时失败,例如:学生Serivce:删除学生的时候,还需要删除学生关联信息(选课信息) 只有都删除成功才提交,如果有一条执行失败…...

PHP Mail:高效邮件发送解决方案详解

PHP Mail&#xff1a;高效邮件发送解决方案详解 引言 在互联网时代&#xff0c;邮件作为最常用的沟通方式之一&#xff0c;已经成为企业和个人不可或缺的通讯工具。PHP作为一种流行的服务器端脚本语言&#xff0c;在邮件发送方面具有天然的优势。本文将详细介绍PHP Mail&…...

python recv的概念和使用案例

recv 是网络编程中用于从套接字接收数据的核心函数&#xff0c;常见于 TCP/UDP 通信。以下是其概念、用法和案例详解&#xff1a; 概念 作用&#xff1a;从已连接&#xff08;TCP&#xff09;或已绑定&#xff08;UDP&#xff09;的套接字接收数据。参数&#xff1a; bufsize:…...

安卓(android)读取手机通讯录【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可在代码地址查看&#xff09; 1.熟悉内容提供者(Content Provider)的概念和作用。 2.掌握内容提供者的创建和使用方法。 4.掌握内容URI的结构和用途。 二、实验条件 1.熟悉内容提供者的工作原理。 2.掌握内容提供者访问其…...

Java知识速记 == 与equals

Java知识速记 与equals 1. 操作符概述 操作符用于比较基本数据类型的值&#xff0c;或者比较引用类型的对象是否指向同一内存地址。对于基本数据类型&#xff0c;例如int、float等&#xff0c;会比较其值&#xff1b;但对于对象&#xff0c;只会比较两个对象的引用&#xff…...

web集群

项目名称 基于keepalivednginx构建一个高可用、高性能的web集群 项目架构图 项目描述 基本描述 构建一个基于 Nginx 的 7 层负载均衡的 Web 集群系统&#xff0c;模拟企业级业务环境&#xff0c;实现高并发和高可用性的 Web 集群。通过压力测试验证集群性能&#xff0c;找…...

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画&#xff0c;通过 CSS 技术实现了雪花的下落和消失效果&#xff0c;为页面添加了视觉吸引力和动态感。 大家复制代码时&#xff0c;可能会因格式转换出现错乱&#xff0c;导致样式失效。建议先少量复制代码进行测试&#xff0c;若未能…...

Kafka SSL(TLS)安全协议

文章目录 Kafka SSL&#xff08;TLS&#xff09;安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务&#xff08;DoS&#xff09;攻击 2. Kafka SSL 配置步骤&#xff08;1&#xff09;创建 SSL 证…...

WebForms SortedList 深度解析

WebForms SortedList 深度解析 引言 在Web开发领域,对于数据结构的理解与应用至关重要。其中,SortedList类在WebForms中是一个常用的数据结构,它能够帮助开发者高效地管理有序数据集合。本文将深入解析SortedList类在WebForms中的应用,包括其基本概念、常用方法、性能特点…...

项目集成Spring Security认证部分

一、需求分析 在本项目中&#xff0c;使用了Spring Security框架来进行认证和授权管理。由于是前后端分离的项目&#xff0c;所有认证的请求需要通过Token来验证身份&#xff0c;系统中包括了用户登录、角色授权以及资源访问控制等功能。 系统中的资源控制&#xff1a; 白名单…...

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙

目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活…...

【算法】回溯算法专题① ——子集型回溯 python

目录 引入变形实战演练总结 引入 子集 https://leetcode.cn/problems/subsets/description/ 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 …...

Nginx 安装配置指南

Nginx 安装配置指南 引言 Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c;同时也可以作为 IMAP/POP3/SMTP 代理服务器。由于其稳定性、丰富的功能集以及低资源消耗而被广泛应用于各种场景。本文将为您详细介绍 Nginx 的安装与配置过程。 系统要求 在安装 Nginx 之…...

深度学习 DAY3:NLP发展史

NLP发展史 NLP发展脉络简要梳理如下&#xff1a; (远古模型&#xff0c;上图没有但也可以算NLP&#xff09; 1940 - BOW&#xff08;无序统计模型&#xff09; 1950 - n-gram&#xff08;基于词序的模型&#xff09; (近代模型&#xff09; 2001 - Neural language models&am…...

Spring Data JPA 实战:构建高性能数据访问层

1 简介 1.1 Spring Data JPA 概述 1.1.1 什么是 Spring Data JPA? Spring Data JPA 是 Spring Data 项目的一部分,旨在简化对基于 JPA 的数据库访问操作。它通过提供一致的编程模型和接口,使得开发者可以更轻松地与关系型数据库进行交互,同时减少了样板代码的编写。Spri…...

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…...