基于javaweb+mysql的springbootoa办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)

基于javaweb+mysql的springbootoa办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的SpringBootoa办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)

java springbootOA办公自动化系统:

主要功能模块:系统、用户、角色、考勤、流程、公告、邮件、任务、日程、计划、文件、笔记、通讯录、讨论区等多个模块管理

使用Maven进行项目管理,基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。

			Double allmoney=0.0;
			if(roleid>=3L && Objects.equals(fatherid, userid)){
						List<Traffic> ss=eve.getTraffic();
						for (Traffic traffic : ss) {
							allmoney+=traffic.getTrafficMoney();
							User u=udao.findByUserName(traffic.getUsername());
							traffic.setUser(u);
							traffic.setEvection(eve);
							
						}
						List<Stay> mm=eve.getStay();
						for (Stay stay : mm) {
							allmoney+=stay.getStayMoney()*stay.getDay();
							User u=udao.findByUserName(stay.getNameuser());
							stay.setUser(u);
							stay.setEvemoney(eve);
						}
						
						eve.setMoney(allmoney);
						//set主表
						ProcessList pro=eve.getProId();
						System.out.println(pro+"mmmmmm");
						proservice.index5(pro, val, lu, filePath,shen.getUserName());
						emdao.save(eve);
						//存审核表
						proservice.index7(shen, pro);
					}else{
						return "common/proce";
					}
			
				return "redirect:/flowmanage";
		
	}
	//出差申请
	@RequestMapping("evection")
	public String evection(Model model, @SessionAttribute("userId") Long userId,HttpServletRequest request,
			@RequestParam(value = "page", defaultValue = "0") int page,
			@RequestParam(value = "size", defaultValue = "10") int size){
		//查找类型
		List<SystemTypeList> outtype=tydao.findByTypeModel("aoa_evection");

@Controller
@RequestMapping("/")
public class MailController {
	
	
	@Autowired
	private MailnumberDao mndao;
	
	@Autowired
	private StatusDao sdao;
	@Autowired
	private TypeDao tydao;
	@Autowired
	private UserDao udao;
	@Autowired
	private DeptDao ddao;
	public String refresh(HttpServletRequest req,@SessionAttribute("userId") Long userId,Model model,
			@RequestParam(value = "page", defaultValue = "0") int page,
			@RequestParam(value = "size", defaultValue = "10") int size){
		//查找用户
		User user=udao.findOne(userId);
		String title=req.getParameter("title");
		Page<Pagemail> pagelist=null;
		List<Map<String, Object>> maillist=null;
		//得到恢复删除id
		String ids=req.getParameter("ids");

		StringTokenizer st = new StringTokenizer(ids, ",");
		while (st.hasMoreElements()) {
			//找到该用户联系邮件的中间记录
			Mailreciver	mailr=mrdao.findbyReciverIdAndmailId(user,Long.parseLong(st.nextToken()));
			if(!Objects.isNull(mailr)){
				mailr.setDel(false);
				mrdao.save(mailr);
			}else{
				return "redirect:/notlimit";
				}
		}
		//分页及查找
		pagelist=mservice.recive(page, size, user, null,title);
		maillist=mservice.mail(pagelist);
		
		model.addAttribute("page", pagelist);
		model.addAttribute("maillist",maillist);
		model.addAttribute("url","mailtitle");
		model.addAttribute("mess", title);
		
		return "mail/mailbody";
		
	}
}
package cn.gson.oasys.controller.note;

	         if (signum == 0) {
	             return CN_ZEOR_FULL;
	       }
	        //这里会进行金额的四舍五入
	         long number = numberOfMoney.movePointRight(MONEY_PRECISION)
	                .setScale(0, 4).abs().longValue();
	        // 得到小数点后两位值
	         long scale = number % 100;
	        int numUnit = 0;
	        int numIndex = 0;
	        boolean getZero = false;
	        // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
	        if (!(scale > 0)) {
	            numIndex = 2;
	             number = number / 100;
	             getZero = true;
	        }
	        if ((scale > 0) && (!(scale % 10 > 0))) {
	             numIndex = 1;
	            number = number / 10;
	             getZero = true;
	        }
	        int zeroSize = 0;
	        while (true) {
	             if (number <= 0) {
	                break;
	            }
	           // 每次获取到最后一个数
	           numUnit = (int) (number % 10);
	             if (numUnit > 0) {
	                 if ((numIndex == 9) && (zeroSize >= 3)) {
	                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
	                }
	               if ((numIndex == 13) && (zeroSize >= 3)) {
	                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
	              }
	                sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
	                 sb.insert(0, CN_UPPER_NUMBER[numUnit]);
	                getZero = false;
	                zeroSize = 0;
	            } else {
	                ++zeroSize;
	                if (!(getZero)) {
	                   sb.insert(0, CN_UPPER_NUMBER[numUnit]);

	@Autowired
	private InformRelationDao informrelationDao;

	@Autowired
	private InformRelationService informrelationservice;

	@Autowired
	private NoticeMapper nm;

	/**
	 * 通知管理面板
	 * 
	 * @return
	 */
	@RequestMapping("infrommanage")
	public String inform(@RequestParam(value = "page", defaultValue = "0") int page,@SessionAttribute("userId") Long userId,Model model) {
		Page<NoticesList> page2 = informService.pageThis(page,userId);
		List<NoticesList> noticeList=page2.getContent();
		List<Map<String, Object>> list=informService.fengZhuang(noticeList);
		model.addAttribute("list", list);
		model.addAttribute("page", page2);
		//设置变量,需要load的url;
		model.addAttribute("url", "infrommanagepaging");
		return "inform/informmanage";
	}
	
	@RequestMapping("forwardother")
	public String forwardOther(@SessionAttribute("userId")Long userId,@RequestParam(value="noticeId")Long noticeId){
		List<User> users=uDao.findByFatherId(userId);
		NoticesList nl=informDao.findOne(noticeId);
		List<NoticeUserRelation> nurs=new  ArrayList<>();
		for (User user : users) {
			nurs.add(new NoticeUserRelation(nl, user, false));
		}
		informrelationservice.saves(nurs);
		return "redirect:/infromlist";
	}

	// demo
//	@RequestMapping("cccc")
//	public @ResponseBody Page<NoticesList> ddd(@RequestParam(value = "page", defaultValue = "0") int page,
//			@RequestParam(value = "size", defaultValue = "10") int size,
//			@RequestParam(value = "baseKey", required = false) String baseKey, @SessionAttribute("userId") Long userId,
//			Model model) {
	         }
	        // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
	         if (signum == -1) {
	            sb.insert(0, CN_NEGATIVE);
	        }
	        // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
	       if (!(scale > 0)) {
	           sb.append(CN_FULL);
	       }
	        return sb.toString();
	    }
	 
	    public static String numbertocn(Double money){
	    	BigDecimal numberOfMoney = new BigDecimal(money);
	        String s = number2CNMontrayUnit(numberOfMoney);
	        System.out.println("你输入的金额为:【"+ money +"】   #--# [" +s.toString()+"]");
	          return s.toString();
	    }	

	
	
}
package cn.gson.oasys.controller.chat;

					attend.setStatusId(47L);
				}
				adao.save(attend);
			}
			}
			
			
		}
		
		
		if(("费用报销").equals(typename)){
			Bursement  bu=budao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				bu.setManagerAdvice(reviewed.getAdvice());
				budao.save(bu);
			}
			if(u.getPosition().getId()==5){
				bu.setFinancialAdvice(reviewed.getAdvice());
				bu.setBurseTime(new Date());
				bu.setOperation(u);
				budao.save(bu);
			}
		}else if(("出差费用").equals(typename)){
			EvectionMoney emoney=emdao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				emoney.setManagerAdvice(reviewed.getAdvice());
				emdao.save(emoney);
			}
			if(u.getPosition().getId()==5){
				emoney.setFinancialAdvice(reviewed.getAdvice());
				emdao.save(emoney);
			}
		}else if(("出差申请").equals(typename)){
			Evection ev=edao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				ev.setManagerAdvice(reviewed.getAdvice());
				edao.save(ev);
			}
			if(u.getPosition().getId().equals(7L)){
				ev.setPersonnelAdvice(reviewed.getAdvice());
				edao.save(ev);
			}
		}else if(("加班申请").equals(typename)){
			 Overtime over=odao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
		StringTokenizer st = new StringTokenizer(shareuser, ";");
		
		while (st.hasMoreElements()) {
			users.add(udao.findByUserName(st.nextToken()));
		}
	
		scheduleList.setUser(user);
		if(users.size()>0){
			scheduleList.setUsers(users);
		}
		System.out.println(scheduleList);
		
		daydao.save(scheduleList);
		return "/daymanage";
	}
	
	@RequestMapping("dayremove")
	public String dayremove(@RequestParam(value="rcid") Long rcid){
		ScheduleList rc = daydao.findOne(rcid);
		
		daydao.delete(rc);
		
		return "/daymanage";
	}
	
	/**
	 * 一下是日历controller
	 * @return
	 */
	@RequestMapping("daycalendar")
	private String daycalendar() {
		return "daymanage/daycalendar";
	}

//	@RequestMapping("mycalendarload")
//	public void mycalendarload(@SessionAttribute("userId") Long userid,HttpServletResponse response) throws IOException{
//		List<ScheduleList> se = dayser.aboutmeschedule(userid);
//		
//		for (ScheduleList scheduleList : se) {
//			System.out.println(scheduleList);
//		}
//		
//		String json = JSONObject.toJSONString(se);
//		response.setHeader("Cache-Control", "no-cache");
//		response.setContentType("text/json;charset=UTF-8");
//		response.getWriter().write(json);
//		
//	}
	

@Controller
@RequestMapping("/")
public class MailController {
	
	
	@Autowired
	private MailnumberDao mndao;
	
	@Autowired
	private StatusDao sdao;
	@Autowired
	private TypeDao tydao;
	@Autowired
	private UserDao udao;
	@Autowired
	private DeptDao ddao;
	@Autowired
	private RoleDao rdao;
	@Autowired
	private PositionDao pdao;
	@Autowired
	private InMailDao imdao;
	@Autowired
	private MailreciverDao mrdao;
	@Autowired
	private AttachmentDao AttDao;
	@Autowired
	private MailServices mservice;
	@Autowired
		}
		if(!StringUtil.isEmpty(imgpath)){
			users.setImgPath(imgpath);
			
		}
		
		request.setAttribute("users", users);
		
		ResultVO res = BindingResultVOUtil.hasErrors(br);
		if (!ResultEnum.SUCCESS.getCode().equals(res.getCode())) {
			List<Object> list = new MapToList<>().mapToList(res.getData());
			request.setAttribute("errormess", list.get(0).toString());
			
			System.out.println("list错误的实体类信息:" + user);
			System.out.println("list错误详情:" + list);
			System.out.println("list错误第一条:" + list.get(0));
			System.out.println("啊啊啊错误的信息——:" + list.get(0).toString());
			
		}else{
			udao.save(users);
			request.setAttribute("success", "执行成功!");
		}
		return "forward:/userpanel";
		
	}
	@RequestMapping("image/**")
	public void image(Model model, HttpServletResponse response, @SessionAttribute("userId") Long userId, HttpServletRequest request)
			throws Exception {
		String projectPath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
		System.out.println(projectPath);
		String startpath = new String(URLDecoder.decode(request.getRequestURI(), "utf-8"));
		
//		String path = startpath.replace("/image", "");
//
//		File f = new File(rootpath, path);
		File f = new File(request.getRequestURI().substring("/image".length()));
		ServletOutputStream sos = response.getOutputStream();
		FileInputStream input = new FileInputStream(f.getPath());
		byte[] data = new byte[(int) f.length()];
		IOUtils.readFully(input, data);
		// 将文件流输出到浏览器
		IOUtils.write(data, sos);
		input.close();
		sos.close();
	}
			model.addAttribute("files", fileLists);
			model.addAttribute("isload",1);
			break;
			
		case "trash":
			filePaths = fpdao.findByPathUserIdAndPathIstrash(userid, 1L);
			fileLists = fldao.findByUserAndFileIstrash(user, 1L);
			
			model.addAttribute("paths", filePaths);
			model.addAttribute("files", fileLists);
			model.addAttribute("istrash", 1);
			model.addAttribute("isload",1);
			break;
			
		case "share":
			fileLists = fldao.findByFileIsshareAndFileIstrash(1L, 0L);
			model.addAttribute("files", fileLists);
			model.addAttribute("isshare", 1);
			model.addAttribute("isload",1);
			model.addAttribute("userid",userid);
			break;
			

		default:
			break;
		}
		
		model.addAttribute("type", type);
		return "file/filetypeload";
	
	}
	
	
	@RequestMapping("findfileandpath")
	public String findfileandpath(@SessionAttribute("userId") Long userid,
			@RequestParam(value = "findfileandpath",required=false) String findfileandpath,
			@RequestParam(value = "type",defaultValue="all") String type,
			Model model){
		System.out.println("查找!~~~~~~");
		String findlike = "%" +findfileandpath+ "%";
		User user = udao.findOne(userid);
		FilePath fpath = fpdao.findByParentIdAndPathUserId(1L, userid);
		String contenttype;
		List<FileList> fileLists = null;
		List<FilePath> filePaths = null;
		System.out.println(type);
		switch (type) {
		
		case "document":
			fileLists = fldao.finddocumentlike(user, findlike);
		model.addAttribute("mailnum", mailnum);
		
		return "mail/wirtemail";
	}
	/**
	 * 发送邮件
	 * @throws IOException 
	 * @throws IllegalStateException 
	 */
	@RequestMapping("pushmail")
	public String push(@RequestParam("file")MultipartFile file,HttpServletRequest request,@Valid Inmaillist mail,BindingResult br,@SessionAttribute("userId") Long userId) throws IllegalStateException, IOException{
		User tu=udao.findOne(userId);
		
		String name=null;
		Attachment attaid=null;
		Mailnumber number=null;
		StringTokenizer st =null;
		ResultVO res = BindingResultVOUtil.hasErrors(br);
		if (!ResultEnum.SUCCESS.getCode().equals(res.getCode())) {
			List<Object> list = new MapToList<>().mapToList(res.getData());
			request.setAttribute("errormess", list.get(0).toString());
		}else{
			if(!StringUtil.isEmpty(request.getParameter("fasong"))){
				name=request.getParameter("fasong");
			}
			
			
			if(!StringUtil.isEmpty(name)){
				if(!StringUtil.isEmpty(file.getOriginalFilename())){
					attaid=mservice.upload(file, tu);
					attaid.setModel("mail");
					AttDao.save(attaid);
				}
				//发送成功
				mail.setPush(true);
				
			}else{
				//存草稿
				mail.setInReceiver(null);
			}
			mail.setMailFileid(attaid);
			mail.setMailCreateTime(new Date());
			mail.setMailUserid(tu);
			if(!mail.getInmail().equals(0)){
				number=mndao.findOne(mail.getInmail());
				mail.setMailNumberid(number);
			}
			//存邮件
			Inmaillist imail=imdao.save(mail);
			
			if(!StringUtil.isEmpty(name)){
				if(mservice.isContainChinese(mail.getInReceiver())){
			BindingResult br) throws IllegalStateException, IOException {
		service.addConverter(new StringtoDate());
		// 格式化开始日期和结束日期
		Date start = service.convert(plan2.getStartTime(), Date.class);
		Date end = service.convert(plan2.getEndTime(), Date.class);
		Attachment att = null;
		Long attid = null;
		Plan plan = null;

		HttpSession session = req.getSession();
		long userid = Long.valueOf(session.getAttribute("userId") + "");
		User user = userDao.findOne(userid);

		// 获取到类型和状态id
		String type = req.getParameter("type");
		String status = req.getParameter("status");
		long typeid = typeDao.findByTypeModelAndTypeName("aoa_plan_list", type).getTypeId();
		long statusid = statusDao.findByStatusModelAndStatusName("aoa_plan_list", status).getStatusId();
		long pid = Long.valueOf(req.getParameter("pid") + "");

		// 这里返回ResultVO对象,如果校验通过,ResultEnum.SUCCESS.getCode()返回的值为200;否则就是没有通过;
		ResultVO res = BindingResultVOUtil.hasErrors(br);
		if (!ResultEnum.SUCCESS.getCode().equals(res.getCode())) {
			List<Object> list = new MapToList<>().mapToList(res.getData());
			req.setAttribute("errormess", list.get(0).toString());
		}
		// 校验通过,下面写自己的逻辑业务
		else {
			if (!StringUtils.isEmpty(session.getAttribute("getId"))) {
				System.out.println("验证通过,进入狗太了");
			}
			// 新建
			if (pid == -1) {
				if (!file.isEmpty()) {
					att = (Attachment) fServices.savefile(file, user, null, false);
					attid = att.getAttachmentId();
				} else if (file.isEmpty())
					attid = null;

				plan = new Plan(typeid, statusid, attid, start, end, new Date(), plan2.getTitle(), plan2.getLabel(),
						plan2.getPlanContent(), plan2.getPlanSummary(), null, user);
				planDao.save(plan);
			}
			if (pid > 0) {

@Controller
@RequestMapping("/")
public class AttendceController {

	Logger log = LoggerFactory.getLogger(getClass());

	@Autowired
	AttendceDao attenceDao;
	@Autowired
	AttendceService attendceService;
	@Autowired
	UserDao uDao;
	@Autowired
	UserService userService;
	@Autowired
	TypeDao typeDao;
	@Autowired
	StatusDao statusDao;

	List<Attends> alist;
		
		while (st.hasMoreElements()) {
			users.add(udao.findByUserName(st.nextToken()));
		}
	
		scheduleList.setUser(user);
		if(users.size()>0){
			scheduleList.setUsers(users);
		}
		System.out.println(scheduleList);
		
		daydao.save(scheduleList);
		return "/daymanage";
	}
	
	@RequestMapping("dayremove")
	public String dayremove(@RequestParam(value="rcid") Long rcid){
		ScheduleList rc = daydao.findOne(rcid);
		
		daydao.delete(rc);
		
		return "/daymanage";
	}
	
	/**
	 * 一下是日历controller
	 * @return
	 */
	@RequestMapping("daycalendar")
	private String daycalendar() {
		return "daymanage/daycalendar";
	}

//	@RequestMapping("mycalendarload")
//	public void mycalendarload(@SessionAttribute("userId") Long userid,HttpServletResponse response) throws IOException{
//		List<ScheduleList> se = dayser.aboutmeschedule(userid);
//		
//		for (ScheduleList scheduleList : se) {
//			System.out.println(scheduleList);
//		}
//		
//		String json = JSONObject.toJSONString(se);
//		response.setHeader("Cache-Control", "no-cache");
//		response.setContentType("text/json;charset=UTF-8");
//		response.getWriter().write(json);
//		
//	}
		}
		informrelationservice.deleteOne(relation);
		return "forward:/infromlist";
	}

	/**
	 * 通知列表
	 * 
	 * @return
	 */
	@RequestMapping("infromlist")
	public String infromList(HttpSession session, HttpServletRequest req, Model model,
			@RequestParam(value="pageNum",defaultValue="1") int page) {
		Long userId = Long.parseLong(session.getAttribute("userId") + "");
		PageHelper.startPage(page, 10);
		List<Map<String, Object>> list = nm.findMyNotice(userId);
		PageInfo<Map<String, Object>> pageinfo=new PageInfo<Map<String, Object>>(list);
		List<Map<String, Object>> list2=informrelationservice.setList(list);
		for (Map<String, Object> map : list2) {
			System.out.println(map);
		}
		model.addAttribute("url", "informlistpaging");
		model.addAttribute("list", list2);
		model.addAttribute("page", pageinfo);
		System.out.println(pageinfo);
		return "inform/informlist";
	}

	/**
	 * 编辑通知界面
	 */
	@RequestMapping("informedit")
	public String infromEdit(HttpServletRequest req, HttpSession session, Model model) {
		session.removeAttribute("noticeId");
		List<SystemTypeList> typeList = typeDao.findByTypeModel("inform");
		List<SystemStatusList> statusList = statusDao.findByStatusModel("inform");
		if (!StringUtils.isEmpty(req.getAttribute("errormess"))) {
			req.setAttribute("errormess", req.getAttribute("errormess"));
		}
		if (!StringUtils.isEmpty(req.getAttribute("success"))) {
			req.setAttribute("success", "数据保存成功");
		}
		req.setAttribute("typeList", typeList);
		req.setAttribute("statusList", statusList);
		if (!StringUtils.isEmpty(req.getParameter("id"))) {
			Long noticeId = Long.parseLong(req.getParameter("id"));
			NoticesList noticeList = informDao.findOne(noticeId);
			model.addAttribute("noticeList", noticeList);
		Page<User> userspage=null;
		Pageable pa=new PageRequest(page, size);
		if(StringUtils.isEmpty(baseKey)){
			if("ALL".equals(alph)){
				userspage=uDao.findAll(pa);
			}else{
			 userspage=uDao.findByPinyinLike(alph+"%",pa);
			}
		}else{
			if("ALL".equals(alph)){
				userspage=uDao.findUsers("%"+baseKey+"%",baseKey+"%", pa);
			}else{
				userspage=uDao.findSelectUsers("%"+baseKey+"%", alph+"%",pa);
			}
		}
		if(!StringUtils.isEmpty(baseKey)){
			model.addAttribute("baseKey", baseKey);
			model.addAttribute("sort", "&alph="+alph+"&baseKey="+baseKey);
		}else{
			model.addAttribute("sort", "&alph="+alph);
		}
		List<User> users=userspage.getContent();
		model.addAttribute("users", users);
		model.addAttribute("page", userspage);
		model.addAttribute("url", "inaddresspaging");
		return "address/inaddrss";
	}
	
}
package cn.gson.oasys.controller.attendce;

				}
				adao.save(attend);
			}
			}
			
			
		}
		
		
		if(("费用报销").equals(typename)){
			Bursement  bu=budao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				bu.setManagerAdvice(reviewed.getAdvice());
				budao.save(bu);
			}
			if(u.getPosition().getId()==5){
				bu.setFinancialAdvice(reviewed.getAdvice());
				bu.setBurseTime(new Date());
				bu.setOperation(u);
				budao.save(bu);
			}
		}else if(("出差费用").equals(typename)){
			EvectionMoney emoney=emdao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				emoney.setManagerAdvice(reviewed.getAdvice());
				emdao.save(emoney);
			}
			if(u.getPosition().getId()==5){
				emoney.setFinancialAdvice(reviewed.getAdvice());
				emdao.save(emoney);
			}
		}else if(("出差申请").equals(typename)){
			Evection ev=edao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				ev.setManagerAdvice(reviewed.getAdvice());
				edao.save(ev);
			}
			if(u.getPosition().getId().equals(7L)){
				ev.setPersonnelAdvice(reviewed.getAdvice());
				edao.save(ev);
			}
		}else if(("加班申请").equals(typename)){
			 Overtime over=odao.findByProId(pro);
			if(shen.getFatherId().equals(u.getUserId())){
				over.setManagerAdvice(reviewed.getAdvice());
				odao.save(over);
			}
			if(u.getPosition().getId().equals(7L)){

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值