会议OA项目之权限管理个人中心(修改个人信息,选择本地图片进行头像修改)

news2024/11/17 3:24:06

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于OA项目的相关操作吧

数据表及分析

 表数据

 表分析

所谓的权限管理就是不同的人管理不同的事,拥有着管理不同事情的不同权力。那么第一张表--权限表,这张表中存放的是用户的角色编号以及可看的权限界面。第二张表--用户表,其中不同的用户有不同的角色id。第三表--权限内容表,其中就是所有的页面

sql语句分析

权限管理,首先就是围绕着权限表来的,但是我们要的内容是在其他表中的。所以这个时候我们肯定是需要拿到两张或以上的表来操作的。那么我们首先是需要通过id把t_oa_permissiont_oa_role_permission连接起来,那么还有rid呢,我们也需要连接用户表吗?其实不然,我们在登录的时候就以及把用户的信息保存在session中了,那么我们是不是也可以拿到保存到session中的rid呢?显然是可以的,在下文会有代码展示!

SELECT
	* 
FROM
	t_oa_permission 
WHERE
	id IN ( SELECT pid FROM t_oa_role_permission WHERE rid = rid )

一.主要功能点介绍

①权限管理:不同身份的人看到的左侧菜单不一样,所拥有的权限不一样

②个人中心:

                        🔺拿到当前登录的用户的个人信息,当用户进入到个人中心界面点击修改的时候,需要他先输入原密码,只有原密码正确,才能够进行后续的修改信息的操作【还没有输入密码以及密码输入不正确时,用户的信息为可读状态】修改完成后,会进行一个判断,修改之后的密码不能够与原密码一致

                        🔺修改头像,如果用户没有头像的话,那么便会显示一个默认的头像,如果用户有头像了,那么显示的便是用户本身的头像,且头像的上面都附有一个相机图标的遮罩,点击这个相机图标的遮罩,便可以触发一个图像上传的机制,可以选择本地的图片作为自己的头像。

二.权限管理与个人中心(修改头像)的共有前端部分

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<%@include file="/common/head.jsp"%>
<script type="text/javascript" src="static/js/main.js"></script>
<!-- 引入fontawesome的css -->
<link rel="stylesheet" rev="stylesheet"
	href="static/js/plugin/fontawesome-free-5.15.4-web/css/all.min.css"
	type="text/css" media="all">
<style>
.avatar-wrapper {
	position: relative;
	display: inline-block;
}

.avatar {
	position: relative;
	display: inline-block;
	cursor: pointer;
}

.avatar img {
	max-width: 100%;
	max-height: 100%;
	display: block;
	border-radius: 50%;
}

.avatar .camera-icon-wrapper {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background: rgba(0, 0, 0, 0.5);
	display: flex;
	justify-content: center;
	align-items: center;
	opacity: 0;
	transition: opacity 0.3s ease;
	border-radius: 100%;
}

.avatar:hover .camera-icon-wrapper {
	opacity: 1;
}

.avatar .camera-icon-wrapper .camera-icon {
	font-size: 40px;
	color: white;
}
</style>

</head>
<body>
 <div class="layui-layout layui-layout-admin">
  <div class="layui-header">
    <div class="layui-logo layui-hide-xs" style="color: white; font-weight: bolder; font-size: 22px; font-family: kaiti;">光军会议OA系统</div>

    <!-- 个人头像及账号操作 -->
    <ul class="layui-nav layui-layout-right">
      <li class="layui-nav-item layui-hide layui-show-md-inline-block">
        <div class="avatar-wrapper">
          <div class="avatar">
            <label for="fileInput" style="cursor: pointer;" onclick="document.getElementById('uploadBtn').click();">
              <img id="avatarImg" src="${not empty user.profile ? user.profile : 'static/images/默认头像.png'}" class="layui-nav-img">
              <div class="camera-icon-wrapper">
                <i id="cameraIcon" class="fas fa-camera"></i>
              </div>
            </label>
          </div>
          <dl class="layui-nav-child">
            <dd><a href="myProfile.jsp">我的头像</a></dd>
            <dd><a href="personalCenter.jsp">修改信息</a></dd>
            <dd><a href="login.jsp">退出登录</a></dd>
          </dl>
        </div>
        <input type="file" class="layui-upload" id="fileInput" style="display: none;">
        <button type="button" class="layui-btn layui-btn-primary layui-btn-sm" id="uploadBtn" style="display: none;">上传</button>
      </li>
      <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
        <a href="javascript:;"><i class="layui-icon layui-icon-more-vertical"></i></a>
      </li>
    </ul>
  </div>

  <div class="layui-side">
    <div class="layui-side-scroll">
      <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
      <ul id="menu" class="layui-nav layui-nav-tree" lay-filter="menu"></ul>
    </div>
  </div>

  <div class="layui-body">
    <!-- 内容主体区域 -->
    <div class="layui-tab" lay-filter="demo" lay-allowclose="true">
      <ul class="layui-tab-title">
        <li>首页</li>
      </ul>
      <div class="layui-tab-content">
        <div class="layui-tab-item layui-show">
          <!-- 选项卡内容 -->
          <img src="static/images/首页.jpg" style="width: 1165px; height: 630px;">
        </div>
      </div>
    </div>
  </div>

  <div class="layui-footer">
    <!-- 底部固定区域 -->
    <h6 style="font-weight: bolder; text-align: center; font-family: heiti;">&copy;所有版权信息和最终解释权归光军股份有限公司所有</h6>
  </div>
</div>

 <script>
  layui.use(['upload', 'element', 'layer'], function() {
    var $ = layui.jquery,
      upload = layui.upload,
      element = layui.element,
      layer = layui.layer;

    //常规使用 - 普通图片上传
 // 在文件上传之前定义一个变量来保存文件名
    var fileName;

//常规使用 - 普通图片上传
var uploadInst = upload.render({
  elem: '#fileInput',
  url: 'user.action?methodName=updProfile',
  before: function(obj){
	  console.log("数据",obj)
    // 预读本地文件示例,不支持ie8
    obj.preview(function(index, file, result){
    	console.log("数据",file)
      $('#avatarImg').attr('src', result); // 图片链接(base64)
   // 更新文件名变量
      fileName = file.name;
    });

    
  },
  done: function(res){
    // 如果上传失败
    if(res.code > 0){
      return layer.msg('上传失败');
    }
    // 上传成功的一些操作
    //......

    if (!fileName) {
      return layer.msg('上传失败:文件名未定义');
    }

    // 更新图片显示的URL
    $('#avatarImg').attr('src', 'static/images/' + fileName);

    // 构造带参数的 URL
    var urlWithParam = 'user.action?methodName=updProfile&profile=' + encodeURIComponent('static/images/'+fileName);

    // 发起 AJAX 请求
    $.ajax({
      url: urlWithParam,
      type: 'GET',
      success: function(response) {
        // 处理上传成功后的逻辑
      },
          error: function(error) {
            // 处理上传失败的逻辑
          }
        });
      },
      error: function(){
        //演示失败状态,并实现重传
        var demoText = $('#demoText');
        demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
        demoText.find('.demo-reload').on('click', function(){
          uploadInst.upload();
        });
      }
    });
    });
</script>



</body>
</html>

main.js


var element,layer,util,$;
layui.use(['element', 'layer', 'util'], function(){
	  element = layui.element
	  ,layer = layui.layer
	  ,util = layui.util
	  ,$ = layui.$;
	  
	  //左侧树形菜单
	 $.ajax({
		 url:"permission.action?methodName=menus",
 		dataType:'json',
 		method: 'post',
		success: function(data) {
			console.info(data)
			var content=' ';
			$.each(data,function(i,n){
				content+=' <li  class="layui-nav-item layui-nav-itemed"> ';
				content+='		<a class="" href="javascript:;">'+n.text+'</a> ';  
				
				if(n.hasChildren){
				var children =n.children;
				content+='<dl class="layui-nav-child"> ';
				$.each(children,function(idx,nodes){
					content+=' <dd><a href="javascript:;" onclick="openTab(\''+nodes.text+'\',\''+nodes.attributes.self.url+'\',\''+nodes.id+'\' )">'+nodes.text+'</a></dd> ';
//					content+=' <dd><a href="javascript:;" onclick="openTab()">'+nodes.text+'</a></dd> ';
				})
				content+='</dl>';
				}
				
				content+=' </li>';
			
			})
			
			$("#menu").html(content);
			
			 element.render('menu');		
		}
	 })
});
	 
	 
	 
//	 //右侧选项卡
	 function openTab(title,content,id){
		 var $node=$('li[lay-id="'+id+'"]');
		 console.info($node);
				//新增一个Tab项
		 if($node.length==0){
			 element.tabAdd('demo', {
					title : title, //用于演示
					content :"<iframe src='"+content+"' width='100%' height='100%'></iframe>",
					id :id
				})
		 }
				//切换到指定Tab项
				element.tabChange('demo', id); //切换到:用户管理
			}
	 
	 	 

二.权限管理

后端代码

实体类

package com.wh.entity;

public class Permission {
	private long id;
	private String name;
	private String description;
	private String url;
	private long pid;
	private int ismenu;
	private long displayno;
	
	public Permission() {
		// TODO Auto-generated constructor stub
	}

	public Permission(long id, String name, String description, String url, long pid, int ismenu, long displayno) {
		super();
		this.id = id;
		this.name = name;
		this.description = description;
		this.url = url;
		this.pid = pid;
		this.ismenu = ismenu;
		this.displayno = displayno;
	}

	public Permission(String name, String description, String url, long pid, int ismenu, long displayno) {
		super();
		this.name = name;
		this.description = description;
		this.url = url;
		this.pid = pid;
		this.ismenu = ismenu;
		this.displayno = displayno;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public long getPid() {
		return pid;
	}

	public void setPid(long pid) {
		this.pid = pid;
	}

	public int getIsmenu() {
		return ismenu;
	}

	public void setIsmenu(int ismenu) {
		this.ismenu = ismenu;
	}

	public long getDisplayno() {
		return displayno;
	}

	public void setDisplayno(long displayno) {
		this.displayno = displayno;
	}

	@Override
	public String toString() {
		return "Permission [id=" + id + ", name=" + name + ", description=" + description + ", url=" + url + ", pid="
				+ pid + ", ismenu=" + ismenu + ", displayno=" + displayno + "]";
	}
	
	
}

dao

package com.wh.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.wh.entity.Permission;
import com.wh.entity.User;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.TreeVo;

public class PermissionDao extends BaseDao<Permission>{
	//查询所有
		public List<Permission> list( Permission permission,long rid, PageBean pageBean) throws Exception {
			String sql="SELECT * FROM t_oa_permission where  id in (select pid from t_oa_role_permission where rid="+rid+") ";
			System.out.println(sql);
			return super.executeQuery(sql, Permission.class, pageBean);
		}
	
	
	//将原数据转换成有层级关系的数据(借助自定义 工具类TreeVo完成)
	public List<TreeVo<Permission>> menus( Permission permission,long rid, PageBean pageBean) throws Exception {
		List<TreeVo<Permission>> menus = new ArrayList<>();
		List<Permission> list = this.list(permission,rid, pageBean);
		for (Permission p : list) {
			TreeVo<Permission> tv = new TreeVo<>();
			tv.setId(p.getId()+"");
			tv.setParentId(p.getPid()+"");
			tv.setText(p.getName());
			Map<String , Object> map = new HashMap<>();
			map.put("self", p);
			tv.setAttributes(map);
			menus.add(tv);
		}
//		return menus;
		return BuildTree.buildList(menus, "-1");//-1是顶级节点的id
	}
		
		
}

servlet

package com.wh.web;

import java.util.List;

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

import com.wh.dao.PermissionDao;
import com.wh.entity.Permission;
import com.wh.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.PageBean;
import com.zking.util.ResponseUtil;
import com.zking.util.StringUtils;
import com.zking.util.TreeVo;

public class PermissionAction extends ActionSupport implements ModelDriver<Permission>{
private Permission permission = new Permission();
private PermissionDao pd = new PermissionDao();

	public void menus(HttpServletRequest req, HttpServletResponse resp) {
		User u = (User) req.getSession().getAttribute("user");
		long rid = u.getRid();
				try {
					List<TreeVo<Permission>> menus = pd.menus(null,rid, null);
					ResponseUtil.writeJson(resp, menus);
				} catch (Exception e) {
					e.printStackTrace();
				}
	}
	@Override
	public Permission getModel() {
		return permission;
	}

}

三.个人中心

前端代码

personalCenter.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<html>
<head>
<%@include file="common/head.jsp"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人中心</title>
<style>
.title-section {
	text-align: center;
	padding: 20px 0;
	font-size: 24px;
	font-weight: bold;
}

.grid-section {
	display: flex;
}

 .layui-upload-img {
	flex: 1;
	margin-top: 80px;
	height: 400px;
	width: 400px;
} 

.form-section {
	flex: 1;
	padding: 20px;
}
</style>
</head>
<body>

	<div class="layui-container">
		<div class="title-section" style="margin-top: 50px;">
			<h1 style="font-family: kaiti; font-size: 65px;">个人中心</h1>
		</div>
		<div class="grid-section">
			<div class="layui-upload-list">
		<img id="avatarImg" src="${not empty user.profile ? user.profile : 'static/images/默认头像.png'}" class="layui-nav-img">
	</div>
			<div class="form-section">
				<form class="layui-form" style="margin-top: 80px;">
					<div class="layui-form-item" style="margin-top: 60px;">
						<label class="layui-form-label">真实姓名</label>
						<div class="layui-input-block">
							<input type="text" name="name" lay-verify="required"
								value="${user.name }" readonly=readonly autocomplete="off" class="layui-input">
						</div>
					</div>

					<div class="layui-form-item" style="margin-top: 60px;">
						<label class="layui-form-label">昵称</label>
						<div class="layui-input-block">
							<input type="text" name="loginName" readonly=readonly lay-verify="required"
								value="${user.loginName }" autocomplete="off"
								class="layui-input">
						</div>
					</div>

					<div class="layui-form-item" style="margin-top: 60px;">
						<label class="layui-form-label">密码</label>
						<div class="layui-input-block">
							<input type="password" name="pwd" lay-verify="required"
								value="${user.pwd }" readonly=readonly autocomplete="off" class="layui-input">
						</div>
					</div>

					<div class="layui-form-item" style="margin-top: 60px;">
						<div class="layui-input-block">
							<button class="layui-btn" lay-submit lay-filter="updateForm"
								id="modifyBtn">修改</button>
							<button class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>




	<script>
		layui.use([ 'jquery', 'layer', 'form'], function() {
			var $ = layui.jquery;
			var layer = layui.layer;
			var form = layui.form;
			
			
			
			
			

			// 密码确认对话框
			function promptPassword(callback) {
				var index = layer.prompt({
					formType : 1,
					title : '请输入旧密码',
					offset : 'auto',
					value : '',
					shadeClose : true
				}, function(value, elem) {
					callback(value, index);
				});
			}

			// 点击修改按钮,处理密码确认及密码框的变化
			$('#modifyBtn').click(function () {
				var originalPassword = "${user.pwd}";

				promptPassword(function (value, index) {
					var confirmPassword = value;

					if (confirmPassword === originalPassword) {
						$('input[name="pwd"]').attr('type', 'text');
						$('input[name="name"]').removeAttr('readonly');
						$('input[name="loginName"]').removeAttr('readonly');
						$('input[name="pwd"]').removeAttr('readonly');
					} else {
						layer.msg('密码不正确');
						$('.layui-layer-input').val(''); // 清空确认密码框
						return; // 结束回调,不关闭弹窗
					}

					form.render(); // 重新渲染表单元素
					layer.close(index); // 关闭对话框
				});
				return false; // 阻止表单默认提交行为
			});

			// 监听表单提交
			form.on('submit(submitForm)', function (data) {
				// 获取表单数据
				var name = data.field.name;
				var loginName = data.field.loginName;
				var pwd = data.field.pwd;
				var originalPassword = "${user.pwd}";

				// 判断用户是否更改了密码
				if (pwd === originalPassword) {
					layer.msg('密码不能与原密码一致');
					return false; // 阻止表单提交
				}

				// 发送 Ajax 请求
				$.ajax({
					type: 'POST',
					url: 'user.action?methodName=upd',
					data: {
						name: name,
						loginName: loginName,
						pwd: pwd
					},
					success: function (response) {

						var jsonObj = JSON.parse(response);
						console.log(jsonObj)
						if (jsonObj.success) {
							layer.msg(jsonObj.msg, {
								icon: 1
							},function(){
								window.location.href = "login.jsp";
							})
						} else {
							layer.msg(jsonObj.msg, {
								icon: 5
							})
						}
					}

				});

				return false; // 阻止表单提交
			});

			
		});
	</script>
</body>
</html>

后端代码

实体类

package com.wh.entity;

public class User {
private long id;
private String name;
private String loginName;
private String pwd;
private long rid;
private String profile;

public User() {
	// TODO Auto-generated constructor stub
}

public User(String name, String loginName, String pwd, long rid, String profile) {
	super();
	this.name = name;
	this.loginName = loginName;
	this.pwd = pwd;
	this.rid = rid;
	this.profile = profile;
}

public User(long id, String name, String loginName, String pwd, long rid, String profile) {
	super();
	this.id = id;
	this.name = name;
	this.loginName = loginName;
	this.pwd = pwd;
	this.rid = rid;
	this.profile = profile;
}




public long getId() {
	return id;
}

public void setId(long id) {
	this.id = id;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public String getLoginName() {
	return loginName;
}

public void setLoginName(String loginName) {
	this.loginName = loginName;
}

public String getPwd() {
	return pwd;
}

public void setPwd(String pwd) {
	this.pwd = pwd;
}

public long getRid() {
	return rid;
}

public void setRid(long rid) {
	this.rid = rid;
}

public String getProfile() {
	return profile;
}

public void setProfile(String profile) {
	this.profile = profile;
}

@Override
public String toString() {
	return "User [id=" + id + ", name=" + name + ", loginName=" + loginName + ", pwd=" + pwd + ", rid=" + rid
			+ ", profile=" + profile + "]";
}

}

dao

package com.wh.dao;

import java.util.List;
import java.util.Map;

import com.wh.entity.User;
import com.zking.util.BaseDao;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
/**
 * dao层
 * @author W
 *
 */
public class UserDao extends BaseDao<User> {
	// 修改个人信息
public int upd(User user) throws Exception {
	String sql = "update  t_oa_user set name=?,loginName=?, pwd=? where id=?";
	return super.executeUpdate(sql,user,new String[] {"name","loginName","pwd","id"});
}
	
//头像上传
public int updProfile(User user) throws Exception {
	String sql = "update  t_oa_user set profile= ? where id=?";
	return super.executeUpdate(sql,user,new String[] {"profile","id"});
}
	
}

servlet

package com.wh.web;

import java.util.List;
import java.util.Map;

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

import com.wh.dao.UserDao;
import com.wh.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.PageBean;
import com.zking.util.R;
import com.zking.util.ResponseUtil;
import com.zking.util.StringUtils;

import sun.java2d.opengl.OGLContext;

public class UserAction extends ActionSupport implements ModelDriver<User> {
	private User user = new User();
	private UserDao ud = new UserDao();
	// 头像上传
		public void updProfile(HttpServletRequest req, HttpServletResponse resp) {
			try {
				User u = (User) req.getSession().getAttribute("user");
				user.setId(u.getId());
				// 影响行数
				int add = ud.updProfile(user);
				if (add > 0) {
					ResponseUtil.writeJson(resp, R.ok(0, "修改成功"));
				} else {
					ResponseUtil.writeJson(resp, R.error(0, "修改失败"));
				}
			} catch (Exception e) {
				e.printStackTrace();
				try {
					ResponseUtil.writeJson(resp, R.error(0, "用户数据查询失败"));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		}
	
	// 修改个人信息
	public void upd(HttpServletRequest req, HttpServletResponse resp) {
		try {
			User u = (User) req.getSession().getAttribute("user");
			user.setId(u.getId());
			// 影响行数
			int upd = ud.upd(user);
			if (upd > 0) {
				ResponseUtil.writeJson(resp, R.ok(0, "用户数据修改成功"));
			} else {
				ResponseUtil.writeJson(resp, R.error(1, "用户数据修改失败"));
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			try {
				ResponseUtil.writeJson(resp, R.error(1, "用户数据修改失败"));
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}
	}

	@Override
	public User getModel() {
		return user;
	}

}

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

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

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

相关文章

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…

P3818 小A和uim之大逃离 II

题目 思路 一眼bfs 好像需要记录的东西有点多啊&#xff0c;那就交给数组吧 s t i j 0 / 1 st_{ij0/1} stij0/1​表示用/没用特殊步走到(i,j)的步数&#xff0c;然后套bfs模板即可 代码 #include<bits/stdc.h> using namespace std; const int N1005; int n,m,d,r,st…

c++学习(c++11)[24]

c11 列表初始化 #include"iostream" using namepace std;int main() {int x1 1;int x2 { 2 };int x3 { 2 };vector<int> v1 {1,2,3,4,5,6};vector<int> v1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};au…

红黑树与平衡二叉树

文章目录 前言一、平衡二叉树二、红黑树区别 前言 数据库的底层用到了多种树结构&#xff0c;这里简单记录一下红黑树与平衡二叉树。 一、平衡二叉树 满足二叉树。任何节点的两个子树的高度最大差为1。如果对平衡二叉树进行删除和新增&#xff0c;那么会破坏平衡&#xff0c;…

Jmix 如何将外部数据直接显示在界面?

企业级应用中&#xff0c;通常一个业务系统并不是孤立存在的&#xff0c;而是需要与企业、部门或者是外部的已有系统进行集成。一般而言&#xff0c;系统集成的数据和接口交互方式通常有以下几种&#xff1a; 文件传输&#xff1a;通过文件传输的方式将数据传递给其他系统&…

C++设计模式笔记

设计模式 如何解决复杂性&#xff1f; 分解 核心思想&#xff1a;分而治之&#xff0c;将大问题分解为多个小问题&#xff0c;将复杂问题分解为多个简单的问题。 抽象 核心思想&#xff1a;从高层次角度讲&#xff0c;人们处理复杂性有一个通用的技术&#xff0c;及抽象。…

现在运动耳机什么牌子的好用、最好的运动耳机推荐

对于注重身体健康的小伙伴来说&#xff0c;每周必然都少不了有规律的运动&#xff0c;而运动的时候耳边没有音乐的陪伴总是稍显枯燥无味&#xff0c;很难让人提起干劲来。有些小伙伴觉得运动的时候戴着耳机&#xff0c;稍微跳动几下耳机就开始松动&#xff0c;随时都要分心提防…

【LeetCode】124.二叉树中的最大路径和

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

SQLserver 查询数据库表结构和说明简介信息

DECLARE tableName NVARCHAR(MAX ) SET tableName‘TK_Cargoowner’;–表名!!! SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE ‘’ END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ‘’) AS 列说明 , t.name AS 数据类型 , col.length A…

第十章:queue类

系列文章目录 文章目录 系列文章目录前言queue的介绍queue的使用成员函数使用queue 总结 前言 queue是容器适配器&#xff0c;底层封装了STL容器。 queue的介绍 queue的文档介绍 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器…

微信小程序实现日历功能、日历转换插件、calendar

文章目录 演示htmlJavaScript 演示 效果图 微信小程序实现交互 html <view wx:if"{{calendarArr.length}}"><view class"height_786 df_fdc_aic"><view class"grid_c7_104"><view class"font_weight_800 text_align…

多分类问题-Softmax Classifier分类器

概率分布&#xff1a;属于每一个类别的概率总和为0&#xff0c;且都>0&#xff0c;n组类别需要n-1个参数就能算出结果 数据预处理 loss函数 crossentropyloss()函数 CrossEntropyLoss <> LogSoftmax NLLLoss。也就是说使用CrossEntropyLoss最后一层(线性层)是不需要做…

Pytorch深度学习-----神经网络的卷积操作

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

软件外包开发测试管理工具

测试是软件工程中非常重要的一个环节&#xff0c;在上线前必须需要经过严格的测试才能确保上线后软件系统长时间运行。有大量的软件开发和测试管理工具&#xff0c;每一个工具都有自己的特点&#xff0c;今天和大家分享一些常见的工具&#xff0c;希望对大家有所帮助。北京木奇…

STM32 LWIP UDP 一对一 一对多发送

STM32 LWIP UDP通信 前言设置 IP 地址UDP函数配置实验结果单播发送&#xff0c;一对一发送广播发送&#xff0c;一对多发送 可能遇到的问题总结 前言 之前没有接触过网络的通信&#xff0c;工作需要 UDP 接收和发送通信&#xff0c;在网上没有找到一对一、一对多的相关例程&am…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…

Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)

星光下的赶路人star的个人主页 毅力是永久的享受 文章目录 1、NoSQL1.1 NoSQL数据库1.1.1 NoSQL是什么1.1.2 NoSQL的特点1.1.3 NoSQL的适用场景1.1.4 NoSQL的不适场景 1.2 NoSQL家族 2、Redis简介2.1 Redis官网2.2 Redis是什么2.3 Redis的应用场景2.3.1 配合关系型数据库做高速…

java复盘

这一题中外部类是Outer。外部类不能直接使用内部类的成员变量和方法&#xff0c;需要内部类的对象来访问他的成员变量和方法。所以该题只是new了一个外部类&#xff0c;内部类无法访问&#xff0c;所以没有输出。 wait后进入等待锁定池&#xff0c;只有针对此对象发出notify或者…

TCP网络通信编程之字节流

目录 【TCP字节流编程】 // 网络编程中&#xff0c;一定是server端先运行 【案例1】 【思路分析】 【客户端代码】 【服务端代码】 【结果展示】 【案例2】 【题目描述】 【注意事项】 【服务端代码】 【客户端代码】 【代码结果】 【TCP字节流编程】 // 网络编程中&a…