【SSM】第二课 超市订单管理平台--用户管理功能

概念

在上一文中,我们搭建了SSM框架环境并完成了登录功能,接着本文完成用户管理功能。

需求分析

用户管理:
1.如果是系统管理员登录进网站a删除用户信息
2.如果是经理登录进网站,允许查看所有普通员工的信息
3.如果是普通员工登录进网站,用户管理功能对普通员工进行隐藏,普通员工没有权限操作用户管理功能

功能完成

管理员完成查看所有用户信息功能

根据需求分析,我们需要先判定当前登录系统的用户的身份,在根据不同的身份完成不同的功能。在主页中通过点击“用户管理”触发点击事件,在JavaScript中进行区分判断。

function yhgl() {
		//当用户点击用户管理功能的时候,需要判断当前登录的用户的身份,如果是管理员或者经理允许进入,普通员工不允许进入
		//先获得当前登录的用户的身份
		var input=document.getElementById("hidd");
		var i=input.value;
		switch (i) {
		case "1":
			//管理员身份
			//跳转一个可以操作用户的添加,修改,查询,删除等功能
		case "2":
			//经理身份
			//跳转一个只能查看普通员工的个人信息的页面
			location.href="yhgl.do";
			break;
		case "3":
			//普通员工身份
			alert("您当前没有权限使用该功能");
			break;
		}
	}

那么通过主页面的跳转进入控制器的yhgl.do地址,接着我们在UserController控制器中定义方法,

//定义方法,用于判断当前登陆的用户身份,分配操作用户管理功能的权限
    @RequestMapping("/yhgl.do")
    public ModelAndView yhgl(HttpSession session){
        ModelAndView mav=new ModelAndView();
        //先获得登录的用户的个人信息
        Map<String, Object> userInfo= (Map<String, Object>) session.getAttribute("userInfo");
        //从个人信息中获得该用户的身份,进行判断
        int userRole = (int) userInfo.get("userRole");
        if (userRole==1){
            //说明当前登录的用户是管理员,查询除了系统管理员以外的所有员工的信息
            userList = userService.getUserList(userRole);
            mav.addObject("userList",userList);
            mav.setViewName("user_3");
        }else {
            //说明当前登录的用户是经理,只能查看普通员工的信息
            List<Map<String, Object>> users = userService.getUsers(3);
            mav.addObject("userList",users);
            mav.setViewName("user_2");
        }
        return mav;
    }

通过判断登录的用户的身份进行执行不同的操作,当用户角色为1的时候,则为系统管理员身份,那么查询出所有用户信息,除系统管理员本身。因此我们在IProviderService接口中定义方法:

//查询除了系统管理员以外的所有员工的信息
    List<Map<String,Object>> getUserList(int userRole);

接着在接口的实现UserServiceImp类中实现该方法:

@Override
    public List<Map<String, Object>> getUserList(int userRole) {
        return dao.getUserList(userRole);
    }

并调用dao层的IUserDao接口中的方法执行查询操作:

//#查询除了系统管理员以外的所有员工的信息
    //select * from smbms_user where userRole!=1
    @Select("select * from smbms_user where userRole!=#{userRole}")
    List<Map<String,Object>> getUserList(@Param("userRole")int userRole);

并将最后的结果发送到user_3.jsp页面中,显示信息。其代码如下:

<%@page import="com.github.pagehelper.PageInfo"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--用户信息列表</title>
<style type="text/css">
	tr {
	height: 40px;
}
	a{
		text-decoration: none;
	}
</style>
</head>
<body>
	<!-- 获得分页信息对象 -->
	<% //PageInfo pi=(PageInfo)request.getAttribute("pj_info"); %>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a href="info.do">欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<div align="left" style="height: 40px;" >
				<a href="addUser.do" style="text-decoration: none;
				 text-align:center;  width: 50px;
				 height: 20px;
				 color: white;font-weight: bold;
				 margin-top:20px;margin-left:10px;
				 border-radius: 5px;">添加用户</a>
			</div>
			<table border="1" style="width: 90%;text-align: center;border-collapse: collapse;">
				<tr>
					<td>主键Id</td>
					<td>用户编码</td>
					<td>用户名称</td>
					<td>性别</td>
					<td>出生日期</td>
					<td>手机</td>
					<td>地址</td>
					<td>身份</td>
					<td>操作</td>
				</tr>
				<% //List<Map<String,Object>> oList=pi.getList(); %>
				<% List<Map<String,Object>> oList=(List<Map<String,Object>>)request.getAttribute("userList");%>
				<%for(int i=0;i<oList.size();i++){ %>
					<tr>
					<td><%=oList.get(i).get("id") %></td>
					<td><%=oList.get(i).get("userCode") %></td>
					<td><%=oList.get(i).get("userName") %></td>
					<% int gender=(int)oList.get(i).get("gender");
					if(gender==1){%>
					<td>女</td>
					<%}else if(gender==2){ %>
					<td>男</td>
					<%} %>
					<td><%=oList.get(i).get("birthday") %></td>
					<td><%=oList.get(i).get("phone") %></td>
					<td><%=oList.get(i).get("address") %></td>
					<td><%
						if((int)oList.get(i).get("userRole")==2){
					%>
					经理
					<%
						}else if((int)oList.get(i).get("userRole")==3){
					%>
					普通员工
					<%} %>
					</td>
					<td><a href="GetUserInfo.do?index=<%=i %>">
					<input type="button" value="修改" style="background-color: green;border: none;
					border-radius: 5px;color: white;" /></a>&nbsp;
					<a href="deleteUser.do?id=<%=oList.get(i).get("id") %>">
					<input type="button" value="删除" style="background-color: red;border: none;
					border-radius: 5px;color: white;"/></a></td>
					</tr>
				<%} %>
			</table>
			<!-- 分页页码导航栏 -->
			<%--<br>
			<div align="center">
				<!-- 判断当前页是否存在上一页,不存在则不显示上一页的按钮 -->
				<%if(pi.getPrePage()>0){ %>
				<a href="yhgl.do?type=1&ym=<%=pi.getPrePage()%>"><input type="button" value="上一页"/></a>&nbsp;
				<%} %>
				<% for(int i:pi.getNavigatepageNums()){ %>
					<a href="yhgl.do?type=1&ym=<%=i%>"><%=i %></a>&nbsp;
				<%} %>
				<!-- 判断当前页是否存在下一页,不存在则不显示下一页的按钮 -->
				<% if(pi.getPageNum()<pi.getLastPage()){ %>
				<a href="yhgl.do?type=1&ym=<%=pi.getNextPage()%>"><input type="button" value="下一页"/></a>&nbsp;
				<%} %>
			</div>--%>
		</div>
	</div>
</body>
</html>

其页面效果如下:

管理员完成添加用户功能 

当点击“添加用户”则触发addUser.do请求,因此我们需要在控制器中定义方法,接收该请求,完成跳转到添加用户的页面:

//定义方法,用于跳转到添加新用户的页面
    @RequestMapping("/addUser.do")
    public String add(){
        return "addUser";
    }

 其添加用户的addUser.jsp页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--添加用户</title>
	<style>
		a{
			text-decoration: none;
		}
	</style>
</head>
<body>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a href="info.do">欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<form action="getAddUserInfo.do" method="post">
				<div style="padding: 5px 0px">
				<label for="userCode">用户名:</label>&nbsp;
				<input id="userCode" name="userCode" type="text" placeholder="请输入用户名" />
				</div>
				<div style="padding: 5px 0px">
				<label for="userName">姓名:</label>&nbsp;
				<input id="userName" name="userName" type="text" placeholder="请输入用户名" />
				</div>
				<div style="padding: 5px 0px">
				<label >性别:</label>&nbsp;
				<input type="radio" name="gender" checked="checked" value="2">男&nbsp;
				<input type="radio" name="gender" value="1">女&nbsp;
				</div>
				<div style="padding: 5px 0px">
				<label >出生年月:</label>&nbsp;
				<input type="date" name="birthday" >
				</div>
				<div style="padding: 5px 0px">
				<label >手机号:</label>&nbsp;
				<input type="number" name="phone" placeholder="请输入手机号" >
				</div>
				<div style="padding: 5px 0px">
				<label >家庭地址:</label>&nbsp;
				<input type="text" name="address" placeholder="请输入家庭地址" >
				</div>
				<div style="padding: 5px 0px">
				<label >身份:</label>&nbsp;
				<input type="radio" name="userRole" checked="checked" value="3">普通员工&nbsp;
				<input type="radio" name="userRole"  value="2">经理&nbsp;
				</div>
				<div style="padding: 5px 0px">
					<input type="submit"
					  value="创建" 
					 style="width: 120px;background-color: green;
					 border: none;padding: 5px;border-radius: 5px;
					 color: white;"/>
				</div>
			</form>
			
		
		</div>
	</div>
</body>
</html>

其效果图如下:

 

当管理员在该页面上添加新用户信息时,则将数据信息通过getAddUserInfo.do虚拟地址发送请求给控制器,我们需要在控制器中定义方法,接收所有添加的信息:

//定义方法,用于接收添加新用户的页面发送过来的新用户的信息
    @RequestMapping(value = "/getAddUserInfo.do",
    params = {"userCode","userName","gender","birthday","phone","address","userRole"})
    public String getAddUserInfo(String userCode,String userName,int gender,
                                 String birthday,String phone,String address,int userRole,
                                 HttpSession session){
        //定义Map集合将所有数据进行封装,为了方便传输
        Map<String,Object> map=new HashMap<>();
        map.put("userCode",userCode);//用户名
        map.put("userName",userName);//姓名
        map.put("gender",gender);//性别
        map.put("birthday",birthday);//生日
        map.put("phone",phone);//手机号
        map.put("address",address);//地址
        map.put("userRole",userRole);//身份
        //添加当前新用户的是管理员,保存管理员的id
        //从登录成功后的个人信息中找出id
        map.put("createdBy",((Map<String,Object>)session.getAttribute("userInfo")).get("id"));
        //保存当前创建新用户的实时时间
        map.put("creationDate",
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));
        //将封装的新用户的数据发送给业务逻辑层service
        int i = userService.add(map);
        String url="";
        if (i>0)
            //添加成功,刷新列表页面
            url="redirect:yhgl.do";
        else
            System.out.println("添加失败");
        return url;
    }

 接着将在IUserService中定义方法接收控制器封装好的数据

 //添加新用户
    int add(Map<String,Object> map);
UserServiceImp实现类中实现该方法
 @Override
    public int add(Map<String, Object> map) {
        return dao.add(map);
    }

在IUserDao中完成添加用户的sql语句执行:

//添加新用户
    @Insert("insert into smbms_user(userCode,userName,gender,birthday,phone,address," +
            "userRole,createdBy,creationDate)" +
            "values(#{userCode},#{userName},#{gender},#{birthday},#{phone},#{address}," +
            "#{userRole},#{createdBy},#{creationDate})")
    int add(Map<String,Object> map);

 通过控制层中可以看到,当返回值大于0时,则表示添加成功,那么我们需要刷新浏览器的列表页面。

管理员修改用户信息功能 

当管理员点击“修改”按钮时,将该按钮对应的列表的下标发送给GetUserInfo.do地址,因此我们在控制器定义方法进行接收该请求传递的下标参数,并根据下标从集合中找到要修改的用户信息,

//定义方法,用于接收下标,获得要修改的用户信息
    @RequestMapping("/GetUserInfo.do")
    public ModelAndView GetUserInfo(@RequestParam int index){
        ModelAndView mav=new ModelAndView();
        //根据下标从集合列表中找到要修改的用户信息
        Map<String, Object> map = userList.get(index);
        //将要修改的用户信息发送至修改页面展示
        mav.addObject("user",map);
        mav.setViewName("updateUser");
        return mav;
    }

并发送给updateUser.jsp页面中进行显示,供管理员进行修改: 

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--修改用户</title>
	<style>
		a{
			text-decoration: none;
		}
	</style>
</head>
<body>
	<% Map<String,Object> map=(Map<String,Object>)request.getAttribute("user"); %>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a href="info.do">欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<form action="UpdateUser.do" method="post">
				<!-- 定义一个隐藏的文本框,用于临时存储要修改的这个用户的id -->
				<input type="hidden" name="id" value="<%=map.get("id") %>">
				<div style="padding: 5px 0px">
				<label for="userCode">用户名:</label>&nbsp;
				<input id="userCode" name="userCode" type="text" value="<%=map.get("userCode") %>" placeholder="请输入用户名" />
				</div>
				<div style="padding: 5px 0px">
				<label for="userName">姓名:</label>&nbsp;
				<input id="userName" name="userName" type="text" value="<%=map.get("userName") %>" placeholder="请输入用户名" />
				</div>
				<div style="padding: 5px 0px">
				<label >性别:</label>&nbsp;
				<% int gender=(int)map.get("gender"); %>
				<% if(gender==2){ %>
				<input type="radio" name="gender" checked="checked" value="2">男&nbsp;
				<input type="radio" name="gender" value="1">女&nbsp;
				<%}else if(gender==1){ %>
				<input type="radio" name="gender"  value="2">男&nbsp;
				<input type="radio" checked="checked" name="gender" value="1">女&nbsp;
				<%} %>
				</div>
				<div style="padding: 5px 0px">
				<label >出生年月:</label>&nbsp;
				<input type="date" value="<%=map.get("birthday") %>" name="birthday" >
				</div>
				<div style="padding: 5px 0px">
				<label >手机号:</label>&nbsp;
				<input type="number" name="phone" value="<%=map.get("phone") %>" placeholder="请输入手机号" >
				</div>
				<div style="padding: 5px 0px">
				<label >家庭地址:</label>&nbsp;
				<input type="text" name="address" value="<%=map.get("address") %>" placeholder="请输入家庭地址" >
				</div>
				<div style="padding: 5px 0px">
				<label >身份:</label>&nbsp;
				<% int sf=(int)map.get("userRole"); %>
				<% if(sf==3){ %>
				<input type="radio" name="userRole" checked="checked" value="3">普通员工&nbsp;
				<input type="radio" name="userRole"  value="2">经理&nbsp;
				<%}else if(sf==2){ %>
				<input type="radio" name="userRole"  value="3">普通员工&nbsp;
				<input type="radio" name="userRole" checked="checked" value="2">经理&nbsp;
				<%} %>
				</div>
				<div style="padding: 5px 0px">
					<input type="submit"
					  value="修改" 
					 style="width: 120px;background-color: green;
					 border: none;padding: 5px;border-radius: 5px;
					 color: white;"/>
				</div>
			</form>
			
		
		</div>
	</div>
</body>
</html>

其效果如如下:

 

 

当管理员修改完成之后,点击“修改”按钮将更新的用户信息发送给UpdateUser.do地址,因此我们需要在控制器中定方法接收更新后的数据:

//定义方法,接收修改用户的数据
    @RequestMapping(value = "/UpdateUser.do",
            params = {"id","userCode","userName","gender","birthday","phone","address","userRole"})
    public String UpdateUser(long id,String userCode,String userName,int gender,
                             String birthday,String phone,String address,int userRole,
                             HttpSession session){
        //定义Map集合将所有数据进行封装,为了方便传输
        Map<String,Object> map=new HashMap<>();
        map.put("id",id);
        map.put("userCode",userCode);//用户名
        map.put("userName",userName);//姓名
        map.put("gender",gender);//性别
        map.put("birthday",birthday);//生日
        map.put("phone",phone);//手机号
        map.put("address",address);//地址
        map.put("userRole",userRole);//身份
        //修改当前用户的是管理员,保存管理员的id
        //从登录成功后的个人信息中找出id
        map.put("modifyBy",((Map<String,Object>)session.getAttribute("userInfo")).get("id"));
        //保存当前创建新用户的实时时间
        map.put("modifyDate",
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));
        int i = userService.update(map);
        if (i>0)//修改成功,刷新列表页面
            return "redirect:yhgl.do";
        else
            //修改失败
            return "redirect:errorUpdateUser.do";
    }
    @RequestMapping(value = "/errorUpdateUser.do",produces = {"text/html;charset=UTF-8"})
    @ResponseBody
    public String errorupdate(){
        return "修改失败";
    }

   

 接着我们需要在IUserService接口中定义方法接收控制器发送过来的更新的数据:

//修改用户
    int update(Map<String,Object>map);

 在UserServiceImp类中实现该方法:

@Override
    public int update(Map<String, Object> map) {
        return dao.update(map);
    }

并将数据发送给IUserDao中执行修改的sql语句对数据库中的数据进行修改:

//修改用户
    @Update("update smbms_user set userCode=#{userCode},userName=#{userName}," +
            "gender=#{gender},birthday=#{birthday},phone=#{phone}," +
            "address=#{address},userRole=#{userRole},modifyBy=#{modifyBy}," +
            "modifyDate=#{modifyDate} where id=#{id}")
    int update(Map<String,Object> map);

那如果修改成功,控制器中将刷新浏览器的用户列表的页面。

管理员删除用户功能

当管理员点击“删除”按钮时,发送用户对应的主键id作为删除用户的条件给deleteUser.do地址,因此我们需要在控制器中定义方法来接收该主键id:

//定义方法,根据id删除用户
    @RequestMapping("/deleteUser.do")
    public String deleteUser(@RequestParam long id){
        int i = userService.del(id);
        if (i>0)//删除成功,刷新列表页面
            return "redirect:yhgl.do";
        else
            //删除失败
            return "redirect:errordelUser.do";
    }

    @RequestMapping(value = "/errordelUser.do",produces = {"text/html;charset=UTF-8"})
    @ResponseBody
    public String errordel(){
        return "删除失败";
    }
    //查看登录用户的个人信息
    @RequestMapping("/info.do")
    public String info(){
        return "myInfo";
    }

 并在IUserService中定义方法接收控制器发送的主键id

 //删除用户
    int del(long id);

 在UserServiceImp类中实现该方法

@Override
    public int del(long id) {
        return dao.del(id);
    }

 在IUserDao中根据该主键id完成删除用户的操作

//删除用户
    @Delete("delete from smbms_user where id=#{id}")
    int del(@Param("id")long id);

并在控制器中判断删除成功后,刷新浏览器上用户信息列表。 

 经理身份登录查看普通员工信息

那么如果登录的用户是经理身份,那么userRole的值为2,则该执行控制器中

 

 因此我们需要在IUserService中定义方法,只能查询普通员工的信息

List<Map<String,Object>> getUsers(int userRole);

接着实现类UserServiceImp中实现

 @Override
    public List<Map<String, Object>> getUsers(int userRole) {
        return dao.getUserByRole(userRole);
    }

在IUserDao中执行查询普通员工的sql语句

//经理只能查看普通员工的信息
    @Select("select * from smbms_user where userRole=#{userRole}")
    List<Map<String,Object>> getUserByRole(@Param("userRole")int userRole);

并将查询出来的普通员工的信息发给user_2.jsp页面进行展示,但不能进行添加,修改,删除操作。

<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--用户信息列表</title>
	<style>
		a{
			text-decoration: none;
		}
	</style>
</head>
<body>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a href="info.do">欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<table border="1" style="width: 80%;text-align: center;border-collapse: collapse;">
				<tr>
					<td>主键Id</td>
					<td>用户编码</td>
					<td>用户名称</td>
					<td>性别</td>
					<td>出生日期</td>
					<td>手机</td>
					<td>地址</td>
				</tr>
				<% List<Map<String,Object>> oList=(List<Map<String,Object>>)request.getAttribute("userList"); %>
				<%for(int i=0;i<oList.size();i++){ %>
					<tr>
					<td><%=oList.get(i).get("id") %></td>
					<td><%=oList.get(i).get("userCode") %></td>
					<td><%=oList.get(i).get("userName") %></td>
					<% int gender=(int)oList.get(i).get("gender");
					if(gender==1){%>
					<td>女</td>
					<%}else if(gender==2){ %>
					<td>男</td>
					<%} %>
					<td><%=oList.get(i).get("birthday") %></td>
					<td><%=oList.get(i).get("phone") %></td>
					<td><%=oList.get(i).get("address") %></td>
					</tr>
				<%} %>
			</table>
		
		</div>
	</div>
</body>
</html>

其效果如下:

 总结

该功能是通过登录的用户的三种身份来完成不通过权限操作,读者可在该代码中完善更多的功能或者优化页面美观等等,后期文章则对供应商管理进行分析并代码完成!!!

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笔触狂放

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值