Java窗体应用程序:人事管理系统

老师布置了第二个JAVA作业,让写人事管理系统。

代码思路参考自:清华大学出版设出版的《Java课程设计案例精编(第3版)》

作业是老师在十月一日哦放假前让写的,所以十一回家写了俩界面,然后回到学校老师说先

不做这个,先写一个订餐系统,后来为了参加十一月的区域赛就搁置了这个作业,参加完

区域赛白天还要练题没怎么写,都是晚上快睡觉的时候写了几个界面,断断续续把界面写完

了,这周五、周六一鼓作气把这个给写完了,正好周一上课老师检查。

 

项目下载地址:https://github.com/wenyaxinluoyang/HRManagement

项目运行环境:

jdk 1.8.0_141

mysql 5.5.27

 

关于项目几个问题:

1.是否可以把项目发到邮箱?

答:没法发,原因两点,这个代码两三年前写的,那么久远,现在我都毕业工作了,电脑也换了,我没这个代码。

2.关于github的,没有账号的。

答:个知识个代码托管的地方,我记忆中注册好像不需要翻墙,直接去注册就好了,然后去下载代码,

不知道怎么下载,百度一下就好,这些操作都特别简单。

3.关于问题,你的项目在我的环境能够成功运行?

答:纠正一点这个项目下载后一定要配备我说的环境,而不是在你的环境运行。

举个例子:工作的时候,技术总监已经说了我们开发项目要用哪个版本的jdk,框架spring用哪个版本,

我们工作人员也按照要求进行开发,然后可以成功运行我们的代码。当我们把项目部署到服务器的时候,

我们服务器的环境配置的和开发环境是会保持一致的,然后我们的代码才能有最大的可能不发生问题跑起来,

我们绝不会任由喜爱,在服务器上随便安装与开发时候不相同的版本的东西,然后对开发人员说,你的代码

要在这个环境中跑起来。时间推移,版本更新,里面的某些内容发生了改变,万一了以前版本的代码不兼容,

代码将永远跑不起来。

我上学的时候jdk发展到1.8,1.9我们大部分都用1.8

现在,写文章时间为2019.06.23,jdk现在版本发展到1.12, 1.11,可以看到和项目开发时的版本相差

很大了。同样项目中使用的mysql等工具,经过几年的发展,版本更新很快,版本跨度这么大,已经出现

了兼容问题。好多使用我代码的人,配置了较高版本的jdk,结果界面无法显示,都是jdk太高导致的。

4.关于数据库链接问题?

改数据库连接对应的用户名和密码,要到DataOperator中修改。

项目使用mysql作为数据库。如果你更换成sqlserver或oracle,那么数据库驱动也要修改为sqlserver或

oracle的驱动,如果mysql用了与项目不同的版本,请记得修改驱动的对应版本。

5.运行代码时无法显示问题

这个是根据很多人遇到反应的,问题所在jdk版本过高,出现对旧版本代码的兼容问题。

解决方案,换成1.8.0_141或比他不要高太多的版本。

6.关于数据库(指用mysql)改了用户名和密码还报错的。

这是最近一个同学新遇到的问题,我之前没见过。改了用户名和密码后,还提示无法连接数据库,

数据库驱动版本也对,是因为高版本的驱动对应数据库连接的写法与低版本的不同,直接百度

抛出的异常,然后根据网上经验修改连接。

7.关于无法修改员工部门的问题

我代码的bug,在PersonBean中修改员工信息的update语句中我忘记写部门了,大家可以自行加上。

8.建议

建议从下载到环境配置到项目导入自己完成,包括驱动,一切前期工作自己完成。然后认真看

一下代码,代码逻辑非常简单,核心代码就是数据库操作,jdbc编程都是固定格式的,看一个

能明白其他的。然后出现什么问题了可以在留言询问了。本来我在评论区留了我的QQ号,

说起来真是后悔,有些同学什么都不管,每一步都希望我告诉他,包括下载和eclipse导入项目

之类的基本操做,让我觉得有点难以接受。甚至我在上班的时候,在外面朋友聚会的时候都在

QQ上回复大家遇到的问题,我有时会气得都锤桌子了,真的不能什么都依靠作者,自己一点

脑子都不想动。

人事管理系统功能简介:

人事管理系统主要用来实现各种人事管理功能,这些功能包括人员基本信息管理,部门

管理,人员调动管理,人员考核管理以及劳资管理这些模块。

 

 

系统功能图:

 

数据库设计:

员工信息表:Person

 

 

未使用员工编号表:unUsedPersonId

 

 

部门信息表:DeptTable

 

未使用部门编号表:unUsedDeptId

 

 

人员调动历史表:jobChange

 

人员考核历史表:assessChange

 

劳资历史记录表:salaryChange

 

 

系统主界面图:(HrMain.java)

可以发现主界面是两个分离面板,将左侧的树形结构和右侧的面板隔开。左侧的树形结构清晰地

表示出了该系统地功能。设计该界面左侧是一个树,人事管理系统是树根root,然后有四个一级节点,

接下来是若干个二级节点(叶子节点)。该界面主要响应的事件有,当点击根节点的时候,显示图中

右侧界面,当点击一级节点的时候,如果该节点没有展开,则先展开该节点。当点击叶子节点的时候

将相应的面板显示在右侧区域中。

 

1.基本信息管理模块:实现对人员信息的增删查该操作,以及对部门的增删查改操作。

1.1 添加人员信息界面(NodeOnePanelOne.java)

 

该模块主要实现添加员工信息功能,当点击获取新编号按钮的时候,清空所有文本框,并为欲添加的人员

自动分配一个编号。点击添加按钮的时候,首先判断数据库中不能为空的字段在文本框中是否为空,如果

为有是空的值则拒绝插入,否则插入到Person,并弹出提示信息信息插入成功。

 

1.2 修改人员信息界面(NodeOnePanelTwo.java)

该模块用来实现信息修改功能,首先通过在Person中查找,将人员的编号和姓名等信息绑定到选择人员信息

下拉列表,然后可以选择人员,选中某个人员后从Person中将该人员的基本信息查找出来,并在文本框显示。

对于性别、出生年月、民族这三个信息由于在通常情况下不常变动,则设置文本框不可修改,其他信息可以

进行修改,点击修改按钮的时候,同样要进行信息的检测,看信息输入是否正确,如果正确则更新表中对应

的记录,否则拒绝更新,点击清空按钮的时候,清空所有文本框内的内容。

 

1.3 删除人员信息界面(NodeOnePanelThree.java)

 

该模块用来实现删除员工记录的功能,首先在右侧面板初始化的时候,我们先从Person中查找需要的信息

并显示在右侧,当点中界面中表的一条记录时,将该员工的信息显示在下部文本框中,当点击删除按钮

的时候,删除该记录,并刷新界面。

 

1.4 查询人员信息界面(NodeOnePanelFour.java)

该界面和上个界面相似,就是将所有员工的信息显示在界面上。

 

1.5 部门管理界面(NodeOnePanelFive.java)

 

该界面可以实现部门的增删查改功能。初始化面板的时候,将DeptTable总的所有信息绑定到该界面上,

当点击获取新编号的时候,清空文本框,给欲添加的部门分配一个编号,当点击添加按钮的时候,需要

检测信息输入是否合法。当选中表中的一条记录,将该部门的信息显示在下部文本框中,然后可以对一级

部门和二级部门进行修改,当点击修改按钮的时候,检测信息是否合法,合法则修改并提示用户修改成功,

否则拒绝修改,如果修改成功,则该界面也需要跟着刷新。当点击删除按钮的时候,由于数据库中表的级

关系, 如果Person表中还有对应部门的员工,则不允许删除,否则可以删除。当点击清空按钮的时候,

清空所有文本框内的内容。

 

2.人员调动模块:实现对人员工作的调动以及对调动历史的查询。

2.1人员调动:(NodeTwoPanelOne.java)

该模块实现人员部门的调动,从Person表中查询图中字段相应的信息并显示,并从DeptTable表中查询所有

部门并将这些部门绑定到新部门下拉列表框中,选择调入新部门后,更新Person表中的信息,并且将该调动

记录添加到jobChange表中。

 

2.2调动历史查询(NodeTwoPanelTwo.java)

该界面从jobChange表中读出所有信息并在界面上显示。

 

 

3.人员考核管理模块:实现对员工工作的考核,并显示考核记录。

3.1人员考核(NodeThreePanelOne.java)

 

同样从Person表中取出图中相应的信息并在面板上显示,当选择一条记录的时候,将其信息在下方文本框

显示,点击确定按钮的时候,将Person表中的相关信息更新,并将该考核记录插入assessChange表中。

 

3.2考核历史查询(NodeThreePanelTwo.java) 

该界面将assessChange表的内容进行显示。

 

4.劳资管理:用来实现员工工资的调整和劳资历史的查询。

4.1劳资分配管理(NodeFourPanelOne.java)

该模块用来实现员工工资的调整,同样从Person中取出相应的信息并生成表格显示在界面上,当选中一条记录

时,将该记录的信息在下方文本框中显示,点击确定按钮后,更新Person中的信息,弹出修改提示,并将该劳资

历史插入到salaryChange表中。

 

4.2劳资历史查询(NodeFourPanelTwo.java)

从salaryChange表中取出所有信息在界面上显示。

 

项目代码:

主界面(HrMain.java)

 

package HRPackage;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import DataOperator.Database;
import JobTransfer.*;
import LaborManagement.*;
import PersonAccess.*;


/**
 * 人事管理系统的主界面
 * @author YaXin Wen
 * @date 2017/10/2
 */
public class HrMain extends JFrame implements ActionListener, TreeSelectionListener {

	//框架的大小
	Dimension facesize = new Dimension(1200,900);
	
	//程序左上角图标
	ImageIcon icon;
	
	//建立界面左侧JTree菜单
	JTree tree;
	DefaultMutableTreeNode root;        //根节点,人事管理系统
	DefaultMutableTreeNode node1;       //一级节点,基本信息管理
	DefaultMutableTreeNode node2;       //一级节点,人员调动管理
	DefaultMutableTreeNode node3;       //一级节点,人员考核管理
	DefaultMutableTreeNode node4;       //一级节点,劳资管理
	DefaultMutableTreeNode leafnode;    //叶子节点
	TreePath treePath;
	
	//建立右侧操作区域,整个界面由两个分离面板构成
	public static JSplitPane splitPane;
	JPanel panel1;
	JPanel panel2;
	JPanel panel3;
	JPanel panel4;
	JLabel welcome = new JLabel();   	//用来显示欢迎信息
	JScrollPane scrollPane;             //滚动面板
	
	/**
	 * 构造函数,完成对象的初始化工作
	 */
	public HrMain() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		//添加框架的关闭事件处理
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setSize(facesize);  		//设置窗体大小
		this.setLocation(400, 50);  	//设置窗体初始位置
		this.setVisible(true);      	//设置窗体可见
		this.setTitle("人事管理系统"); 	//设置窗体标题
		this.setResizable(false);   	//设置窗体大小不可变
		
		//设置窗体左上角图标
		icon = new ImageIcon("image\\computer.png");  
		this.setIconImage(icon.getImage());
		
		try {
			Init();     //控件布局。
		}catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	/**
	 * 初始化函数,完成界面的初始化工作
	 * @param 无参数
	 */
	private void Init() throws Exception {
		//将各个子节点,添加到root上去。
		root = new DefaultMutableTreeNode("人事管理系统");
		//实例化root的四个子节点。
		node1 = new DefaultMutableTreeNode("基本信息管理");
		node2 = new DefaultMutableTreeNode("人员调动管理");
		node3 = new DefaultMutableTreeNode("人员考核管理");
		node4 = new DefaultMutableTreeNode("劳资管理");
		
		//基本信息管理上添加5个子节点
		leafnode = new DefaultMutableTreeNode("添加人员信息");
		node1.add(leafnode);
		leafnode = new DefaultMutableTreeNode("修改人员信息");
		node1.add(leafnode);
		leafnode = new DefaultMutableTreeNode("删除人员信息");
		node1.add(leafnode);
		leafnode = new DefaultMutableTreeNode("查询人员信息");
		node1.add(leafnode);
		leafnode = new DefaultMutableTreeNode("部门管理");
		node1.add(leafnode);	
		//基本信息管理节点添加到根节点上。
		root.add(node1);
		
		//人员调动管理上添加两个子节点。
		leafnode =  new DefaultMutableTreeNode("人员调动");
		node2.add(leafnode);
		leafnode = new DefaultMutableTreeNode("调动历史查询");
		node2.add(leafnode);
		//将人员调动管理节点添加到根节点上
		root.add(node2);
		
		//人员考核管理模块子功能
		leafnode = new DefaultMutableTreeNode("人员考核");
		node3.add(leafnode);
		leafnode = new DefaultMutableTreeNode("考核历史查询");
		node3.add(leafnode);
		//人员考核管理节点添加到根节点上。
		root.add(node3);
		
		//劳资管理模块子功能
		leafnode = new DefaultMutableTreeNode("劳资分配管理");
		node4.add(leafnode);
		leafnode = new DefaultMutableTreeNode("劳资历史查询");
		node4.add(leafnode);
		//劳资管理节点添加到根节点上。
		root.add(node4);
		
		//生成左侧的JTree,并且该树以root为根。
		tree = new JTree(root);
		//将树添加到滚动面板上
		scrollPane = new JScrollPane(tree);
		//设置滚动面板的大小。
		scrollPane.setPreferredSize(new Dimension(200,850));
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		
		//生成JPanel,panel1盛装左侧控件,
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel3 = new JPanel();
		panel1.add(scrollPane);   //在此,左边界面设计完毕。
		
		//开始设计右部界面。
		welcome.setText("欢迎使用人事管理系统");  //显示欢迎信息
		panel3.add(welcome);                
		splitPane = new JSplitPane();
		splitPane.setOneTouchExpandable(false);
		splitPane.setContinuousLayout(true);
		splitPane.setPreferredSize(new Dimension(1100,900));
		//间隔方式是水平摆放间隔
		splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
		//功能树位于界面左侧
		splitPane.setLeftComponent(panel1);
		//相应功能对应的面板位于分离面板的右侧。
		splitPane.setRightComponent(panel3);
		splitPane.setDividerSize(2);
		splitPane.setDividerLocation(200);
		this.setContentPane(splitPane);
		this.setVisible(true);
		//为左侧的tree添加事件监听器。
		tree.addTreeSelectionListener(this);
		
	}
	@Override
	/**
	 * 点击不同的节点,右侧显示不同的面板
	 */
	public void valueChanged(TreeSelectionEvent e) {
		// TODO Auto-generated method stub
		DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
		//System.out.println("nodeText = " + currentNode);
		String nodeText = currentNode.toString();
		//如果当前选择的节点是root,人事管理系统,右侧面板是初始模样
		if(nodeText == "人事管理系统") {
			splitPane.setRightComponent(panel3);
		}
		else if(nodeText == "基本信息管理") {
			/* 当点击基本信息管理节点的时候,如果此节点处于
			 * 关闭状态,则将其自动展开,用此代码实现节点自动展开。
			 */
			treePath = new TreePath(node1.getPath());
			if(tree.isExpanded(treePath)) {
				tree.collapsePath(treePath);
			}
			else {
				tree.expandPath(treePath);
			}
		}
		else if (nodeText == "添加人员信息") {
			NodeOnePanelOne nodepanel11 = new NodeOnePanelOne();
			splitPane.setRightComponent(nodepanel11);
		}
		else if(nodeText == "修改人员信息") {
			NodeOnePanelTwo nodepanel12 = new NodeOnePanelTwo();
			splitPane.setRightComponent(nodepanel12);
		}
		else if(nodeText == "删除人员信息") {
			NodeOnePanelThree nodepanel13 = new NodeOnePanelThree();
			splitPane.setRightComponent(nodepanel13);
		}
		else if(nodeText == "查询人员信息") {
			NodeOnePanelFour nodepanel14 = new NodeOnePanelFour();
			splitPane.setRightComponent(nodepanel14);
		}
		else if(nodeText == "部门管理") {
			NodeOnePanelFive nodepanel15 = new NodeOnePanelFive();
			splitPane.setRightComponent(nodepanel15);
		}
		else if(nodeText == "人员调动") {
			NodeTwoPanelOne nodePanel21 = new NodeTwoPanelOne();
			splitPane.setRightComponent(nodePanel21);
		}
		else if(nodeText == "调动历史查询") {
			 NodeTwoPanelTwo nodePanel22 = new NodeTwoPanelTwo();
			 splitPane.setRightComponent(nodePanel22);
		}
		else if(nodeText == "人员考核") {
			NodeThreePanelOne nodePanel31 = new NodeThreePanelOne();
			splitPane.setRightComponent(nodePanel31);
		}
		else if(nodeText == "考核历史查询") {
			NodeThreePanelTwo nodePanel32 = new NodeThreePanelTwo();
			splitPane.setRightComponent(nodePanel32);
		}
		else if(nodeText == "劳资分配管理") {
			NodeFourPanelOne nodePanel41 = new NodeFourPanelOne();
			splitPane.setRightComponent(nodePanel41);
		}
		else if(nodeText == "劳资历史查询") {
			NodeFourPanelTwo nodePanel42 = new NodeFourPanelTwo();
			splitPane.setRightComponent(nodePanel42);
		}
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
	}
	public static void main(String[] args) throws Exception{
		HrMain hr = new HrMain();
		
		
		/**Database db = new Database();
		db.OpenConn();
		//String sql = "insert into DeptTable(DeptId,FatherDept,SonDept) values('3','办公室','机要科')";
		String sql = "select * from DeptTable";
		int number = db.RecordNumber(sql);
		System.out.println(number);
		db.closeStmt();
		db.closeConn();
		*/
	}
}


1.基本信息管理模块:

 

1.1添加人员信息(NodeOnePanelOne.java)

 

package HRPackage;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import DataOperator.DeptBean;
import DataOperator.PersonBean;

/**
 * 每个节点对应一个面板,这些面板按照父节点、子节点进行编号。
 * 1号节点下的1号子节点,其面板命名为NodeOnePanelOne.
 * @author Yaxin Wen
 * @date 2017/10/2
 *
 */
public class NodeOnePanelOne extends JPanel implements ActionListener, ItemListener {

	//界面分为两部分,上部分用来显示该模块的作用
	JPanel upPanel = new JPanel();
	//中部用来让用户执行相应的操作,来满足自己的需求。
	JPanel centerPanel = new JPanel();
	
	//定义界面标签
	JLabel title = new JLabel("增加人员信息");     	  //说明文字,表明该模块的功能
	JLabel pIdLabel = new JLabel();  	 	 		  //员工编号
	JLabel pNameLabel = new JLabel();      			  //员工姓名
	JLabel pSexLabel = new JLabel();       			  //员工性别
	JLabel pBirthDateLabel = new JLabel(); 			  //出生年月
	JLabel pNationLabel = new JLabel();    			  //民族
	JLabel pAddressLabel = new JLabel();   			  //地址
	JLabel pDepartmentLabel = new JLabel();			  //部门
	JLabel pOtherLabel = new JLabel();     			  //其他
	
	//定义界面需要的文本框
	JTextField pIdText = new JTextField(15);         //用来显示或填写员工编号
	JTextField pNameText = new JTextField(30);       //用来显示或填写员工姓名
	JTextField pSexText = new JTextField(15);        //用来显示或填写员工性别
	JTextField pBirthDateText = new JTextField(30);  //用来显示或填写出生年月
	JTextField pNationText = new JTextField(15);     //用来显示或填写民族
	JTextField pAddressText = new JTextField(30);    //用来显示或填写地址
	JTextField pOtherText = new JTextField(30);      //用来显示或填写其他信息
	JComboBox pDepartmentCombo = null;               //用来选择部门信息
	
	//两个按钮,用来添加信息和清空信息。
	//该按钮用来为新增加的员工分配编号
	JButton getNewIdButton = new JButton("获取新编号");
	//该按钮用来执行添加员工信息的操作
	JButton addInfoButton = new JButton("添   加");
	//该按钮用来完成清空文本框的操作
	JButton clearInfoButton = new JButton("清   空");
	
	
	JScrollPane jScrollPane1 = new JScrollPane();
	String Did = "0";             //员工所属部门编号
	String Salary = "0";   		  //员工工资
	String Assess = "未考核";      //员工烤鹅
	
	//使用网格布局。
	GridBagLayout gridBag = new GridBagLayout();
	GridBagConstraints gridBagCon;
	
	/**
	 * 构造函数完成对象的初始化工作
	 */
	public NodeOnePanelOne() {
		this.setLayout(new BorderLayout());
		try {
			jScrollPanelInit();     //中部面板
			panelInit();            //上部面板
			addListener();          //为控件添加监听器
		}catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void jScrollPanelInit() throws Exception {
		
		//设置面板的布局为网格布局。
		centerPanel.setLayout(gridBag);
		
		//将“人员编号”这个标签添加到面板的指定位置
		gridBagCon = new GridBagConstraints();
		pIdLabel.setText("人 员 编 号 :");
		pIdLabel.setFont(new Font("Dialog",0,15));
		gridBagCon.gridx = 0;
		gridBagCon.gridy = 1;
		gridBagCon.insets = new Insets(0,10,10,1);
		gridBag.setConstraints(pIdLabel,gridBagCon);   //把标题放到相应的位置
		centerPanel.add(pIdLabel);
		
		//添加用来填写人员编号的文本框到面板上
		gridBagCon = new GridBagConstraints();
		gridBagCon.gridx = 1;
		gridBagCon.gridy = 1;
		gridBagCon.insets = new Insets(0,1,10,15);
		gridBag.setConstraints(pIdText, gridBagCon);
		centerPanel.add(pIdText);
		
		//添加人员姓名标签
		gridBagCon = new GridBagConstraints();
		pNameLabel.setText("人 员 姓 名 :");
		pNameLabel.setFont(new Font("Dialog",0,15));
		gridBagCon.gridx = 2;
		gridBagCon.gridy = 1;
		gridBagCon.insets = new Insets(0,15,10,1);
		gridBag.setConstraints(pNameLabel, gridBagCon);
		centerPanel.add(pNameLabel);
		
		//添加显示人员姓名的文本框
		gridBagCon = new GridBagConstraints();
		gridBagCon.gridx = 3;
		gridBagCon.gridy = 1;
		gridBagCon.insets = new Insets(0,1,10,10);
		gridBag.setConstraints(pNameText, gridBagCon);
		centerPanel.add(pNameText);
		
		//添加性别标签
		gridBagCon = new GridBagConstraints();
		pSexLabel.setText("性          别 :");
		pSexLabel.setFont(new Font("Dialog",0,15));
		gridBagCon.gridx = 0;
		gridBagCon.gridy = 2;
		gridBagCon.insets = new Insets(15,10,10,1);
		gridBag.setConstraints(pSexLabel, gridBagCon);
		centerPanel.add(pSexLabel);
		
		//添加填写性别文本框
		gridBagCon = new GridBagConstraints();
		gridBagCon.gridx = 1;
		gridBagCon.gridy = 2;
		gridBagCon.insets = new Insets(15,1,10,15);
		gridBag.setConstraints(pSexText, gridBagCon);
		centerPanel.add(pSexText);
		
		//添加出生年月文本标签
		gridBag
  • 63
    点赞
  • 322
    收藏
    觉得还不错? 一键收藏
  • 51
    评论
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值