十一:javaee会议管理系统实现过程之预定会议的剩下两个功能

10.最新通知

七天内要参加的会议,或者被取消的会议的通知

难点:对时间的处理

1.修改MeetingParticipantsDAO.java

	/**
	 * 查询某员工最近七天参加的所有会议
	 * 
	 * @param participantsid
	 * @return
	 */
	public List<Meeting> selectAllNewMeetings(int participantsid) {
		conn = ConnectionFactory.getConnection();
		List<Meeting> meetingslist = new ArrayList<Meeting>();
		Meeting meeting = null;
		try {
			PreparedStatement st = null;
			//获取现在的时间
			Timestamp now = new Timestamp(System.currentTimeMillis());
			//获取七天后的时间
			Timestamp sevenDays = new Timestamp(System.currentTimeMillis() + 7 * 24 * 3600 * 1000);
			//把两个时间转换为字符串
			String nowTime = now.toString();
			String sevenDaysTime = sevenDays.toString();
			
			//会议表meeting+参会人员信息表meetingparticipants
			//meeting.starttime<'" + sevenDaysTime起始时间小于七天后的时间,且没有被取消(状态是0)
			String sql = "select * from meeting,meetingparticipants where meeting.meetingid=meetingparticipants.meetingid and"
					+ " meetingparticipants.employeeid=" + participantsid + " and meeting.starttime>'" + nowTime
					+ "'and meeting.starttime<'" + sevenDaysTime + "' and status='0'";
			st = conn.prepareStatement(sql);
			ResultSet rs = st.executeQuery(sql);
			while (rs.next()) {
				meeting = new Meeting();
				meeting.setMeetingid(rs.getInt("meetingid"));
				meeting.setMeetingname(rs.getString("meetingname"));
				meeting.setRoomid(rs.getInt("roomid"));
				meeting.setReservationistid(rs.getInt("reservationistid"));
				meeting.setNumberofparticipants(rs.getInt("numberofparticipants"));
				meeting.setStarttime(rs.getTimestamp("starttime"));
				meeting.setEndtime(rs.getTimestamp("endtime"));
				meeting.setReservationtime(rs.getTimestamp("reservationtime"));
				meeting.setCanceledtime(rs.getTimestamp("canceledtime"));
				meeting.setDescription(rs.getString("description"));
				meeting.setStatus(rs.getString("status"));
				meetingslist.add(meeting);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionFactory.closeConnection();
		}
		return meetingslist;
	}

	 /**
	  * 查询某员工被要求参加,但是又取消的会议
	  * @param participantsid
	  * @return
	  */
	public List<Meeting> selectAllCanceledMeetings(int participantsid) {
		conn = ConnectionFactory.getConnection();
		List<Meeting> meetingslist = new ArrayList<Meeting>();
		Meeting meeting = null;
		try {
			PreparedStatement st = null;
			Timestamp now = new Timestamp(System.currentTimeMillis());
			String nowTime = now.toString();
			
			//跟上面的不同是状态是1被取消的
			String sql = "select * from meeting,meetingparticipants where meeting.meetingid=meetingparticipants.meetingid and"
					+ " meetingparticipants.employeeid=" + participantsid + " and meeting.starttime>'" + nowTime
					+ "'and status='1'";
			st = conn.prepareStatement(sql);

			ResultSet rs = st.executeQuery(sql);
			while (rs.next()) {
				meeting = new Meeting();
				meeting.setMeetingid(rs.getInt("meetingid"));
				meeting.setMeetingname(rs.getString("meetingname"));
				meeting.setRoomid(rs.getInt("roomid"));
				meeting.setReservationistid(rs.getInt("reservationistid"));
				meeting.setNumberofparticipants(rs.getInt("numberofparticipants"));
				meeting.setStarttime(rs.getTimestamp("starttime"));
				meeting.setEndtime(rs.getTimestamp("endtime"));
				meeting.setReservationtime(rs.getTimestamp("reservationtime"));
				meeting.setCanceledtime(rs.getTimestamp("canceledtime"));
				meeting.setDescription(rs.getString("description"));
				meeting.setStatus(rs.getString("status"));
				meetingslist.add(meeting);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionFactory.closeConnection();
		}
		return meetingslist;
	}

2.新增MyNotificationServlet

package com.meeting.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.meeting.dao.MeetingDAO;
import com.meeting.dao.MeetingParticipantsDAO;
import com.meeting.service.MeetingRoomService;
import com.meeting.service.MeetingService;
import com.meeting.vo.Meeting;


/**
 * 我的通知
 * @author Administrator
 *
 */
public class MyNotificationServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//取出当前登录者的id,作为参会者id保存
		HttpSession session=request.getSession();
		int participantsid=(Integer) session.getAttribute("employeeid");
		
		//取出参会者七天内的参加的会议,以及 被取消的会议的列表
		MeetingParticipantsDAO dao=new MeetingParticipantsDAO();		
		List<Meeting> meetingsList=dao.selectAllNewMeetings(participantsid);
		List<Meeting> canceledMeetings=dao.selectAllCanceledMeetings(participantsid);
        
		//查询会议室的名字的列表
		MeetingRoomService roomService=new MeetingRoomService();		
		List<String>  roomsNameList=new ArrayList<String>();
		
		//利用循环把会议室的名字和会议室的id组合起来
		for(Meeting m:meetingsList){
			roomsNameList.add(roomService.viewOneMeetingRoom(m.getRoomid()).getRoomname());
		}
		
		//利用循环把会议室的名字和会议放在map里
		Map<Meeting,String> meetingsMap=new HashMap<Meeting,String>();
		for(int i=0;i<meetingsList.size();i++){
			meetingsMap.put(meetingsList.get(i), roomsNameList.get(i));
		}
		request.setAttribute("meetingsMap", meetingsMap);
		
		//把取消的会议室的名字和会议的id组合起来
		List<String>  cancelRoomNameList=new ArrayList<String>();
		for(Meeting m:canceledMeetings){
			cancelRoomNameList.add(roomService.viewOneMeetingRoom(m.getRoomid()).getRoomname());
		}
		
		//利用循环把取消的会议室的名字和会议放在map里
		Map<Meeting,String> cancelMeetingsMap=new HashMap<Meeting,String>();
		for(int i=0;i<canceledMeetings.size();i++){
			cancelMeetingsMap.put(canceledMeetings.get(i),cancelRoomNameList.get(i));
		}
		request.setAttribute("cancelMeetingsMap", cancelMeetingsMap);
		
		request.getRequestDispatcher("mynotification.jsp").forward(request, response);
	}

}

3.配置web.xml

4.新增最新通知的页面mynotification.jsp

<%@ page language="java"
	import="java.util.*,com.meeting.vo.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
    <head>
        <title>CoolMeeting会议管理系统</title>
        <link rel="stylesheet" href="styles/common03.css"/>
    </head>
    <body>
        
            <div class="page-content">
                <div class="content-nav">
                    个人中心 > <a href="notifications">最新通知</a>
                </div>
                <table class="listtable">
                    <caption>
                        未来7天我要参加的会议:
                    </caption>
                    <tr class="listheader">
                        <th style="width:300px">会议名称</th>
                        <th>会议室</th>
                        <th>起始时间</th>
                        <th>结束时间</th>
                        <th style="width:100px">操作</th>
                    </tr>
                    <c:forEach var="item" items="${requestScope.meetingsMap}">
                    <tr>
                        <td>${item.key.meetingname}</td>
                        <td>${item.value }</td>
                        <td>${item.key.starttime }</td>
                        <td>${item.key.endtime }</td>
                        <td>
                            <a class="clickbutton" href="ViewMyMeetingDetailServlet?meetingid=${item.key.meetingid}">查看详情</a>
                        </td>
                    </tr>
                    </c:forEach>
                    
                </table>
                <table class="listtable">
                    <caption>
                        已取消的会议:
                    </caption>
                    <tr class="listheader">
                        <th style="width:300px">会议名称</th>
                        <th>会议室</th>
                        <th>起始时间</th>
                        <th>结束时间</th>
                        <th style="width:100px">操作</th>
                    </tr>
                   <c:forEach var="item" items="${requestScope.cancelMeetingsMap}">
                    <tr>
                        <td>${item.key.meetingname}</td>
                        <td>${item.value }</td>
                        <td>${item.key.starttime }</td>
                        <td>${item.key.endtime }</td>
                        <td>
                            <a class="clickbutton" href="ViewMyMeetingDetailServlet?meetingid=${item.key.meetingid}">查看详情</a>
                        </td>
                    </tr>
                    </c:forEach>
                </table>
            </div>
      
        <div class="page-footer">
            <hr/>
            更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a>
            <img src="images/footer.png" alt="CoolMeeting"/>
        </div>
    </body>
</html>

 

5.修改adminleft.jsp

6.测试

11.显示可用会议室

根据时间只显示可用的会议室

1.修改MeetingRoomDAO 新增方法

/**
	  *  查询所有可用的会议室
	  * @param starttime
	  * @param endtime
	  * @return
	  */
	 public List<MeetingRoom> selectMeetingRoomsByTime(Timestamp starttime,Timestamp endtime){
		 conn=ConnectionFactory.getConnection();
		 List<MeetingRoom> list=new ArrayList<MeetingRoom>();
		 String start=starttime.toString();
		 String end=endtime.toString();
		 MeetingRoom meetingroom=null;	
		 try {
			PreparedStatement st=null;
			 //三种情况
			String sql="select *  from meetingroom " +
					"where  meetingroom.roomid not in" +
					" (select roomid  from meeting " +
					"where (starttime<'"+start+"' and endtime >'"+end+"')" +
							" or (starttime>'"+start+"' and starttime <'"+end+"')"+
							"or(endtime>'"+start+"' and endtime <'"+end+"') and status='0')";
			
	 		st = conn.prepareStatement(sql);
			ResultSet rs =st.executeQuery(sql);
			while(rs.next()){
				meetingroom=new MeetingRoom();
				meetingroom.setRoomid(Integer.parseInt(rs.getString("roomid")));
				meetingroom.setRoomnum(Integer.parseInt(rs.getString("roomnum")));
				meetingroom.setCapacity(Integer.parseInt(rs.getString("capacity")));
				meetingroom.setRoomname(rs.getString("roomname"));
				meetingroom.setStatus(rs.getString("status"));
				meetingroom.setDescription(rs.getString("description"));	
				
				list.add(meetingroom);
			}
		 } catch (SQLException e) {
			    e.printStackTrace();
		}finally{
			ConnectionFactory.closeConnection();
		}
		 System.out.println("MeetingROOM "+list.size());
		 return list;
	 }

2.创建RefreshRoomsServlet 查询可用会议室,使用XML返回

package com.meeting.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.List;

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

import com.meeting.dao.MeetingDAO;
import com.meeting.dao.MeetingRoomDAO;
import com.meeting.vo.Employee;
import com.meeting.vo.MeetingRoom;

public class RefreshRoomsServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//得到起始时间和结束时间
		Timestamp starttime=Timestamp.valueOf(request.getParameter("starttime"));
		Timestamp endtime=Timestamp.valueOf(request.getParameter("endtime"));
		
		//查询出所有可用的会议室
		MeetingRoomDAO dao=new MeetingRoomDAO();
		List<MeetingRoom> roomList=dao.selectMeetingRoomsByTime(starttime, endtime);
		//将查询得到的部门信息,以XML文档的格式返回到浏览器
		response.setContentType("text/xml;charset=utf-8");
		PrintWriter out = response.getWriter();
		response.setHeader("Cache-Control", "no-cache");
		out.println("<?xml version='1.0' encoding='" + "utf-8" + "' ?>");

		//符合XML规范,有根节点,否则解析有问题
		out.println("<rooms>");
		for (MeetingRoom m : roomList) {
			out.println("<option>");
			out.println("<value>" + m.getRoomid()+ "</value>");
			out.println("<text>" + m.getRoomname() + "</text>");
			out.println("</option>");

		}
		out.println("</rooms>");
		out.close();
	}

}

3.修改bookmeeting.jsp  使用AJAX局部去刷新页面

<%@ page language="java"
	import="java.util.*,com.meeting.vo.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>CoolMeeting会议管理系统</title>
<link rel="stylesheet" href="styles/common03.css" />
<style type="text/css">
#divfrom {
	float: left;
	width: 150px;
}

#divto {
	float: left;
	width: 150px;
}

#divoperator {
	float: left;
	width: 50px;
	padding: 60px 5px;
}

#divoperator input[type="button"] {
	margin: 10px 0;
}

#selDepartments {
	display: block;
	width: 100%;
}

#selEmployees {
	display: block;
	width: 100%;
	height: 200px;
}

#selSelectedEmployees {
	display: block;
	width: 100%;
	height: 225px;
}
</style>
<script language="javascript" type="text/javascript"
	src="My97DatePicker/WdatePicker.js"></script>
<script type="text/javascript">
	    
	    var xmlHttp;

        function createXMLHttpRequest() {
            if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            else if (window.XMLHttpRequest) {
                xmlHttp = new XMLHttpRequest();                
            }
        }

        function showEmployees() {
            createXMLHttpRequest();
       		var deptid=document.getElementById("selDepartments").value;   	
       		var url = "SelectEmployeesOfDeptServlet?departmentid=" + escape(deptid);           
            xmlHttp.open("GET", url, true);     
            xmlHttp.onreadystatechange = callback;
            xmlHttp.send(null);
        }

        function callback() {
           clearEmployees();
           var selEmployees=document.getElementById("selEmployees");
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    var elements = xmlHttp.responseXML.getElementsByTagName("option");                      
                    for (var i = 0; i < elements.length; i++) {
	                    var value = elements[i].getElementsByTagName("value")[0].firstChild.nodeValue;
	                    var text = elements[i].getElementsByTagName("text")[0].firstChild.nodeValue;                
	                    selEmployees.options.add(new Option(text,value));
                    }       
                }
            }
              
        }
        
        function clearEmployees(){
         	document.getElementById("selEmployees").options.length=0;
        }
        
         function selectEmployees(){
         		var selEmployees=document.getElementById("selEmployees");
         		var selSelectedEmployees=document.getElementById("selSelectedEmployees");     
                for(var i=0;i<selEmployees.options.length;i++){
                    if (selEmployees.options[i].selected){
                        var opt=new Option(selEmployees.options[i].text,selEmployees.options[i].value);
                        opt.selected=true;
                        selSelectedEmployees.options.add(opt);
                        selEmployees.options.remove(i);
                    }
                }
            }
        
        function deSelectEmployees(){
        		var selEmployees=document.getElementById("selEmployees");
         		var selSelectedEmployees=document.getElementById("selSelectedEmployees");     
                for(var i=0;i<selSelectedEmployees.options.length;i++){
                    if (selSelectedEmployees.options[i].selected){
                        selEmployees.options.add(new Option(selSelectedEmployees.options[i].text,selSelectedEmployees.options[i].value));
                        selSelectedEmployees.options.remove(i);
                    }
                }
                setSelected();
            }     
             
        function setSelected(){
         		var selSelectedEmployees=document.getElementById("selSelectedEmployees");     
                for(var i=0;i<selSelectedEmployees.options.length;i++){
                    selSelectedEmployees.options[i].selected=true;
                }
        }
        
        function refreshRooms(){
            createXMLHttpRequest();
            /* 获得时间 */
	        var starttime=document.getElementById("starttime").value;   	
	        var endtime=document.getElementById("endtime").value;  
	        
	       	var url = "RefreshRoomsServlet?starttime=" + escape(starttime)+"&endtime="+escape(endtime);           
	        xmlHttp.open("GET", url, true);     
	        xmlHttp.onreadystatechange = refresh;
	        xmlHttp.send(null);
        }
        
         function refresh() {
  		   clearMeetingRooms(); 
           var roomid=document.getElementById("roomid");
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                	
                    var elements = xmlHttp.responseXML.getElementsByTagName("option");                      
                    for (var i = 0; i < elements.length; i++) {
	                    var value = elements[i].getElementsByTagName("value")[0].firstChild.nodeValue;
	                    var text = elements[i].getElementsByTagName("text")[0].firstChild.nodeValue; 
	                    /* 加载到roomid这个下拉列表里 */
	                    roomid.options.add(new Option(text,value),i+1);
                    }       
                }
            }
        
        }
        
        function clearMeetingRooms(){
         	document.getElementById("roomid").options.length=1;
        }
            
</script>
</head>
<body >
	<div class="page-content">
		<div class="content-nav">会议预定 > 预定会议</div>
		<form method="post" action="BookMeetingServlet">
			<fieldset>
				<legend>会议信息</legend>
				<table class="formtable">
					<tr>
						<td>会议名称:</td>
						<td><input type="text" id="meetingname"  name="meetingname" maxlength="20" /></td>
					</tr>
					<tr>
						<td>预计参加人数:</td>
						<td><input type="text" id="numofattendents" name="numofparticipants"/></td>
					</tr>
					<tr>
						<td>预计开始时间:</td>
						<td><input class="Wdate" type="text" id="starttime" name="starttime"
							onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})"></td>
					</tr>
					<tr>
						<td>预计结束时间:</td>
						<td><input class="Wdate" type="text" id="endtime" name="endtime"
							onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" >
						</td>
					</tr>

					<tr>
						<td>选择会议室:</td>
						<!--onfocus聚焦就会调用refreshRooms()方法  -->
						<td><select id="roomid" name="roomid" onfocus="refreshRooms()">
						<option>请选择会议室</option>
								<c:forEach var="room" items="${requestScope.roomsList}">
									<option value="${room.roomid}">${room.roomname}</option>
								</c:forEach>
						</select></td>
					</tr>

					<tr>
						<td>会议说明:</td>
						<td><textarea id="description" name="description" rows="5"></textarea></td>
					</tr>
					<tr>
						<td>选择参会人员:</td>
						<td>
							<div id="divfrom">
								<select id="selDepartments" onchange="showEmployees()">
								    <option>请选择部门</option>
									<c:forEach var="dept" items="${requestScope.deptsList}">
										<option value="${dept.departmentid}">${dept.departmentname}</option>
									</c:forEach>
								</select> <select id="selEmployees"  multiple="multiple">

								</select>
							</div>
							<div id="divoperator">
								<input type="button" class="clickbutton" value="&gt;" onclick="selectEmployees()" /> 
								<input type="button"
									class="clickbutton" value="&lt;" onclick="deSelectEmployees()" />
							</div>
							<div id="divto">
								<select id="selSelectedEmployees"  name="selSelectedEmployees" multiple="multiple" >
								</select>
							</div></td>
					</tr>
					<tr>
						<td class="command" colspan="2">
						<input type="hidden" name="code" value="book">
						<input type="submit" class="clickbutton" value="预定会议" /> 
						<input type="reset"	class="clickbutton" value="重置" /></td>
					</tr>
				</table>
			</fieldset>
		</form>
	</div>

	<div class="page-footer">
		<hr />
		更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a> <img
			src="images/footer.png" alt="CoolMeeting" />
	</div>
</body>
</html>

4.配置servlet

 

5.测试

假如不选时间先,会报空指针异常

我们可以提醒自己人,

try{
            Timestamp starttime=Timestamp.valueOf(request.getParameter("starttime"));
            Timestamp endtime=Timestamp.valueOf(request.getParameter("endtime"));
            //查询出所有可用的会议室
            MeetingRoomDAO dao=new MeetingRoomDAO();
            List<MeetingRoom> roomList=dao.selectMeetingRoomsByTime(starttime, endtime);
            //将查询得到的部门信息,以XML文档的格式返回到浏览器
            response.setContentType("text/xml;charset=utf-8");
            PrintWriter out = response.getWriter();
            response.setHeader("Cache-Control", "no-cache");
            out.println("<?xml version='1.0' encoding='" + "utf-8" + "' ?>");

            //符合XML规范,有根节点,否则解析有问题
            out.println("<rooms>");
            for (MeetingRoom m : roomList) {
                out.println("<option>");
                out.println("<value>" + m.getRoomid()+ "</value>");
                out.println("<text>" + m.getRoomname() + "</text>");
                out.println("</option>");

            }
            out.println("</rooms>");
            out.close();
        }catch(IllegalArgumentException e){
            System.out.println("请先选起始和结束日期再选择会议室");
            e.printStackTrace();
        }

 

把他捕获异常捕获起来.

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
    《SSM会议室预约系统》该项目主要解决了会议室预约日常工作中的一些问题,采用技术的技术是jsp +springmvc+spring+mybatis +css+js等。 项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等。    会议室御园管理系统灵活结合多种端 口,实现您随时随地掌握会议情况,智能化的操作手段,使您 轻松快捷的选择适合您的会议室,一键完成会议预定。    1、学会各类开发软件安装、项目导入以及项目发布,含项目源码,需求文档,配套软件等    2、该项目主要功能完善,主要用于简历项目经验丰富,以及毕业设计或者二次开发    3、提供项目源码,设计文档、数据库sql文件以及所有配套软件,按照教程即可轻松实现项目安装部署 下面是系统运行起来后的部分截图:项目实战课程:代码视频讲解版如下java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)https://edu.csdn.net/course/detail/25771java项目之oa办公管理系统(java毕业设计)https://edu.csdn.net/course/detail/23008java项目之hrm人事管理项目(java毕业设计)https://edu.csdn.net/course/detail/23007JavaWeb项目实战之点餐系统前台https://edu.csdn.net/course/detail/20543JavaWeb项目实战之点餐系统后台https://edu.csdn.net/course/detail/19572JavaWeb项目实战之宿舍管理系统https://edu.csdn.net/course/detail/26721JavaWeb项目实战之点餐系统全套(前台和后台)https://edu.csdn.net/course/detail/20610java项目实战之电子商城后台(java毕业设计SSM框架项目)https://edu.csdn.net/course/detail/25770java美妆商城项目|在线购书系统(java毕业设计项目ssm版)https://edu.csdn.net/course/detail/23989系统学习课程:JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10https://edu.csdn.net/course/detail/26941Java Web从入门到电商项目实战挑战万元高薪(javaweb教程)https://edu.csdn.net/course/detail/25976其他素材版(毕业设计或课程设计)项目:点击老师头像进行相关课程学习

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身正气z

打赏随心就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值