基于javaweb+mysql的springboot美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm+thymeleaf+html+maven)

基于javaweb+mysql的springboot美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm+thymeleaf+html+maven)

私信源码获取及调试交流

运行环境

Java≥8、MySQL≥5.7

开发工具

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

适用

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

功能说明

基于javaweb的SpringBoot美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm+thymeleaf+html+maven)

主要技术实现:spring、 springmvc、 springboot、mybatis 、session、 jquery 、 md5 、bootstarp.js 拦截器等。

具体主要功能模块如下:

1.用户模块管理:用户登录、用户注册、用户的查询、添加、删除操作、 2.美食分享笔记管理:分享笔记列表的展示、添加、修改、删除操作、 3.美食笔记详情管理:美食笔记详情列表的查看、添加、删除等操作、 4.管理员信息管理:管理员信息的查看、修改、 5.公告信息管理:公告信息的查看、添加、修改、删除操作、 6.用户模块管理:用户列表查询、添加、删除、 7.用户评论模块管理:用户评论查询、添加、删除、 8.注销退出登录管理

给大家截一部分效果图吧 系统首页主要功能:

分类查看没事菜谱信息以及智能推荐:

美食分享笔记详情信息查看、用户登录后可以进行评论、浏览量会增加、用户可以收藏当前文档信息、可以点击查看作者信息、可以对作者进行关注等操作:

用户评论操作:

富文本编辑器添加美食分享笔记:

个人中心我的收藏 我的关注等:

关注用户信息以及具体功能操作等:

后台管理主要功能:用户管理、美食菜谱笔记管理、美食菜谱详情发布以及评论等管理

        trmpMap.put("publishDate", article.getPublishDate());
        trmpMap.put("author", article.getAuthor());
        trmpMap.put("classify", article.getClassify().getClassifyId());
        trmpMap.put("click", article.getClick());
        trmpMap.put("commentNum", article.getCommentNum());
        trmpMap.put("isTop", article.getIsTop());
        trmpMap.put("isOriginal", article.getIsOriginal());
        trmpMap.put("imageName", article.getImageName());
        resultMap.put("errorNo", 0);
        resultMap.put("data", trmpMap);
        return resultMap;
    }

    /**
     * 添加或者修改文章
     *
     * @param article
     * @return
     */
    @RequestMapping("/save")
    public Map<String, Object> save(Article article, @RequestParam(value = "_mode", required = false) String mode)
            throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        if (article.getIsTop() == null) {
            article.setIsTop(0);
        }
        if (article.getIsOriginal() == null) {
            article.setIsOriginal(0);
        }
        if (article.getClick() == null) {
            article.setClick(0);
        }
        if (article.getCommentNum() == null) {
            article.setCommentNum(0);
        }
        if (StringUtil.isEmpty(article.getImageName())) {
            article.setImageName("jzytp.JPG");
        }
        article.setPublishDate(new Date());
        article.setContentNoTag(StringUtil.Html2Text(article.getContent()));
        articleService.save(article);
        if ("add".equals(mode)) {
            articleIndex.addIndex(article);
        } else if ("edit".equals(mode)) {
				if (StringUtil.isEmpty(accessToken)) {
					System.out.println("没有获取到响应参数");
				}else{
					OpenID openIDObj =  new OpenID(accessToken);
					openID = openIDObj.getUserOpenID();
					UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
					UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
					if(userInfoBean != null && userInfoBean.getRet() == 0 && StringUtil.isEmpty(userInfoBean.getMsg())){
						//获取用户成功
						User user=userService.findByOpenId(openID);
						if(null != user){
							//已经注册过,更新用户信息,直接将信息存入session 然后跳转
							user.setNickname(userInfoBean.getNickname());
							user.setHeadPortrait(userInfoBean.getAvatar().getAvatarURL100());
							user.setSex(userInfoBean.getGender());
							user.setLatelyLoginTime(new Date());
							userService.save(user);
							
						}else{
							//该用户第一次登录 先注册
							user = new User();
							user.setOpenId(openID);
							user.setNickname(userInfoBean.getNickname());
							user.setHeadPortrait(userInfoBean.getAvatar().getAvatarURL100());
							user.setSex(userInfoBean.getGender());
							user.setRegistrationDate(new Date());
							user.setLatelyLoginTime(new Date());
							userService.save(user);
						}
						//存储用户信息
						session.setAttribute("currentUser", user);
					}
				}
			}else{
				System.out.println("非法请求");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return "redirect:/";
	}
	
	@RequestMapping("/loginOut")
	public String loginOut(HttpSession session,HttpServletResponse response) throws IOException{
		session.removeAttribute("currentUser");
		return "redirect:/";
	}
	
}

	/**
	 * 添加或者修改时光轴
	 * @param timeline
	 * @return
	 */
	@RequestMapping("/save")
	public Map<String, Object> save(Timeline timeline,String timeDate){
		Map<String, Object> resultMap=new HashMap<String, Object>();
		try {
			timeline.setPublishDate(DateUtil.formatString(timeDate, "yyyy-MM-dd HH:mm:ss"));
			System.out.println(DateUtil.formatString(timeDate, "yyyy-MM-dd HH:mm:ss"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		timelineService.save(timeline);
		resultMap.put("errorNo", 0);
		resultMap.put("data", 1);
		startupRunner.loadData();
		return resultMap;
	}
	
	/**
	 * 批量删除时光轴
	 * @param ids
	 * @return
	 */
	@RequestMapping("/delete")
	public Map<String, Object> delete(@RequestParam(value="timelineId")String ids){
		Map<String, Object> resultMap=new HashMap<String, Object>();
		String []idsStr=ids.split(",");
		for(int i=0;i<idsStr.length;i++) {
			timelineService.delete(Integer.parseInt(idsStr[i]));
		}
		resultMap.put("errorNo", 0);
		resultMap.put("data", 1);
		startupRunner.loadData();
		return resultMap;
	}

}


/**
 * QQ登录控制器
 *
 */
@Controller
@RequestMapping("/QQ")
public class QQController {
	
	
	@Resource
	private UserService userService;
	
	/**
	 * QQ登录跳转
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@RequestMapping("/qqLogin")
	public void qqLogin(HttpServletRequest request,HttpServletResponse response) throws IOException{
		 response.setContentType("text/html;charset=utf-8");
        try {
			response.sendRedirect(new Oauth().getAuthorizeURL(request));
		} catch (QQConnectException e) {
			// TODO Auto-generated catch block
			new QQConnectException("跳转到QQ登录页面异常");
		}
	}
	
    mav.setViewName("redirect:/viewFocusUser");
    return mav;
  }

  @RequestMapping("/addFocusUser/{userId}")
  public ModelAndView addFocusUser(@PathVariable(value = "userId", required = false) Integer userId,
      HttpSession session) {
    ModelAndView mav = new ModelAndView();
    User user = (User) session.getAttribute("user");// 当前登录用户

    String userIds = user.getUserIds();
    List<String> tempList = new ArrayList<>();
    if (userIds != null) {
      tempList = Arrays.asList(userIds.split(","));
    }
    List<String> lineIdList = new ArrayList<>(tempList);
    lineIdList.add(userId.toString());
    String ret = StringUtils.join(lineIdList, ",");

    user.setUserIds(ret);

    userService.save(user);
    mav.setViewName("redirect:/viewFocusUser");
    return mav;
  }

  /**
   * 取消收藏
   * @param request
   * @param userId
   * @return
   */
  @RequestMapping("/removeCollection")
  public ModelAndView removeCollection(HttpServletRequest request, String artId) {
    ModelAndView mav = new ModelAndView();
    User user = (User) request.getSession().getAttribute("user");// 当前登录用户

    String artIds = user.getArticleIds();
    if(artIds == null){
      artIds = "";
    }
    List<String> tempList = Arrays.asList(artIds.split(","));
    List<String> lineIdList = new ArrayList<>(tempList);
    lineIdList.remove(artId);
    String ret = StringUtils.join(lineIdList, ",");

    user.setArticleIds(ret);


/**
 * 前台页面请求
 *
 */
@Controller
@RequestMapping("/foreground")
public class ForegroundController {

    @Resource
    private ArticleService articleService;

    @Resource
    private MusicService musicService;

    @Resource
    private ArticleIndex articleIndex;

    @Resource
    private UserService userService;

    @Resource
    private ClassifyService classifyService;

    private String downloadImagePath = System.getProperty("user.dir") + "\\src\\main\\webapp"; // 图片下载路径

    /**
                    mav.addObject("flag", flag);

                }
            } else {
                mav.addObject("flag", flag);

            }

        }
        mav.addObject("article", article);
        mav.setViewName("/foreground/detail");
        return mav;
    }

    /**
     * 文章详情
     *
     * @return
     */
    @RequestMapping("/myDetail/{id}")
    public ModelAndView myDetail(@PathVariable(value = "id", required = false) Integer id, HttpSession session) {
        ModelAndView mav = new ModelAndView();
        articleService.increaseClick(id);
        Article article = articleService.findById(id);
        Article tempArticle = new Article();
        tempArticle.setClassify(article.getClassify());
        session.setAttribute("similarityList", articleService.list(tempArticle, null, null, 0, 10));
        session.setAttribute("RandomArticleList", articleService.getRandomArticle(10)); // 10条随机文章
        // 判断该文章是否收藏
        boolean flag = false;
        User user = (User) session.getAttribute("user");
        if (user != null && user.getArticleIds() != null) {
            String artIds = user.getArticleIds();
            List<String> idsList = Arrays.asList(artIds.split(","));
            if (idsList.contains(id.toString())) {
                mav.addObject("flag", true);
            } else {
                mav.addObject("flag", flag);
            }
        }

/**
 * 用户控制器
 *
 */
@RestController
@RequestMapping("/admin/user")
public class UserAdminController {

  @Resource
  private UserService userService;

  @Value("${MD5Salt}")
  private String salt; // md5加密盐

  /**
   * 根据ID查找用户
   * @param userId
   * @return
   */
  @RequestMapping("/findById")
  public Map<String, Object> findById(Integer userId) {
    Map<String, Object> resultMap = new HashMap<String, Object>();
    User user = userService.findById(userId);
				datas.add((Map<String, Object>) entry.getValue());
			}
			resultMap.put("datas", datas);
			resultMap.put("result", 1);
		}else {
			resultMap.put("data", "还没有时光轴数据!");
		}
		return resultMap;

	}
}

/**
 * 友情链接控制器
 *
 */
@RestController
@RequestMapping("/admin/link")
public class LinkAdminController {
	
	@Resource
	private LinkService linkService;
	
	@Resource
	private StartupRunner startupRunner;
	
	/**
	 * 分页查询友情链接
	 * @param link
	 * @param page
	 * @param pageSize
	 * @return
	 */
	@RequestMapping("/list")
	public Map<String, Object> list(Link link,@RequestParam(value="page",required=false)Integer page,@RequestParam(value="pageSize",required=false)Integer pageSize){
		Map<String, Object> resultMap=new HashMap<String, Object>();
		resultMap.put("errorNo", 0);
		resultMap.put("data", linkService.list(link,page-1, pageSize));
		resultMap.put("total", linkService.getCount(link));
    return mav;
  }

  /**
   * 收藏
   * @param request
   * @param userId
   * @return
   */
  @RequestMapping("/addCollection")
  public ModelAndView addCollection(HttpServletRequest request, String artId) {
    ModelAndView mav = new ModelAndView();
    User user = (User) request.getSession().getAttribute("user");// 当前登录用户

    String artIds = user.getArticleIds();
    if(artIds == null){
      artIds = "";
    }
    List<String> tempList = Arrays.asList(artIds.split(","));
    List<String> lineIdList = new ArrayList<>(tempList);
    lineIdList.add(artId);
    String ret = StringUtils.join(lineIdList, ",");

    user.setArticleIds(ret);

    userService.save(user);
    mav.setViewName("redirect:/viewCollection");
    return mav;
  }
}

	
	/**
	 * QQ登录回调
	 * @param session
	 * @return
	 * @throws QQConnectException
	 */
	@RequestMapping(value="QQCallBack")
	public String qqcallback(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws QQConnectException{
		response.setContentType("text/html;charset=utf-8");
		AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
		 String accessToken   = null,
                openID        = null;
		try {
			String code = request.getParameter("code");
			String state = request.getParameter("state");
			String  session_state= (String) session.getAttribute("qq_connect_state");
			if(StringUtil.isNotEmpty(session_state) && session_state.equals(state)){
				accessToken = accessTokenObj.getAccessToken();
				session.setAttribute("accessToken", accessToken);
				if (StringUtil.isEmpty(accessToken)) {
					System.out.println("没有获取到响应参数");
				}else{
					OpenID openIDObj =  new OpenID(accessToken);
					openID = openIDObj.getUserOpenID();
					UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
					UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
					if(userInfoBean != null && userInfoBean.getRet() == 0 && StringUtil.isEmpty(userInfoBean.getMsg())){
						//获取用户成功
						User user=userService.findByOpenId(openID);
						if(null != user){
							//已经注册过,更新用户信息,直接将信息存入session 然后跳转
							user.setNickname(userInfoBean.getNickname());
							user.setHeadPortrait(userInfoBean.getAvatar().getAvatarURL100());
							user.setSex(userInfoBean.getGender());
							user.setLatelyLoginTime(new Date());
							userService.save(user);
							
						}else{
							//该用户第一次登录 先注册
							user = new User();
							user.setOpenId(openID);
							user.setNickname(userInfoBean.getNickname());
	                //根据网卡取本机配置的IP  
	                InetAddress inet=null;  
	                try {  
	                    inet = InetAddress.getLocalHost();  
	                } catch (Exception e) {  
	                    e.printStackTrace();  
	                }  
	                ipAddress= inet.getHostAddress();  
	            }  
	        }  
	        //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割  
	        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
	            if(ipAddress.indexOf(",")>0){  
	                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
	            }  
	        }  
	        return ipAddress;   
	}
	
	/**
	 * 获取IP信息
	* @Title: getAdd 
	*  @param request
	*  @return  参数说明 
	* @return String    返回类型 
	* @throws
	 */
	public static String getAdd(HttpServletRequest request) {
        //淘宝IP地址库:http://ip.taobao.com/instructions.php
        String add = null;
        String ip = getIpAddr(request);
        try {
            //URL U = new URL("http://ip.taobao.com/service/getIpInfo.php?ip=114.111.166.72");
            URL U = new URL("http://ip.taobao.com/service/getIpInfo.php?ip="+ip);
            URLConnection connection = U.openConnection();  
            connection.connect();
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
            String result = "";
            String line;
            while ((line = in.readLine())!= null){  
                result += line;  
            }
            in.close(); 
            JSONObject jsonObject = JSONObject.fromObject(result);  
            Map<String, Object> map = (Map) jsonObject;
            String code = String.valueOf(map.get("code"));//0:成功,1:失败。
            if("1".equals(code)){//失败
                String data = String.valueOf(map.get("data"));//错误信息
            }else if("0".equals(code)){//成功
                Map<String, Object> data = (Map<String, Object>) map.get("data");
    @RequestMapping("/quitAdmin")
    public String quitAdmin(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.removeAttribute("user");
        return "login";
    }

    /**
     * 验证登录
     *
     * @param user
     * @param request
     * @return
     */
    @RequestMapping("/checkLogin")
    public ModelAndView checkLogin(User user, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        HttpSession session = request.getSession();
        User u = userService.findByUsernameAndPassword(user.getUsername(), user.getPassword());
        if (u == null) {
            mav.addObject("user", user);
            mav.addObject("errorInfo", "用户名或者密码错误!");
            mav.setViewName("webLogin");
        } else {
            u.setLatelyLoginTime(new Date());
            userService.save(u);
            session.setAttribute("user", u);
            mav.addObject("username", u.getUsername());
            mav.addObject("user", u);
            mav.addObject("success", true);
            mav.setViewName("/index");
        }
        return mav;
    }

    /**
     * 查看个人信息
     *
     * @return
     */
    @RequestMapping("viewPerson")
    public ModelAndView viewPerson(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        ModelAndView mav = new ModelAndView();
        User u = userService.findById(user.getUserId());
        mav.addObject("user", u);
        mav.setViewName("/viewPerson");
        return mav;
    }

    /**
	public void qqLogin(HttpServletRequest request,HttpServletResponse response) throws IOException{
		 response.setContentType("text/html;charset=utf-8");
        try {
			response.sendRedirect(new Oauth().getAuthorizeURL(request));
		} catch (QQConnectException e) {
			// TODO Auto-generated catch block
			new QQConnectException("跳转到QQ登录页面异常");
		}
	}
	
	/**
	 * QQ登录回调
	 * @param session
	 * @return
	 * @throws QQConnectException
	 */
	@RequestMapping(value="QQCallBack")
	public String qqcallback(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws QQConnectException{
		response.setContentType("text/html;charset=utf-8");
		AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
		 String accessToken   = null,
                openID        = null;
		try {
			String code = request.getParameter("code");
			String state = request.getParameter("state");
			String  session_state= (String) session.getAttribute("qq_connect_state");
			if(StringUtil.isNotEmpty(session_state) && session_state.equals(state)){
				accessToken = accessTokenObj.getAccessToken();
				session.setAttribute("accessToken", accessToken);
				if (StringUtil.isEmpty(accessToken)) {
					System.out.println("没有获取到响应参数");
				}else{
					OpenID openIDObj =  new OpenID(accessToken);
					openID = openIDObj.getUserOpenID();
					UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
					UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
					if(userInfoBean != null && userInfoBean.getRet() == 0 && StringUtil.isEmpty(userInfoBean.getMsg())){
						//获取用户成功
						User user=userService.findByOpenId(openID);
						if(null != user){
							//已经注册过,更新用户信息,直接将信息存入session 然后跳转
							user.setNickname(userInfoBean.getNickname());
							user.setHeadPortrait(userInfoBean.getAvatar().getAvatarURL100());
							user.setSex(userInfoBean.getGender());
							user.setLatelyLoginTime(new Date());
							userService.save(user);
							
						}else{
							//该用户第一次登录 先注册
        // 查询公告
        session.setAttribute("noticeList", noticeService.list(0, 5));
        return "index";// 跳转到index.html
    }

    @RequestMapping("/delete")
    public Map<String, Object> delete(Integer userId) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        userService.delete(userId);
        resultMap.put("errorNo", 0);
        return resultMap;
    }

    /**
     * 登录页面
     *
     * @return
     */
    @RequestMapping("/login")
    public String login() {
        return "login";
    }

    /**
     * 前台登录页面
     *
     * @return
     */
    @RequestMapping("/webLogin")
    public String webLogin() {
        return "webLogin";
    }

    /**
     * 注册
     *
     * @return
     */
    @RequestMapping("/regist")
    public String regist() {
        return "regist";
    }

    /**
     * 保存注册信息
     *
     * @param user
     * @return
     */
    @RequestMapping("/saveUser")
    public String saveUser(User user) {
        List<Article> randomArticle = articleService.getRandomArticle(3);
  public ModelAndView viewPerson(HttpServletRequest request) {
    Admin admin = (Admin) request.getSession().getAttribute("adminUser");
    ModelAndView mav = new ModelAndView();
    Admin u = adminService.findById(admin.getAdminId());
    mav.addObject("user", u);
    mav.setViewName("/admin/adminViewPerson");
    return mav;
  }

  /**
   * 保存用户信息
   * 
   * @param user
   * @return
   */
  @RequestMapping("/save")
  public ModelAndView save(Admin user) {
    ModelAndView mav = new ModelAndView();
    adminService.save(user);
    mav.setViewName("/admin/index");
    return mav;
  }
}

/**

/**
 * QQ登录控制器
 *
 */
@Controller
@RequestMapping("/QQ")
public class QQController {
	
	
	@Resource
	private UserService userService;
	
	/**
	 * QQ登录跳转
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@RequestMapping("/qqLogin")
	public void qqLogin(HttpServletRequest request,HttpServletResponse response) throws IOException{
		 response.setContentType("text/html;charset=utf-8");
        try {
			response.sendRedirect(new Oauth().getAuthorizeURL(request));
		} catch (QQConnectException e) {
			// TODO Auto-generated catch block

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

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前端: 1.游客模式(可以观看店家信息) 2.用户登录后可以进行点餐,点餐后可以对菜和店家进行点评进行点评,结账 3.订座 4.个人信息管理 后端: 1.五表权限(员工登录做菜,老板登录观看用户记录和菜铺 管理,订单管理) 2.菜谱管理(增删查改),菜系管理 3.统计菜的点击次数,评价,用户消费总金额,最后一次消费时间 1.用户表:user userId(用户id),userName(用户名),password(密码), createTime(创建时间),lastTime(最后一次登录时间),number 预留号码 2.角色表:role roleId(角色id),roleName(角色名称) 3.权限表:authority 权限id(authorityId),权限名称(authorityId),权限地址(url) 4.用户角色表:user_role 用户id(userId),角色id(roleId) 5.角色权限表:role_authority 角色id(roleId),权限Id(authorityId) 6.消费记录表:record 用户id(userId),用户名称(userName), 消费时间(consumptionTime),消费金额(consumptionMoney) 7.订单表:indent 下单id(indentId),下单用户(userName),下单时间 (indentTime),下单菜谱(menuName) 8.菜谱表:menu 菜谱Id(menuId),菜谱名称(menuName),价格(price),菜系 Id(vegetableId), 图片地址(picture),用户购买量 (userCount),好评数量(good), 一 般数量(general),差 评数量(bad),增加时间(addTime) 9.菜系表:vegetableType 菜系id(vegetableId),菜系名称(vegetableName),增加时间 (addTime) 10.评价表:evaluate 用户id(userId),评价菜谱名(menuName),评价内容 (evaluateContent),评价时间(evaluateTime) 原生态系列,底层代码更好的了解整个项目所需要的哪些细节 具体功能还有很多,就不一一描述了, 希望能帮到大家。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java毕业

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

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

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

打赏作者

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

抵扣说明:

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

余额充值