ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-后端功能开发

ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-后端功能开发

    下面就介绍介绍个人博客系统后端业务功能的管理。主要包括:发表博客,管理评论,管理博客,友情链接,博客类型管理等等。具体内容过多,我就不多废话,直接上代码。其中的代码我已经做了注释,直接阅读即可。如果有相关问题,可以加后面的群讨论。

    首先是后端首页的展示:

    下面是博客管理controller--BlogAdminController.java,其中功能包括发表博客,列表搜索,获取博客详情,删除博客,修改博客等等:

 

package com.steadyjack.controller.admin;


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 net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.steadyjack.entity.Blog;
import com.steadyjack.entity.PageBean;
import com.steadyjack.lucene.BlogIndex;
import com.steadyjack.service.BlogService;
import com.steadyjack.util.ResponseUtil;
import com.steadyjack.util.StringUtil;
import com.steadyjack.util.WebFileOperationUtil;

/**
 * title:BlogAdminController.java
 * description:管理员博客Controller层
 * time:2017年1月23日 下午10:15:18
 * author:debug-steadyjack
 */
@Controller
@RequestMapping("/admin/blog")
public class BlogAdminController {

	@Resource
	private BlogService blogService;
	
	// 博客索引
	private BlogIndex blogIndex=new BlogIndex();
	
	/**
	 * title:BlogAdminController.java
	 * description:添加或者修改博客信息
	 * time:2017年1月23日 下午10:15:36
	 * author:debug-steadyjack
	 * @param blog
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/save")
	public String save(Blog blog,HttpServletResponse response,HttpServletRequest request)throws Exception{
		int resultTotal=0;
		
		String newContent=WebFileOperationUtil.copyImageInUeditor(request, blog.getContent());
		blog.setContent(newContent);
		
		blogIndex.setRequest(request);
		if(blog.getId()==null){
			//添加博客索引
			resultTotal=blogService.add(blog);
			blogIndex.addIndex(blog); 
		}else{
			//更新博客索引
			resultTotal=blogService.update(blog);
			blogIndex.updateIndex(blog); 
		}
		
		JSONObject result=new JSONObject();
		if(resultTotal>0){
			result.put("success", true);
		}else{
			result.put("success", false);
		}
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:BlogAdminController.java
	 * description:分页查询博客信息
	 * time:2017年1月23日 下午10:17:41
	 * author:debug-steadyjack
	 * @param page
	 * @param rows
	 * @param s_blog
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(value="page",required=false)String page,
			@RequestParam(value="rows",required=false)String rows,Blog s_blog,
			HttpServletResponse response)throws Exception{
		PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
		
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("title", StringUtil.formatLike(s_blog.getTitle()));
		map.put("start", pageBean.getStart());
		map.put("size", pageBean.getPageSize());
		
		List<Blog> blogList=blogService.list(map);
		Long total=blogService.getTotal(map);
		
		JSONObject result=new JSONObject();
		
		//处理专门的日期字段值
		JsonConfig jsonConfig=new JsonConfig();
		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd"));
		JSONArray jsonArray=JSONArray.fromObject(blogList,jsonConfig);
		
		result.put("rows", jsonArray);
		result.put("total", total);
		ResponseUtil.write(response, result);
		return null;
	}
	
	/**
	 * title:BlogAdminController.java
	 * description:删除博客信息
	 * time:2017年1月23日 下午10:20:11
	 * author:debug-steadyjack
	 * @param ids
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/delete")
	public String delete(@RequestParam(value="ids")String ids,HttpServletResponse response,
			HttpServletRequest request)throws Exception{
		String[] idsStr=ids.split(",");
		
		blogIndex.setRequest(request);
		for(int i=0;i<idsStr.length;i++){
			Integer currId=Integer.parseInt(idsStr[i]);
			Blog currBlog=blogService.findById(currId);
			
			//删除博客内容里面的图片
			WebFileOperationUtil.deleteImagesInUeditor(request, currBlog.getContent());
			
			blogService.delete(currId);
			//删除对应博客的索引
			blogIndex.deleteIndex(idsStr[i]); 
			
		}
		JSONObject result=new JSONObject();
		result.put("success", true);
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:BlogAdminController.java
	 * description:通过ID查找实体
	 * time:2017年1月23日 下午10:20:45
	 * author:debug-steadyjack
	 * @param id
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/findById")
	public String findById(@RequestParam(value="id")String id,HttpServletResponse response)throws Exception{
		Blog blog=blogService.findById(Integer.parseInt(id));
		JSONObject jsonObject=JSONObject.fromObject(blog);
		ResponseUtil.write(response, jsonObject);
		
		return null;
	}
	
}


    其中,值得说明的是,因为发表博客涉及到“百度编辑器ueditor”的操作,比如上传的图片,需要在保存博客时对图片进行处理,比如移动copy到指定的文件目录(因为一般而言ueditor配置初始文件上传目录是一个临时目录,不建议 永久保存在哪里)。对于这个操作,我将在下一篇博客重点讲述。

 

    下面是博客类型Controller--BlogTypeAdminController.java:

 

package com.steadyjack.controller.admin;

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

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

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.steadyjack.entity.BlogType;
import com.steadyjack.entity.PageBean;
import com.steadyjack.service.BlogService;
import com.steadyjack.service.BlogTypeService;
import com.steadyjack.util.ResponseUtil;

/**
 * title:BlogTypeAdminController.java
 * description:管理员博客类别Controller层
 * time:2017年1月23日 下午10:22:24
 * author:debug-steadyjack
 */
@Controller
@RequestMapping("/admin/blogType")
public class BlogTypeAdminController {

	@Resource
	private BlogTypeService blogTypeService;
	
	@Resource
	private BlogService blogService;
	
	/**
	 * title:BlogTypeAdminController.java
	 * description:分页查询博客类别信息
	 * time:2017年1月23日 下午10:22:43
	 * author:debug-steadyjack
	 * @param page
	 * @param rows
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(value="page",required=false)String page,
			@RequestParam(value="rows",required=false)String rows,HttpServletResponse response)throws Exception{
		PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
		
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("start", pageBean.getStart());
		map.put("size", pageBean.getPageSize());
		List<BlogType> blogTypeList=blogTypeService.list(map);
		Long total=blogTypeService.getTotal(map);
		
		JSONObject result=new JSONObject();
		JSONArray jsonArray=JSONArray.fromObject(blogTypeList);
		result.put("rows", jsonArray);
		result.put("total", total);
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:BlogTypeAdminController.java
	 * description:添加或者修改博客类别信息
	 * time:2017年1月23日 下午10:23:38
	 * author:debug-steadyjack
	 * @param blogType
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/save")
	public String save(BlogType blogType,HttpServletResponse response)throws Exception{
		//操作的记录条数
		int resultTotal=0;
		
		if(blogType.getId()==null){
			resultTotal=blogTypeService.add(blogType);
		}else{
			resultTotal=blogTypeService.update(blogType);
		}
		
		JSONObject result=new JSONObject();
		
		if(resultTotal>0){
			result.put("success", true);
		}else{
			result.put("success", false);
		}
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:BlogTypeAdminController.java
	 * description:删除博客类别信息
	 * time:2017年1月23日 下午10:24:08
	 * author:debug-steadyjack
	 * @param ids
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/delete")
	public String delete(@RequestParam(value="ids")String ids,HttpServletResponse response)throws Exception{
		String[] idsStr=ids.split(",");
		JSONObject result=new JSONObject();
		
		for(int i=0;i<idsStr.length;i++){
			if(blogService.getBlogByTypeId(Integer.parseInt(idsStr[i]))>0){
				result.put("exist", "博客类别下有博客,不能删除!");
			}else{
				blogTypeService.delete(Integer.parseInt(idsStr[i]));				
			}
		}
		result.put("success", true);
		ResponseUtil.write(response, result);
		
		return null;
	}
}


    然后是评论管理Controller--CommentAdminController.java:

 

 

package com.steadyjack.controller.admin;

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

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

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.steadyjack.entity.Comment;
import com.steadyjack.entity.PageBean;
import com.steadyjack.service.CommentService;
import com.steadyjack.util.ResponseUtil;

/**
 * title:CommentAdminController.java
 * description:管理员评论Controller层
 * time:2017年1月23日 下午10:24:52
 * author:debug-steadyjack
 */
@Controller
@RequestMapping("/admin/comment")
public class CommentAdminController {

	@Resource
	private CommentService commentService;
	
	/**
	 * title:CommentAdminController.java
	 * description:分页查询评论信息
	 * time:2017年1月23日 下午10:25:04
	 * author:debug-steadyjack
	 * @param page
	 * @param rows
	 * @param state
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(value="page",required=false)String page,
			@RequestParam(value="rows",required=false)String rows,
			@RequestParam(value="state",required=false)String state,HttpServletResponse response)throws Exception{
		PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
		
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("start", pageBean.getStart());
		map.put("size", pageBean.getPageSize());
		//评论状态
		map.put("state", state); 
		
		List<Comment> commentList=commentService.list(map);
		Long total=commentService.getTotal(map);
		
		JSONObject result=new JSONObject();
		JsonConfig jsonConfig=new JsonConfig();
		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd"));
		JSONArray jsonArray=JSONArray.fromObject(commentList,jsonConfig);
		result.put("rows", jsonArray);
		result.put("total", total);
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:CommentAdminController.java
	 * description:删除评论信息
	 * time:2017年1月23日 下午10:31:32
	 * author:debug-steadyjack
	 * @param ids
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/delete")
	public String delete(@RequestParam(value="ids")String ids,HttpServletResponse response)throws Exception{
		String[] idsStr=ids.split(",");
		for(int i=0;i<idsStr.length;i++){
			commentService.delete(Integer.parseInt(idsStr[i]));
		}
		JSONObject result=new JSONObject();
		result.put("success", true);
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:CommentAdminController.java
	 * description:评论审核
	 * time:2017年1月23日 下午10:31:58
	 * author:debug-steadyjack
	 * @param ids
	 * @param state
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/review")
	public String review(@RequestParam(value="ids")String ids,@RequestParam(value="state")Integer state,
			HttpServletResponse response)throws Exception{
		String[] idsStr=ids.split(",");
		for(int i=0;i<idsStr.length;i++){
			Comment comment=new Comment();
			comment.setState(state);
			comment.setId(Integer.parseInt(idsStr[i]));
			commentService.update(comment);
		}
		JSONObject result=new JSONObject();
		result.put("success", true);
		ResponseUtil.write(response, result);
		
		return null;
	}
}


    修改个人信息控制器Controller-BloggerAdminController.java:

 

 

package com.steadyjack.controller.admin;

import java.io.File;

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

import net.sf.json.JSONObject;

import org.apache.shiro.SecurityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.steadyjack.entity.Blogger;
import com.steadyjack.service.BloggerService;
import com.steadyjack.util.CryptographyUtil;
import com.steadyjack.util.DateUtil;
import com.steadyjack.util.ResponseUtil;
import com.steadyjack.util.WebFileUtil;

/**
 * title:BloggerAdminController.java
 * description:管理员博主Controller层
 * time:2017年1月22日 下午10:27:50
 * author:debug-steadyjack
 */
@Controller
@RequestMapping("/admin/blogger")
public class BloggerAdminController {

	@Resource
	private BloggerService bloggerService;
	
	/**
	 * title:BloggerAdminController.java
	 * description:修改博主信息 - 异步
	 * time:2017年1月22日 下午10:28:11
	 * author:debug-steadyjack
	 * @param imageFile
	 * @param blogger
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/save")
	public String save(@RequestParam("imageFile") MultipartFile imageFile,Blogger blogger,HttpServletRequest request,HttpServletResponse response)throws Exception{
		if(!imageFile.isEmpty()){
			//对上传的文件(个人头像)进行处理:文件命名,转为File
			String filePath=WebFileUtil.getSystemRootPath(request);
			String imageName=DateUtil.getCurrentDateStr()+"."+imageFile.getOriginalFilename().split("\\.")[1];
			imageFile.transferTo(new File(filePath+"static/userImages/"+imageName));
			blogger.setImageName(imageName);
		}
		int resultTotal=bloggerService.update(blogger);
		StringBuffer result=new StringBuffer();
		if(resultTotal>0){
			result.append("<script language='javascript'>alert('修改成功!');</script>");
		}else{
			result.append("<script language='javascript'>alert('修改失败!');</script>");
		}
		ResponseUtil.write(response, result);
		return null;
	}
	
	/**
	 * title:BloggerAdminController.java
	 * description:查询博主信息 - 异步
	 * time:2017年1月22日 下午10:41:45
	 * author:debug-steadyjack
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/find")
	public String find(HttpServletResponse response)throws Exception{
		Blogger blogger=bloggerService.find();
		JSONObject jsonObject=JSONObject.fromObject(blogger);
		ResponseUtil.write(response, jsonObject);
		
		return null;
	}
	
	/**
	 * title:BloggerAdminController.java
	 * description:修改博主密码
	 * time:2017年1月22日 下午11:18:42
	 * author:debug-steadyjack
	 * @param newPassword
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/modifyPassword")
	public String modifyPassword(String newPassword,HttpServletResponse response)throws Exception{
		Blogger blogger=new Blogger();
		blogger.setPassword(CryptographyUtil.md5(newPassword, "debug"));
		int resultTotal=bloggerService.update(blogger);
		JSONObject result=new JSONObject();
		if(resultTotal>0){
			result.put("success", true);
		}else{
			result.put("success", false);
		}
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:BloggerAdminController.java
	 * description:注销-退出登录
	 * time:2017年1月22日 下午11:18:17
	 * author:debug-steadyjack
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/logout")
	public String  logout()throws Exception{
		SecurityUtils.getSubject().logout();
		return "redirect:/login.jsp";
	}
}


    友情链接管理Controller--LinkAdminController.java

 

 

package com.steadyjack.controller.admin;


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


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


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


import com.steadyjack.entity.Link;
import com.steadyjack.entity.PageBean;
import com.steadyjack.service.LinkService;
import com.steadyjack.util.ResponseUtil;


/**
 * title:LinkAdminController.java
 * description:友情链接Controller层
 * time:2017年1月23日 下午10:32:33
 * author:debug-steadyjack
 */
@Controller
@RequestMapping("/admin/link")
public class LinkAdminController {
	
	@Resource
	private LinkService linkService;
	
	/**
	 * title:LinkAdminController.java
	 * description:分页查询友情链接信息
	 * time:2017年1月23日 下午10:32:41
	 * author:debug-steadyjack
	 * @param page
	 * @param rows
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(value="page",required=false)String page,
			@RequestParam(value="rows",required=false)String rows,
			HttpServletResponse response)throws Exception{
		PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
		
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("start", pageBean.getStart());
		map.put("size", pageBean.getPageSize());
		
		List<Link> linkList=linkService.list(map);
		Long total=linkService.getTotal(map);
		JSONObject result=new JSONObject();
		JSONArray jsonArray=JSONArray.fromObject(linkList);
		result.put("rows", jsonArray);
		result.put("total", total);
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:LinkAdminController.java
	 * description:添加或者修改友情链接信息
	 * time:2017年1月23日 下午10:33:17
	 * author:debug-steadyjack
	 * @param link
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/save")
	public String save(Link link,HttpServletResponse response)throws Exception{
		//操作的记录条数
		int resultTotal=0;
		
		if(link.getId()==null){
			resultTotal=linkService.add(link);
		}else{
			resultTotal=linkService.update(link);
		}
		JSONObject result=new JSONObject();
		
		if(resultTotal>0){
			result.put("success", true);
		}else{
			result.put("success", false);
		}
		ResponseUtil.write(response, result);
		
		return null;
	}
	
	/**
	 * title:LinkAdminController.java
	 * description:删除友情链接信息
	 * time:2017年1月23日 下午10:33:47
	 * author:debug-steadyjack
	 * @param ids
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/delete")
	public String delete(@RequestParam(value="ids")String ids,HttpServletResponse response)throws Exception{
		String[] idsStr=ids.split(",");
		for(int i=0;i<idsStr.length;i++){
			linkService.delete(Integer.parseInt(idsStr[i]));
		}
		JSONObject result=new JSONObject();
		result.put("success", true);
		ResponseUtil.write(response, result);
		
		return null;
	}
}


     最后是介绍一个全局的关于日期处理的处理器DateJsonValueProcessor.java:

 

 

package com.steadyjack.controller.admin;

import java.text.SimpleDateFormat;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

/**
 * title:DateJsonValueProcessor.java
 * description:json-lib 日期处理器(处理含有日期字段的对象;处理含有日期字段的对象list)
 * time:2017年1月23日 下午10:29:09
 * author:debug-steadyjack
 */
public class DateJsonValueProcessor implements JsonValueProcessor{

	private String format;  
	
    public DateJsonValueProcessor(String format){  
        this.format = format;  
    }  
    
	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
		return null;
	}

	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		if(value == null)  
        {  
            return "";  
        }  
        if(value instanceof java.sql.Timestamp)  
        {  
            String str = new SimpleDateFormat(format).format((java.sql.Timestamp)value);  
            return str;  
        }  
        if (value instanceof java.util.Date)  
        {  
            String str = new SimpleDateFormat(format).format((java.util.Date) value);  
            return str;  
        }  
          
        return value.toString(); 
	}

}


    相关的后端的页面已经在前一篇博客上传了,在本文的最后,将直接分享整个项目的源码与数据库。并也会分享到github,我会在第一条评论留言!如果下载不方便,可以加入群讨论:Java开源技术交流:583522159  我叫debug,个人QQ:1948831260

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
资源简介:SSM Java 项目集合 一、概述 在这个平台上,我们为大家带来了一系列的 JavaSSMSpring + SpringMVC + MyBatis)项目。这些项目旨在展示SSM框架在实际应用中的魅力,同时也为开发者提供了一个快速学习和实践的机会。通过下载和使用这些项目,您将能够深入了解SSM框架的核心概念、设计模式和最佳实践。 二、项目特点 实战性强:这些项目均来自实际业务场景多个领域,具有很强的实战性和参考价值。 技术先进:所有项目均采用最新的SSM框架版本,包括SpringSpringMVCMyBatis 等,确保技术的先进性和稳定性。 代码规范:项目代码严格按照行业标准和最佳实践进行编写,易于阅读和维护。 文档齐全:每个项目都配备了详细的开发文档和使用说明,方便您快速上手和定制开发。 三、适用人群 Java初学者:通过学习和实践这些项目,您将能够快速掌握SSM框架的基础知识和核心技术。 中高级开发者:这些项目将为您提供丰富的实战经验和灵感,帮助您提升技术水平和解决问题的能力。 项目经理和架构师:这些项目可以作为参考和模板,帮助您更好地规划和设计实际业务场景中的Java项目。 四、下载与使用 下载:所有项目均提供下载,您只需在平台上注册并登录即可获取。 安装与部署:每个项目都提供了详细的安装和部署指南,帮助您快速搭建和运行项目。 定制开发:您可以根据实际需求对项目进行定制开发,扩展功能和优化性能。 五、结语 通过这一系列SSM Java项目的下载和学习,您将能够深入了解SSM框架的核心技术,提升自己的编程能力,并在实际业务场景中灵活应用。我们期待您能够通过这些项目获得更多的成长和进步!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

修罗debug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值