PageDTO<T>,PageQuery,BeanUtils,CollUtils的封裝

一、PageDTO<T>

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tianji.common.utils.BeanUtils;
import com.tianji.common.utils.CollUtils;
import com.tianji.common.utils.Convert;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分頁結果")
public class PageDTO<T> {@ApiModelProperty("總條數")protected Long total;@ApiModelProperty("總頁碼數")protected Long pages;@ApiModelProperty("當前頁數據")protected List<T> list;public static <T> PageDTO<T> empty(Long total, Long pages) {return new PageDTO<>(total, pages, CollUtils.emptyList());}public static <T> PageDTO<T> empty(Page<?> page) {return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList());}public static <T> PageDTO<T> of(Page<T> page) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(), page.getRecords());}public static <T,R> PageDTO<T> of(Page<R> page, Function<R, T> mapper) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(),page.getRecords().stream().map(mapper).collect(Collectors.toList()));}public static <T> PageDTO<T> of(Page<?> page, List<T> list) {return new PageDTO<>(page.getTotal(), page.getPages(), list);}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz));}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz, Convert<R, T> convert) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz, convert));}@ApiModelProperty(hidden = true)@JsonIgnorepublic boolean isEmpty(){return list == null || list.size() == 0;}
}

二、 PageQuery

2.1 PageQuery代碼

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxx.common.constants.Constant;
import com.xxx.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import javax.validation.constraints.Min;@Data
@ApiModel(description = "分頁請求參數")
@Accessors(chain = true)
public class PageQuery {public static final Integer DEFAULT_PAGE_SIZE = 20;public static final Integer DEFAULT_PAGE_NUM = 1;@ApiModelProperty(value = "頁碼", example = "1")@Min(value = 1, message = "頁碼不能小于1")private Integer pageNo = DEFAULT_PAGE_NUM;@ApiModelProperty(value = "每頁大小", example = "5")@Min(value = 1, message = "每頁查詢數量不能小于1")private Integer pageSize = DEFAULT_PAGE_SIZE;@ApiModelProperty(value = "是否升序", example = "true")private Boolean isAsc = true;@ApiModelProperty(value = "排序字段", example = "id")private String sortBy;public int from(){return (pageNo - 1) * pageSize;}public <T> Page<T> toMpPage(OrderItem ... orderItems) {Page<T> page = new Page<>(pageNo, pageSize);// 是否手動指定排序方式if (orderItems != null && orderItems.length > 0) {for (OrderItem orderItem : orderItems) {page.addOrder(orderItem);}return page;}// 前端是否有排序字段if (StringUtils.isNotEmpty(sortBy)){OrderItem orderItem = new OrderItem();orderItem.setAsc(isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);}return page;}public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc) {if (StringUtils.isBlank(sortBy)){sortBy = defaultSortBy;this.isAsc = isAsc;}Page<T> page = new Page<>(pageNo, pageSize);OrderItem orderItem = new OrderItem();orderItem.setAsc(this.isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);return page;}public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {return toMpPage(Constant.DATA_FIELD_NAME_CREATE_TIME, false);}
}

2.2 使用舉例

@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "互動問題分頁查詢條件")
public class QuestionPageQuery extends PageQuery {// 用戶端查詢條件@ApiModelProperty(value = "課程id")private Long courseId;@ApiModelProperty(value = "小節id", example = "1")private Long sectionId;@ApiModelProperty(value = "是否只查詢我的問題", example = "1")private Boolean onlyMine;
}----------------------------------------------------------------//1 獲取用戶id
Long userId = UserContext.getUser();Boolean onlyMine = query.getOnlyMine(); // 是否只查詢自己
Long sectionId = query.getSectionId();
Long courseId = query.getCourseId();
//2 分頁查詢問題表(question)數據
// selecgt * from question  where user_id=?  and course_id =? and section_id=? and hidden= false;
Page<InteractionQuestion> page = this.lambdaQuery().eq(onlyMine, InteractionQuestion::getUserId, userId) // 只查詢自己,才拼接條件.eq(courseId != null, InteractionQuestion::getCourseId, courseId) // 傳遞了 課程,才拼接課程查詢.eq(sectionId != null, InteractionQuestion::getSectionId, sectionId)  // 傳遞了 小節,才拼接小節查詢.eq(InteractionQuestion::getHidden, false) // 被管理員隱藏的不顯示.page(query.toMpPageDefaultSortByCreateTimeDesc()); // 按照創建日期倒敘排序
List<InteractionQuestion> records = page.getRecords();
if(CollUtils.isEmpty(records)){ // 如果沒有return PageDTO.empty(page);
}
// 1.獲取用戶id
Long userId = UserContext.getUser();
// 2) 分頁查詢數據庫
// select * from learning_lesson where user_id=?  order by create_time desc  limit 5Page<LearningLesson> page = this.lambdaQuery().eq(LearningLesson::getUserId, userId).page(query.toMpPage("latest_learn_time", false));//  mybatis  會把  查詢的數據全部封裝到 page 中: 數據, 總條數數據集
List<LearningLesson> records = page.getRecords(); // 獲取當前頁數據
if(CollUtils.isEmpty(records)){return PageDTO.empty(page); // 如果沒有數據返回空對象
}

三、BeanUtils

3.1 BeanUtils代碼

import cn.hutool.core.bean.BeanUtil;import java.util.List;
import java.util.stream.Collectors;/*** 繼承自 hutool 的BeanUtil,增加了bean轉換時自定義轉換器的功能*/
public class BeanUtils extends BeanUtil {/*** 將原對象轉換成目標對象,對于字段不匹配的字段可以使用轉換器處理** @param source  原對象* @param clazz   目標對象的class* @param convert 轉換器* @param <R>     原對象類型* @param <T>     目標對象類型* @return 目標對象*/public static <R, T> T copyBean(R source, Class<T> clazz, Convert<R, T> convert) {T target = copyBean(source, clazz);if (convert != null) {convert.convert(source, target);}return target;}/*** 將原對象轉換成目標對象,對于字段不匹配的字段可以使用轉換器處理** @param source  原對象* @param clazz   目標對象的class* @param <R>     原對象類型* @param <T>     目標對象類型* @return 目標對象*/public static <R, T> T copyBean(R source, Class<T> clazz){if (source == null) {return null;}return toBean(source, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return copyToList(list, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz, Convert<R, T> convert) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return list.stream().map(r -> copyBean(r, clazz, convert)).collect(Collectors.toList());}
}
package com.xxx.common.utils;/*** 對原對象進行計算,設置到目標對象中**/
public interface Convert<R,T>{void convert(R origin, T target);
}

3.2 舉例

在這里插入圖片描述

在這里插入圖片描述

    public void save(CourseTeacherSaveDTO courseTeacherSaveDTO) {//1.數據刪除條件LambdaUpdateWrapper<CourseTeacherDraft> updateWrapper =Wrappers.lambdaUpdate(CourseTeacherDraft.class).eq(CourseTeacherDraft::getCourseId, courseTeacherSaveDTO.getId());//1.1.數據刪除baseMapper.delete(updateWrapper);//2.組裝即將插入的數據// List<TeacherInfo> teachersList<CourseTeacherDraft> courseTeacherDrafts =BeanUtils.copyList(courseTeacherSaveDTO.getTeachers(),CourseTeacherDraft.class,(teacherInfo, teacherDraft) -> {//2.1.設置課程idteacherDraft.setCourseId(courseTeacherSaveDTO.getId());//2.2.設置老師idteacherDraft.setTeacherId(teacherInfo.getId());//2.3.設置課程中老師排序teacherDraft.setCIndex(courseTeacherSaveDTO.getTeachers().indexOf(teacherInfo));});//3.批量插入課程的老師信息saveBatch(courseTeacherDrafts);//4.更新課程填寫進度courseDraftService.updateStep(courseTeacherSaveDTO.getId(), CourseConstants.CourseStep.TEACHER);}-----------------------------------------------------
@ApiModel("課程老師關系模型")
public class CourseTeacherSaveDTO {@ApiModelProperty("課程id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_COURSE_ID_NULL)private Long id;@ApiModelProperty("老師id和用戶端是否展示,該列表按照界面上的順序")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)
//    @Min(value = 1, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)@Size(min = 1, max = 5, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX )private List<TeacherInfo> teachers;@Data@ApiModel("老師id和用戶端是否顯示")public static class TeacherInfo{@ApiModelProperty("老師id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_ID_NULL)private Long id;@ApiModelProperty("用戶端是否展示")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_SHOW)private Boolean isShow;}
}

四、CollUtils

4.1 CollUtils代碼

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.IterUtil;
import com.xxx.common.validate.Checker;import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 繼承自 hutool 的集合工具類*/
public class CollUtils extends CollectionUtil {public static <T> List<T> emptyList() {return Collections.emptyList();}public static <T> Set<T> emptySet() {return Collections.emptySet();}public static <K,V> Map<K, V> emptyMap() {return Collections.emptyMap();}public static <T> Set<T> singletonSet(T t) {return Collections.singleton(t);}public static <T> List<T> singletonList(T t) {return Collections.singletonList(t);}public static List<Integer> convertToInteger(List<String> originList){return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null;}public static List<Long> convertToLong(List<String> originLIst){return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null;}/*** 以 conjunction 為分隔符將集合轉換為字符串 如果集合元素為數組、Iterable或Iterator,則遞歸組合其為字符串* @param collection 集合* @param conjunction 分隔符* @param <T> 集合元素類型* @return 連接后的字符串* See Also: IterUtil.join(Iterator, CharSequence)*/public static <T> String join(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}return IterUtil.join(collection.iterator(), conjunction);}public static <T> String joinIgnoreNull(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}StringBuilder sb = new StringBuilder();for (T t : collection) {if(t == null) continue;sb.append(t).append(",");}if(sb.length() <= 0){return null;}return sb.deleteCharAt(sb.length() - 1).toString();}/*** 集合校驗邏輯** @param data 要校驗的集合* @param checker 校驗器* @param <T> 集合元素類型*/public static  <T> void  check(List<T> data, Checker<T> checker){if(data == null){return;}for (T t : data){checker.check(t);}}/*** 集合校驗邏輯** @param data 要校驗的集合* @param <T> 集合元素類型*/public static  <T extends Checker<T>> void  check(List<T> data){if(data == null){return;}for (T t : data){t.check();}}/*** 將元素加入到集合中,為null的過濾掉** @param list 集合* @param data 要添加的數據* @param <T> 元素類型*/public static <T> void add(Collection<T> list, T... data) {if (list == null || ArrayUtils.isEmpty(data)) {return;}for (T t : data) {if (ObjectUtils.isNotEmpty(t)) {list.add(t);}}}//將兩個集合出現次數相加public static Map<Long, Integer> union(Map<Long, Integer> map1, Map<Long, Integer> map2) {if (CollUtils.isEmpty(map1)) {return map2;} else if (CollUtils.isEmpty(map2)) {return map1;}for (Map.Entry<Long, Integer> entry : map1.entrySet()) {Integer num = map2.get(entry.getKey());map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue());}return map2;}public static <T,R> R getFiledOfFirst(List<T> list, Function<T, R> function) {if (CollUtils.isEmpty(list)) {return null;}return function.apply(list.get(0));}
}

/*** 實現后在接口訪問時如果接口實現了這個接口* 會被自動自行接口check進行校驗**/
public interface Checker<T> {/*** 用于實現validation不能校驗的數據邏輯*/default void check(){}default void check(T data){}
}

4.2 checker舉例

@ApiModel(description = "章節")
public class CataSaveDTO implements Checker {@ApiModelProperty("章、節、練習id")private Long id;@ApiModelProperty("目錄類型1:章,2:節,3:測試")@NotNull(message = "")private Integer type;@ApiModelProperty("章節練習名稱")private String name;@ApiModelProperty("章排序,章一定要傳,小節和練習不需要傳")private Integer index;@ApiModelProperty("當前章的小節或練習")@Size(min = 1, message = "不能出現空章")private List<CataSaveDTO> sections;@Overridepublic void check() {//名稱為空校驗if(type == CourseConstants.CataType.CHAPTER && StringUtils.isEmpty(name)) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL);}else if(StringUtils.isEmpty(name)){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL2);}//名稱長度問題if (type == CourseConstants.CataType.CHAPTER && name.length() > 30){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE);}else if(name.length() > 30) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE2);}if(CollUtils.isEmpty(sections)){throw new BadRequestException("不能出現空章");}}
}
@ApiModel("題目保存模型")
@Data
public class SubjectSaveDTO implements Checker {@ApiModelProperty("題目id,為空新增,不為空更新")private Long id;@ApiModelProperty("名稱")@NotNull(message = "題目為空,請設置題目")@Size(max = 200, min = 5, message = "題目長度為5-200")private String name;@ApiModelProperty("所屬題目分類")@NotNull(message = "題目分類為空,請設置題目分類")private List<List<Long>> cates;@ApiModelProperty("題目類型")@NotNull(message = "題目類型為空,請設置題目類型")@EnumValid(enumeration = {1,2,3,4,5}, message = "題目類型只有單選題,多選題,不定向選擇題,判斷題,您的題目超出題綱")private Integer subjectType;@ApiModelProperty("題目難易度")@NotNull(message = "難度不能為空")@EnumValid(enumeration = {1,2,3},message = "題目難度只有簡單,中等,困難")private Integer difficulty;@ApiModelProperty("分值")private Integer score;@ApiModelProperty("課程id")private List<Long> courseIds;@ApiModelProperty("選項,最多10個")private List<String> options;@ApiModelProperty("答案,判斷題,數組第一個如果是1,代表正確,其他代表錯誤")@NotNull(message = "題目答案不能為空")private List<Integer> answers;@ApiModelProperty("解析")private String analysis;@Overridepublic void check() {//選擇題 單選,多選,不定向選擇if(subjectType == SubjectConstants.Type.SIGNLE_CHOICE.getType() ||subjectType == SubjectConstants.Type.MUtiple_CHOICE.getType() ||subjectType == SubjectConstants.Type.NON_DIRECTIONAL_CHOICE.getType()){Integer answerOptionMax = answers.stream().max(Integer::compare).get();//選項最少1個最多10個if(CollUtils.isEmpty(options) || options.size() > 10){throw new BizIllegalException("最少1個選項,最多10個選項");}//選擇題答案 不能超過選項數if(answerOptionMax > options.size()){throw new BizIllegalException("存在正確的答案找不到選項");}if(StringUtils.isNotEmpty(analysis)&& (StringUtils.length(analysis) < 5|| StringUtils.length(analysis) > 300)) {throw new BadRequestException("答案解析長度為5-300");}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43575.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#中的MD5摘要算法與哈希算法

文章目錄 一、哈希算法基礎二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#實現示例MD5算法示例哈希算法示例字符串MD5值對比 六、總結 一、哈希算法基礎 哈希算法是一種單向密碼體制&#xff0c;它將任意長度的數據轉換成固定長度的字符串。這種轉換是不可逆的&#xff0…

IDEA中配置代理,解決Codearts Snap登陸不了的問題

問題描述&#xff1a;在mac電腦中的idea中安裝了華為的codearts snap插件&#xff0c;一直登錄不了&#xff0c;賬號是沒問題的&#xff0c;后來我懷疑是我的代理有問題&#xff0c;找到IDEA中的代理設置先是有這個問題“You have JVM property "https.proxyHost" se…

千呼新零售2.0分銷商城視頻介紹

千呼新零售2.0系統是零售行業連鎖店一體化收銀系統&#xff0c;包括線下收銀線上商城連鎖店管理ERP管理商品管理供應商管理會員營銷等功能為一體&#xff0c;線上線下數據全部打通。 適用于商超、便利店、水果、生鮮、母嬰、服裝、零食、百貨、寵物等連鎖店使用。 詳細介紹請…

C語言 將兩個字符串連接起來,不用strcat函數

編一個程序,將兩個字符串連接起來,不要用strcat函數。 #include <stdio.h>void my_strcat(char *s1, const char *s2) {while (*s1) {s1;}while (*s2) {*s1 *s2;s1;s2;}*s1 \0; }int main() {char s1[100] "Hello, ";char s2[] "World!";my_str…

Android初學者書籍推薦

書單 1.《Android應用開發項目式教程》&#xff0c;機械工業出版社&#xff0c;2024年出版2.《第一行代碼Android》第二版3.《第一行代碼Android》第三版4.《瘋狂Android講義》第四版5.《Android移動應用基礎教程&#xff08;Android Studio 第2版&#xff09;》 從學安卓到用安…

uniapp 打包成安卓APP預覽base64pdf實現方法

下載PDF.js 問題描述 在uniapp中預覽base64的PDF&#xff0c;可以使用web-view組件嵌入一個PDF.js的實例。以下是一個簡單的示例&#xff1a; 解決方案&#xff1a; 1.在頁面的.vue文件中添加web-view組件&#xff1a; <template><view style"width: 50%;&qu…

【機器學習】支持向量機與主成分分析在機器學習中的應用

文章目錄 一、支持向量機概述什么是支持向量機&#xff1f;超平面和支持向量大邊距直覺 二、數據預處理與可視化數據集的基本信息導入必要的庫加載數據集數據概況數據可視化特征對的散點圖矩陣類別分布條形圖平均面積與平均光滑度的散點圖變量之間的相關性熱圖 三、模型訓練&am…

JS【詳解】類 class ( ES6 新增語法 )

本質上&#xff0c;類只是一種特殊的函數。 console.log(typeof 某類); //"function"聲明類 class 方式 1 – 類聲明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 類表達式 匿名式 const Car class {constructor(mod…

在conda的環境中安裝Jupyter及其他軟件包

Pytorch版本、安裝和檢驗 大多數軟件包都是隨Anaconda安裝的&#xff0c;也可以根據需要手動安裝一些其他軟件包。 目錄 創建虛擬環境 進入虛擬環境 安裝Jupyter notebook 安裝matplotlib 安裝 pandas 創建虛擬環境 基于conda包的環境創建、激活、管理與刪除http://t.cs…

podman 替代 docker ? centos Stream 10 已經棄用docker,開始用podman了!

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

淺談React

forwardRef和useImperativeHandle的聯動使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

Java中鎖的分類、原理、使用場景、注意事項、優缺點等詳解

Java開發中&#xff0c;鎖是保證多線程安全的重要手段。Java提供了多種類型的鎖來滿足不同的同步需求。在這篇文章中&#xff0c;我將為您介紹以下幾種常見的鎖類型&#xff1a; 偏向鎖/輕量級鎖/重量級鎖 偏向鎖&#xff1a;當一個線程獲取一個對象的鎖時&#xff0c;如果發現…

解決MCM功率電源模塊EMC的關鍵

對MCM功率電源而言&#xff0c;由于其工作在幾百kHz的高頻開關狀態&#xff0c;故易成為干擾源。電磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指設備或系統在其電磁環境中符合要求運行并不對其環境中的任何設備產生無法忍受的電磁干擾的…

react父調用子的方法,子調用父的方法

父調用子的方法 // 子組件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…

量化交易的實戰操作與心得

量化交易&#xff0c;作為一種基于數學模型和算法執行交易的方法&#xff0c;已經在全球金融市場中取得了廣泛的應用。對于從事量化交易的投資者而言&#xff0c;了解實戰操作的具體細節及相關心得是至關重要的&#xff0c;它可以幫助投資者優化策略&#xff0c;提高交易效率&a…

浪潮天啟防火墻TQ2000遠程配置方法SSL-xxx、L2xx 配置方法

前言 本次設置只針對配置VXX&#xff0c;其他防火墻配置不涉及。建議把防火墻內外網都調通后再進行Vxx配置。 其他配置可參考&#xff1a;浪潮天啟防火墻配置手冊 配置SSLVxx 在外網端口開啟SSLVxx信息 開啟SSLVxx功能 1、勾選 “啟用SSL-Vxx” 2、設置登錄端口號&#xff0…

springboot零食盒子-計算機畢業設計源碼50658

目 錄 1 緒論 1.1 研究背景 1.2研究意義 1.3論文結構與章節安排 2 微信小程序的零食盒子系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據流程 3.3.2 業務流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 微信…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;來快速排序。 這里介紹一些相關的算法&#xff0c;鞏固記憶。 快速排序 跟二分查找有一丟丟像。 首先選擇一個基準元素&#xff0c;一般就直接選擇第一個。然后兩個指針&#xff0c…

編程玩具應用前景怎么樣:深入剖析四大方面、五大趨勢、六大挑戰與七大機遇

編程玩具應用前景怎么樣&#xff1a;深入剖析四大方面、五大趨勢、六大挑戰與七大機遇 在科技飛速發展的今天&#xff0c;編程玩具作為一種新興的教育工具&#xff0c;正逐漸走進人們的視野。那么&#xff0c;編程玩具的應用前景究竟如何呢&#xff1f;本文將從四個方面、五個…

測試類型介紹-安全性測試實戰技巧

安全性測試實戰技巧 在當今數字化時代&#xff0c;軟件安全不再是可選項&#xff0c;而是每一款產品的必備特性。隨著網絡攻擊的復雜性和頻率不斷上升&#xff0c;安全性測試成為了確保應用程序健壯性和用戶數據保護的關鍵環節。 1. 安全性測試的重要性? 安全性測試旨在識別…