Java项目:SSM个人博客网站管理系统

news2024/12/24 2:23:53

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

项目介绍

本项目包含管理员与游客两种角色;

管理员角色包含以下功能:

发表文章,查看文章,类别管理,添加类别,个人信息管理,评论管理,评论审核等功能。

游客角色包含以下功能:
首页,博客详情,文章分类,评论等功能。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 

5.数据库:MySql 5.7版本;

6.是否Maven项目:是;

技术栈

1. 后端:Spring+SpringMVC+Mybatis

2. 前端:JSP+CSS+JavaScript+bootstrap+jquery

使用说明

1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;

2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;

3. 将项目中jdbc.properties配置文件中的数据库配置改为自己的配置;

4. 运行项目,输入localhost:8080/personal_blog 登录

运行截图

游客角色

管理员角色

 

相关代码

BlogAdminController

package com.june.web.controller.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.june.lucene.BlogIndex;
import com.june.model.Blog;
import com.june.model.BlogType;
import com.june.model.PageBean;
import com.june.service.BlogService;
import com.june.service.BlogTypeService;
import com.june.service.CommentService;
import com.june.util.Constants;
import com.june.util.DateUtils;
import com.june.util.PageUtils;
import com.june.util.StringUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 博客Controller
 */
@Controller
@RequestMapping("/blog")
public @Slf4j class BlogAdminController {

	@Resource
	private BlogService blogService;

	@Resource
	private BlogTypeService blogTypeService;

	@Resource
	private CommentService commentService;
	
	@Resource
	private BlogIndex blogIndex;
	
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer page, 
			@RequestParam(defaultValue = Constants.DEFAULT_PAGE_SIZE - 1 + "") Integer pageSize,
			String firstDate, String secondDate, Integer typeId, String title, Model model,
			HttpServletRequest request) {

		Map<String, Object> map = new HashMap<>(6);
		map.put("typeId", typeId);
		map.put("title", title);
		map.put("firstDate", firstDate);
		map.put("secondDate", secondDate);
		int totalCount = blogService.getCount(map);
		PageBean pageBean = new PageBean(totalCount, page, pageSize);
		map.put("start", pageBean.getStart());
		map.put("size", pageSize);
		model.addAttribute("pagination", pageBean);
		
		List<BlogType> blogTypeList = blogTypeService.getTypeList();
		model.addAttribute("blogTypeList",blogTypeList);

		StringBuilder param = new StringBuilder(); // 分页查询参数
		param.append(StringUtils.isEmpty(title) ? "" : "title=" + title);
		param.append(StringUtils.isEmpty(firstDate) ? "" : "&firstDate=" + firstDate);
		param.append(StringUtils.isEmpty(secondDate) ? "" : "&secondDate=" + secondDate);
		param.append(typeId == null ? "" : "&typeId=" + typeId);

		String pageCode = PageUtils.genPagination(request.getContextPath() + "/blog/list.do",
				pageBean, param.toString());
		model.addAttribute("pageCode", pageCode);
		model.addAttribute("entry", map);
		model.addAttribute("blogList", blogService.getBlogList(map));
		return "blog/list";
	}

	@RequestMapping("/toAdd")
	public String toAdd(Model model) {
		model.addAttribute("blogTypeList", blogTypeService.getTypeList());
		return "blog/add";
	}

	@RequestMapping("/toUpdate")
	public String toUpdate(Integer id, Model model) {
		model.addAttribute("blogTypeList", blogTypeService.getTypeList());
		Blog blog = blogService.findById(id);
		model.addAttribute("blog", blog);
		BlogType blogType = blog.getBlogType();
		if(blogType != null){
			model.addAttribute("typeId", blogType.getTypeId());
		}
		return "blog/update";
	}

	@RequestMapping("/add")
	public void add(Blog blog, @RequestParam(value = "img") MultipartFile file,
			Model model) throws Exception {

		// 获取原始文件名
		String fileName = file.getOriginalFilename();
		int index = fileName.indexOf(".");
		String imageUrl = null;
		String imagePath = DateUtils.getTimeStrForImage();
		if (index != -1) {
			//生成新文件名
			imageUrl = imagePath + fileName.substring(index);
			log.info("add {}", imagePath);
			handleFileUpload(file, imageUrl);
			blog.setImage(imageUrl);
		}
		// 添加博客及索引
		int result = blogService.add(blog);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/update")
	public void update(Blog blog, @RequestParam(value = "img", required=false) MultipartFile file,
			Model model) throws Exception {

		if (file != null) {	 //上传图片
			// 获取原始文件名
			String fileName = file.getOriginalFilename();
			int index = fileName.indexOf(".");
			String imageUrl = null;
			String imagePath = DateUtils.getTimeStrForImage();
			if(index != -1){
				//生成新文件名
				imageUrl = imagePath + fileName.substring(index);
				log.info("update {}", imagePath);
				handleFileUpload(file,imageUrl);
				blog.setImage(imageUrl);
			}
		}
		//更新博客及索引
		int result = blogService.update(blog);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/delete")
	public String delete(Integer id) throws IOException {
		// 删除博客、索引及评论
		blogService.delete(id);
		return "redirect:/blog/list.do";
	}

	@RequestMapping("/deletes")
	public String deletes(String ids) throws IOException {
		String[] idArr = org.springframework.util.StringUtils.commaDelimitedListToStringArray(ids);
		int len = idArr.length;
		Integer[] blogIds = new Integer[len];
		for (int i = 0; i < len; i++) {
			blogIds[i] = Integer.parseInt(idArr[i]);
		}
		blogService.batchDelete(blogIds);
		return "redirect:/blog/list.do";
	}
	
	private void handleFileUpload(MultipartFile file, String imageUrl) {
		try (InputStream is = file.getInputStream()) {
			// 获取输入流
			String filePath = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(0,Thread.currentThread().getContextClassLoader().getResource("").getPath().length()-16)+Constants.COVER_DIR + imageUrl;
			File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
			//判断上传目录是否存在
			if (!dir.exists()) {
				dir.mkdirs();
			}
			try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
				byte[] buffer = new byte[1024];
				int len = 0;
				// 读取输入流中的内容
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
				}
			}
		} catch (Exception e) {
			log.error("图片上传失败", e);
		}
	}
}

BloggerAdminController 

package com.june.web.controller.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.june.model.Blogger;
import com.june.service.BloggerService;
import com.june.service.CommentService;
import com.june.util.Constants;
import com.june.util.DateUtils;
import com.june.util.ResponseUtils;
import com.june.util.ShiroUtils;

import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/blogger")
public @Slf4j class BloggerAdminController {

	@Resource
	private CommentService commentService;

	@Resource
	private BloggerService bloggerService;

	@RequestMapping("/toModifyInfo")
	public String toModifyInfo(Model model) {
		model.addAttribute("blogger", bloggerService.find());
		return "blogger/modifyInfo";
	}

	@RequestMapping("/toModifyPassword")
	public String toModifyPassword() {
		return "blogger/modifyPassword";
	}

	@RequestMapping("/modifyInfo")
	public void modifyInfo(Blogger blogger,
			@RequestParam(value = "img", required = false) MultipartFile file,
			Model model) throws Exception {
		
		if (file != null) {	 //上传图片
			// 获取原始文件名
			String fileName = file.getOriginalFilename();
			int index = fileName.indexOf(".");
			String imageUrl = null;
			if (index != -1) {
				// 生成新文件名
				imageUrl = DateUtils.getTimeStrForImage() + fileName.substring(index);
				handleFileUpload(file, imageUrl);
				blogger.setImageUrl(imageUrl);
			}
		}
		int result = bloggerService.update(blogger);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}

	@RequestMapping("/modifyPassword")
	public void modifyPassword(String newpwd, String oldpwd, String repwd, HttpServletResponse response,
			HttpServletRequest request) {

		Blogger blogger = bloggerService.find();
		if (!blogger.getPassword().equals(ShiroUtils.encryptPassword(oldpwd))) {
			ResponseUtils.writeText(response, "原密码输入不正确");
			return;
		}
		if (!newpwd.equals(repwd)) {
			ResponseUtils.writeText(response, "两次密码输入不一致");
			return;
		}
		blogger.setPassword(ShiroUtils.encryptPassword(newpwd));
		bloggerService.update(blogger);
		ResponseUtils.writeText(response, "修改成功");
	}

	private void handleFileUpload(MultipartFile file,String imageUrl) {
		try (InputStream is = file.getInputStream()) {
			// 获取输入流
			String filePath = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(0,Thread.currentThread().getContextClassLoader().getResource("").getPath().length()-16)+Constants.AVATAR_DIR + imageUrl;
			File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
			//判断上传目录是否存在
			if (!dir.exists()) {
				dir.mkdirs();
			}
			try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
				byte[] buffer = new byte[1024];
				int len = 0;
				// 读取输入流中的内容
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
				}
			}
		} catch (Exception e) {
			log.error("图片上传失败", e);
		}
	}
}

BlogTypeAdminController

package com.june.web.controller.admin;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.june.model.BlogType;
import com.june.model.PageBean;
import com.june.service.BlogService;
import com.june.service.BlogTypeService;
import com.june.util.Constants;
import com.june.util.PageUtils;
import com.june.util.ResponseUtils;

/**
 * 博客类别Controller
 */
@Controller
@RequestMapping("/blogType")
public class BlogTypeAdminController {

	@Resource
	private BlogTypeService blogTypeService;
	
	@Resource
	private BlogService blogService;

	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = Constants.BACK_PAGE_SIZE + 3 + "") Integer pageSize,
			Model model, HttpServletRequest request) {
		int totalCount = blogTypeService.getCount();
		PageBean pageBean = new PageBean(totalCount, page, pageSize);
		Map<String, Object> params = new HashMap<>(2);
		params.put("start", pageBean.getStart());
		params.put("size", pageSize);
		List<BlogType> blogTypeList = blogTypeService.getTypeList(params);
		blogTypeList.forEach(blogType -> {
			Map<String, Object> types = new HashMap<>(1);
			types.put("typeId", blogType.getTypeId());
			Integer blogCount = blogService.getCount(types);
			blogType.setBlogCount(blogCount);
		});
		model.addAttribute("pagination", pageBean);

		String targetUrl = request.getContextPath() + "/blogType/list.do";
		String pageCode = PageUtils.genPagination(targetUrl, pageBean, "");
		model.addAttribute("pageCode", pageCode);
		model.addAttribute("entry", params);
		model.addAttribute("blogTypeList", blogTypeList);
		return "blogType/list";
	}

	@RequestMapping("/toAdd")
	public String toAdd() {
		return "blogType/add";
	}

	@RequestMapping("/toUpdate")
	public String toUpdate(Integer id,Model model) {
		model.addAttribute("blogType", blogTypeService.findById(id));
		return "blogType/update";
	}

	@RequestMapping("/add")
	public void add(BlogType blogType,Model model) {
		int result = blogTypeService.add(blogType);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}
	
	@RequestMapping("/update")
	public void update(BlogType blogType,Model model) {
		int result = blogTypeService.update(blogType);
		model.addAttribute("msg", result > 0 ? "保存成功" : "保存失败");
	}
	
	@RequestMapping("/search")
	public void search(Integer id,HttpServletResponse response){
		JSONObject jsonObj = new JSONObject();
		Map<String, Object> map = new HashMap<>(1);
		map.put("typeId", id);
		jsonObj.put("count", blogService.getCount(map));
		ResponseUtils.writeJson(response, jsonObj.toString());
	}

	//只删除类别
	@RequestMapping("/delete")
	public String delete(Integer id) {
		blogTypeService.delete(id);
		return "redirect:/blogType/list.do";
	}

	//删除的同时将相关博客的类别置为默认分类
	@RequestMapping("/batch_delete")
	public String batchDelete(Integer id) throws IOException {
		blogTypeService.batchDelete(id);
		return "redirect:/blogType/list.do";
	}
}

CommentAdminController

package com.june.web.controller.admin;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.june.model.Comment;
import com.june.model.PageBean;
import com.june.service.BlogService;
import com.june.service.CommentService;
import com.june.util.Constants;
import com.june.util.PageUtils;
import com.june.util.ResponseUtils;
import com.june.util.StringUtils;

@Controller
@RequestMapping("/comment")
public class CommentAdminController {

	@Resource
	private CommentService commentService;
	
	@Resource
	private BlogService blogService;
	
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer page, 
			@RequestParam(defaultValue = Constants.BACK_PAGE_SIZE + 1 + "") Integer pageSize,
			String firstDate, String secondDate, String userName, 
			Boolean isPass, Model model, HttpServletRequest request) {
		
		Map<String, Object> params = new HashMap<String, Object>(6);
		params.put("firstDate", firstDate);
		params.put("secondDate", secondDate);
		params.put("userName", userName);
		params.put("isPass", isPass);
		int totalCount = commentService.getCount(params);
		PageBean pageBean = new PageBean(totalCount, page, pageSize);
		params.put("start", pageBean.getStart());
		params.put("size", pageSize);
		List<Comment> commentList = commentService.getCommentList(params);
		commentList.stream().forEach(comment -> {
			String content = comment.getContent();
			if (content.length() > 60) {
				comment.setContent(content.substring(0,60) + "...");
			}
		});
		model.addAttribute("pagination", pageBean);
		StringBuilder param = new StringBuilder(); // 分页查询参数
		param.append(StringUtils.isEmpty(firstDate) ? "" : "&firstDate=" + firstDate);
		param.append(StringUtils.isEmpty(secondDate) ? "" : "&secondDate=" + secondDate);
		param.append(StringUtils.isEmpty(userName) ? "" : "&userName=" + userName);
		param.append(isPass == null ? "" : "&isPass=" + isPass);
		
		String pageCode = PageUtils.genPagination(request.getContextPath() + "/comment/list.do", 
				pageBean, param.toString());
		model.addAttribute("pageCode", pageCode);
		model.addAttribute("entry", params);
		model.addAttribute("commentList", commentList);
		return "comment/list";
	}
	
	@RequestMapping("/toAdd")
	public String toAdd() {
		return "comment/add";
	}
	
	@RequestMapping("/detail")
	public String detail(Integer id,Model model){
		model.addAttribute("comment", commentService.findById(id));
		return "comment/detail";
	}
	
	//评论审核
	@RequestMapping("/audit")
	public void audit(Comment comment, HttpServletResponse response) {
		comment.setReplyDate(new Date());
		int result = commentService.audit(comment);
		JSONObject jsonObj = new JSONObject();
		jsonObj.put("success", result > 0);
		ResponseUtils.writeJson(response, jsonObj.toString());
	}
	
	@RequestMapping("/delete")
	public String delete(Integer id) throws IOException{
		commentService.delete(id);
		return "redirect:/comment/list.do";
	}
	
	@RequestMapping("/deletes")
	public String deletes(String ids) {
		String[] idArr = org.springframework.util.StringUtils.commaDelimitedListToStringArray(ids);
		int len = idArr.length;
		Integer[] commentIds = new Integer[len];
		for (int i = 0; i < len; i++) {
			commentIds[i] = Integer.parseInt(idArr[i]);
		}
		commentService.batchDelete(commentIds);
		return "redirect:/comment/list.do";
	}
}

如果也想学习本系统,下面领取。关注并回复:103ssm 

 

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

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

相关文章

DeepSort目标跟踪算法

DeepSort目标跟踪算法是在Sort算法基础上改进的。 首先介绍一下Sort算法 Sort算法的核心便是卡尔曼滤波与匈牙利匹配算法 卡尔曼滤波是一种通过运动特征来预测目标运动轨迹的算法 其核心为五个公式&#xff0c;包含两个过程&#xff1a; 其分为先验估计&#xff08;预测&…

[附源码]计算机毕业设计人事管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

UE4中抛体物理模拟UProjectileMovementComponent

UE4中抛体物理模拟UProjectileMovementComponent1.简述2.使用方法3.绘制抛物曲线4.绘制抛物曲线1.简述 背景&#xff1a;实现抛体运动&#xff0c;反弹效果&#xff0c;抛物曲线等功能 通用实现可以使用spline绘制&#xff0c;物体按照下图接口可以根据时间更新位置 USplineC…

CN_MAC介质访问控制子层@CSMA协议

文章目录常用方法静态方法信道划分MAC特点动态方法随机访问MACCSMA协议CSMA/CD多点接入(或多点访问):载波监听Note:&#x1f388;碰撞检测碰撞:碰撞冲突过程传播时延对载波侦听的影响&#x1f388;争用期发现碰撞的最迟情况电磁波的速率是有限最短帧长&#x1f388;小结&#x…

CAD重复圆绘制机械图形

这次CAD必练图形第四个&#xff0c;这个图形主要用到了CAD圆、直线、修剪、旋转等多个命令&#xff0c;看着不简单&#xff0c;等绘制出来后就觉得还是挺简单的。 目标图形 操作步骤 1.使用CAD直线命令绘制一条水平的直线和四条垂直的直线&#xff0c;四条垂直的直线之间的距…

【网络层】DHCP协议(应用层)、ICMP、IPv6详解

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录DHCP------DHCP服务器来动态分配IP--------应用层协议----允许地址重用ICMP字段----差错报文、询问报文差错报文-----终点不可达无法交付--------源点抑制、拥塞丢数据&#xff08;现在废弃&#xff09;----…

JAVA小区物业管理系统(源代码+论文)

毕业设计(论文) [摘要] 物业管理系统是紧随当今时代发展的需要&#xff0c;目的在于实现不同的人员对物业系统的不同的需要&#xff0c;有利于社会的稳定和顺利发展。 关键词&#xff1a;小程序Applet&#xff1b;应用程序Application;数据库&#xff1b;数据库实现&#xf…

12.5 - 每日一题 - 408

每日一句&#xff1a;没有醒不来的早晨&#xff0c;弄不懂的题目&#xff0c;熬不过的迷茫&#xff0c;只有你不敢追的梦。 数据结构 1 在最后一趟排序开始之前&#xff0c;所有记录有可能都不在其最终位置上的是______。 A. 直接插入排序B. 冒泡排序C. 堆排序D. 快速排…

底层逻辑-理解Go语言的本质

1.Java VS Go语言 Java&#xff0c;从源代码到编译成可运行的代码 上图已经展示了这个过程:从Java的源代码编译成jar包或war包(字节码),最终运行在JVM中。 我们把Java源代码编译后的jar包或war包看成是工程师生产出来的产品&#xff0c;操作系统是一个平台&#xff0c;JVM就是…

【RCNN系列】RCNN论文总结

目标检测论文总结 【RCNN系列】 RCNN RCNN目标检测论文总结前言一、Pipeline二、模型设计1.warp2.SVM3.阈值设定4.box回归三、思考四、缺点前言 一些经典论文的总结。 一、Pipeline 首先传入Input image&#xff0c;利用Selective Search&#xff08;比较古老&#xff09;算法…

【计算机网络】数据链路层:拓展的以太网

在物理层拓展以太网&#xff1a; 使用光纤拓展&#xff1a;主机使用光纤和一对光纤调制解调器连接到集线器。 使用集线器拓展&#xff1a;使用集线器连成更大的以太网 集线器优点&#xff1a; 使原来不同碰撞域的计算机能够跨碰撞域通信&#xff0c;扩大了以太网覆盖的地理范…

GDB使用技巧和相关插件

GDB使用-小技巧 参考&#xff1a;《100个gdb小技巧》 链接中的文档有许多关于GDB的使用小技巧&#xff1b; $info functions - 列出函数的名称 $s/step - 步入&#xff0c;进入带有调试信息的函数 $n/next - 下一个要执行的程序代码 $call/print - 直接调用函数执行 $i/info …

jvm简介

.什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相…

Postman如何做接口测试,那些不得不知道的技巧

目录&#xff1a;导读 前言 Postman如何做接口测试1&#xff1a;如何导入 swagger 接口文档 Postman如何做接口测试2&#xff1a;如何切换测试环境 Postman如何做接口测试3&#xff1a;什么&#xff1f;postman 还可以做压力测试&#xff1f; Postman如何做接口测试4&…

电源控制测试老化系统-国产电源测试仪器-电源模块测试系统NSAT-8000

*测试仪器&#xff1a;可编程直流电源、可编程直流电子负载、数字示波器、功率计 *测试产品&#xff1a;电源模块。纳米软件电源ATE自动测试系统适用于大功率工业电源、AC/DC类DC电源供应器、适配器、充电器、LED电源等开关电源之综合性能测试。 *被测项目&#xff1a;有效值电…

快来组战队,赢iPhone啦!

常见问题 问&#xff1a;我邀请的人再去邀请&#xff0c;也算我的战队队员么&#xff1f;我最多可以有多少个队员&#xff1f; 答&#xff1a;您将和您直接邀请的人组成战队&#xff0c;并担任该战队的队长。如果被您邀请的小伙伴再去邀请其他人&#xff0c;那么您邀请的小伙…

跨域推荐(Cross-Domain Recommendation)的最新综述

论文解读系列第十六篇&#xff1a;IJCAI 2021--跨域推荐&#xff08;Cross-Domain Recommendation&#xff09;的最新综述 - 知乎 数据稀疏问题 目录 1.背景介绍 (1)内容层级相关性(content-level relevance) (2)用户层级相关性(user-level relevance) (3)产品层级相关性…

OpenCV从2到3的过渡

与版本2.4相比&#xff0c;OpenCV 3.0引入了许多新算法和功能。有些模块已被重写&#xff0c;有些已经重组。尽管2.4中的大多数算法仍然存在&#xff0c;但接口可能不同。本节描述了一般性的最显着变化&#xff0c;过渡操作的所有细节和示例都在本文档的下一部分中。 1、贡献存…

nginx安装与配置反向代理

Nginx (engine x) 是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev(伊戈尔赛索耶夫)所开发.话不多说直接上步骤 1.安装nginx,我是在root用户下不需要加sudo yum install nginx 安…

嵌入式分享合集116

一、DC-DC升压电路模块原理 DC-DC 转换器是一种电力电子电路&#xff0c;可有效地将直流电从一个电压转换为另一个电压。 DC-DC 转换器在现代电子产品中扮演着不可或缺的角色。这是因为与线性稳压器相比&#xff0c;它们具有多项优势。尤其是线性稳压器会散发大量热量&#x…