javaweb项目--基于推荐算法的在线杂志平台(java,jdk1.8,SSM,MySQL)


一、功能设计

基于推荐算法的在线杂志平台主要针对于普通用户来实现的功能,根据用户需求,开发出一个能够在线阅读并且根据用户喜好进行推荐的在线杂志推荐平台。同时,保证后台管理员对于整个系统的管理,例如:杂志管理、杂志分类管理、评论管理、用户的阅读记录管理等功能。基于推荐算法的在线杂志平台

1.前端功能模块

1、登录注册
2、全部杂志
3、杂志分类
4、推荐杂志
5、发布评论

2.后台功能模块

1、用户管理模块
2、角色管理模块
3、杂志管理模块
4、阅读记录管理模块
5、评论管理模块
6、杂志分类管理模块

3.统计分析模块

1、推荐算法:从前依次向后比较,碰到比其大的就进行交换,直到到达此次比较的末尾,则得到此次比较的全局最大值,比较限界的末尾向前滑动,重复此过程。可用于阅读量排序。
2、可视化分析:将用户的阅读数据使用Echarts技术表达出来,制成几个图标可视化,协助平台发展。


二、使用技术

操作系统:Windows10
数据库:MySQL5.5
运用服务器:Tomcat服务器
开发环境:java1.8
开发语言:java


三、协同过滤算法

(1)协同过滤推荐的原理:协同过滤推荐的主要思想利用已有用户群过去的行为预测当前用户最可能喜欢哪些物品。
(2)协同过滤推荐的输入与输出
输入 输出
“用户-物品”评分矩阵 一种是用户对某个物品喜欢或不喜欢程度的预测数值;另一种是 n 项推荐物品的列表
(3)协同过滤推荐的分类:
协同过滤推荐大致可以分为:基于邻域的推荐和基于模型的推荐。前者将所有数据记忆到存储体中。后者(离线)做数据降维,抽象出特征,运行时直接用特征。
基于邻域的推荐:有以下基于用户的协同过滤(给用户推荐和他兴趣相似的其他用户喜欢的物品)和基于物品的协同过滤(给用户推荐和他之前喜欢的物品相似的物品)两种。
基于模型的推荐:使用部分机器学习算法,找出用户与项的相互作用模型,从而找出数据中的特定模式。如关联模型,隐语义模型、图模型、混聚类模型、分类模型、回归模型、矩阵分解模型、神经网络模型、合模型、深度学习模型等。
(4)基于用户的协同过滤推荐步骤:
1、找到和目标用户兴趣相似的用户集合。
2、找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
(5)实用场景 —— 杂志推荐:
1、个性化杂志推荐更加强调抓住杂志热点,热门程度和时效性是个性化杂志推荐的重点,而个性化相对于这两点略显次要。
2、杂志的更新非常快,物品相关度的表也需要很快更新,虽然 UserCF 对于新用户也需要更新相似度表,但在在线杂志网站中,杂志的更新速度远远快于新用户的加入速度,而且对于新用户,完全可以给他推荐最热门的杂志。
基于用户的协同过滤推荐简单的说,如果 A、B 两个用户都购买了 x、y、z 三本杂志,并且给出了 5 星的好评。那么 A 和 B 就属于同一类用户。可以将 A 看过的杂志w 也推荐给用户B。
在这里插入图片描述


四、项目截图

1.管理员端

管理员登录
在这里插入图片描述
用户管理
在这里插入图片描述
杂志分类管理
在这里插入图片描述
杂志管理
在这里插入图片描述
评论管理
在这里插入图片描述
阅读记录可视化
在这里插入图片描述

2.用户端

杂志推荐
在这里插入图片描述
查看杂志分类
在这里插入图片描述
杂志列表
在这里插入图片描述
查看杂志
在这里插入图片描述
发布评论
在这里插入图片描述

五、代码片段

管理员核心代码:
/**
 * (Admin)表控制层
 *
 * @author makejava
 * @since 2022-04-30 14:51:48
 */
@Controller
@RequestMapping("admin")
public class AdminController {
    /**
     * 服务对象
     */
    //管理员
    @Resource
    private AdminDao adminDao;

    //用户
    @Resource
    private UsersDao usersDao;

    //评论
    @Resource
    private CommentDao commentDao;

    //杂志
    @Resource
    private MagazineDao MagazineDao;

    //杂志类别
    @Resource
    private MagazinedeptDao MagazinedeptDao;



    @RequestMapping("joinlogin")
    public String joinlogin(Model model) {

        return "admin/login";
    }

    @RequestMapping("joinAdd")
    public String joinAdd(Model model) {

        return "admin/register";
    }

    @RequestMapping("add")
    public String add(Model model, Admin admin) {
        Admin admins = adminDao.queryByUsername(admin.getUsername());
        if (admins != null) {
            model.addAttribute("error", "用户名已存在");
            return joinAdd(model);
        }
        adminDao.insert(admin);
        return joinlogin(model);
    }

    @RequestMapping("login")
    public String login(HttpSession session, Model model, Admin admin) {
        admin = adminDao.login(admin);
        if (admin == null) {
            model.addAttribute("error", "用户名或密码错误");
            return joinlogin(model);
        }
        session.setAttribute("admin", admin);
        return usersIndex(model);
    }

    /*****************************用户管理***************************/
    @RequestMapping("users/index")
    public String usersIndex(Model model) {
        List<Users> users = usersDao.queryAll();
        model.addAttribute("users", users);
        return "admin/users/index";
    }

    @RequestMapping("users/add")
    public String userAdd(Model model, Users users) {
        users.setState("审核通过");
        usersDao.insert(users);
        return usersIndex(model);
    }

    @RequestMapping("users/deleteById")
    public String userDeleteById(Model model, Integer id) {
        usersDao.deleteById(id);
        return usersIndex(model);
    }

    @RequestMapping("users/joinUpdate")
    public String userJoinUpdate(Model model, Integer id) {
        Users users = usersDao.queryById(id);
        model.addAttribute("users", users);
        return "admin/users/update";
    }

    @RequestMapping("users/joinadd")
    public String userJoinAdd(Model model, Integer id) {
        return "admin/users/add";
    }

    @RequestMapping("users/update")
    public String userUpdate(Model model, Users users) {
        users.setState("审核通过");
        usersDao.update(users);
        return usersIndex(model);
    }


    /*****************************杂志类别管理***************************/
    @RequestMapping("Magazinedept/index")
    public String MagazinedeptIndex(Model model) {
        List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
        model.addAttribute("Magazinedept", Magazinedept);
        return "admin/Magazinedept/index";
    }

    @RequestMapping("Magazinedept/add")
    public String MagazinedeptAdd(Model model, Magazinedept Magazinedept) {
        Magazinedept f = MagazinedeptDao.queryByName(Magazinedept.getName());
        if (f == null) {
            Magazinedept.setNums("0");
            MagazinedeptDao.insert(Magazinedept);
        }
        return MagazinedeptIndex(model);
    }

    @RequestMapping("Magazinedept/deleteById")
    public String MagazinedeptDeleteById(Model model, Integer id) {
        MagazinedeptDao.deleteById(id);
        return MagazinedeptIndex(model);
    }

    @RequestMapping("Magazinedept/joinUpdate")
    public String MagazinedeptJoinUpdate(Model model, Integer id) {
        Magazinedept Magazinedept = MagazinedeptDao.queryById(id);
        model.addAttribute("Magazinedept", Magazinedept);
        return "admin/Magazinedept/update";
    }

    @RequestMapping("Magazinedept/joinadd")
    public String MagazinedeptJoinAdd(Model model, Integer id) {
        return "admin/Magazinedept/add";
    }

    @RequestMapping("Magazinedept/update")
    public String MagazinedeptUpdate(Model model, Magazinedept Magazinedept) {
        Magazinedept f = MagazinedeptDao.queryByName(Magazinedept.getName());
        if (f == null) {
            String nums = MagazinedeptDao.queryById(Magazinedept.getId()).getNums();
            Magazinedept.setNums(nums);
            MagazinedeptDao.update(Magazinedept);
        }
        return MagazinedeptIndex(model);
    }

    /*****************************杂志管理***************************/
    @RequestMapping("Magazine/index")
    public String MagazineIndex(Model model) {
        List<Magazine> Magazine = MagazineDao.queryAll();
        model.addAttribute("Magazine", Magazine);
        return "admin/Magazine/index";
    }

    @RequestMapping("Magazine/add")
    public String MagazineAdd(Model model, Magazine Magazine) {
        Magazine.setReqtime(Tool.getTime("yyyy-MM-dd HH:mm"));
        Magazine.setNum("0");
        Magazine.setContent(Tool.getTextarea(Magazine.getContent()));
        MagazineDao.insert(Magazine);
        return MagazineIndex(model);
    }

    @RequestMapping("Magazine/deleteById")
    public String MagazineDeleteById(Model model, Integer id) {
        MagazineDao.deleteById(id);
        return MagazineIndex(model);
    }

    @RequestMapping("Magazine/joinUpdate")
    public String MagazineJoinUpdate(Model model, Integer id) {
        Magazine Magazine = MagazineDao.queryById(id);
        Magazine.setContent(Tool.getTextarea2(Magazine.getContent()));
        List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
        model.addAttribute("Magazine", Magazine);
        model.addAttribute("Magazinedept", Magazinedept);
        return "admin/Magazine/update";
    }

    @RequestMapping("Magazine/joinadd")
    public String MagazineJoinAdd(Model model, Integer id) {
        List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
        model.addAttribute("Magazinedept", Magazinedept);
        return "admin/Magazine/add";
    }

    @RequestMapping("Magazine/joinreptile")
    public String MagazineJoinReptile(Model model) {

        return "admin/Magazine/add2";
    }

    @RequestMapping("Magazine/update")
    public String MagazineUpdate(Model model, Magazine Magazine) {
        Magazine.setReqtime(Tool.getTime("yyyy-MM-dd HH:mm"));
        Magazine.setContent(Tool.getTextarea(Magazine.getContent()));
        Magazine.setNum(MagazineDao.queryById(Magazine.getId()).getNum());
        MagazineDao.update(Magazine);
        return MagazineIndex(model);
    }

    /*****************************公告管理***************************/
    @RequestMapping("comment/index")
    public String commentIndex(Model model) {
        List<Magazine> Magazine = MagazineDao.queryAll();
        model.addAttribute("Magazine", Magazine);
        return "admin/comment/index";
    }

    @RequestMapping("comment/join")
    public String commentJoin(Integer id, Model model) {
        Magazine Magazine = MagazineDao.queryById(id);
        List<Comment> comment = commentDao.queryByFid(Magazine.getId());
        model.addAttribute("Magazine", Magazine);
        model.addAttribute("comment", comment);
        return "admin/comment/index2";
    }

    @RequestMapping("comment/add")
    public String commentJoin(Comment comment, Model model) {
        Integer fid = Integer.parseInt(comment.getFid());
        if (fid == null) {
            return commentIndex(model);
        }
        comment.setReqtime(Tool.getTime("yyyy-MM-dd HH:ss"));
        commentDao.insert(comment);
        return commentJoin(fid, model);
    }

    @RequestMapping("users2/index")
    public String users2Index(Model model) {
        List<Users> users = usersDao.queryAll();
        model.addAttribute("users", users);
        return "admin/users2/index";
    }

    @RequestMapping("users2/joinUpdate")
    public String users2JoinUpdate(Model model, Integer id) {
        Users user = usersDao.queryById(id);
        if (user.getState().equals("未审核")) {
            user.setState("审核通过");
        } else {
            user.setState("未审核");
        }
        usersDao.update(user);
        return users2Index(model);
    }

    @RequestMapping("echart/index")
    public String echartIndex() {

        return "admin/echart/index";
    }

    @RequestMapping("echarts")
    @ResponseBody
    public Map<String, Object> echarts(Model model) {
        Map<String, Object> map = new HashMap<>();
        List<String> names = new ArrayList<>();
        List<String> nums = new ArrayList<>();
        List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
        for (Magazinedept o : Magazinedept) {
            names.add(o.getName());
            nums.add(o.getNums());
        }
        List<Magazine> Magazine = MagazineDao.queryAllLimit();
        List<String> names2 = new ArrayList<>();
        List<String> nums2 = new ArrayList<>();
        for (Magazine o : Magazine) {
            names2.add(o.getName());
            nums2.add(o.getNum());
        }
        map.put("names", names);
        map.put("nums", nums);
        map.put("names2", names2);
        map.put("nums2", nums2);
        return map;
    }
}
用户核心代码:
/**
 * (Users)表控制层
 *
 * @author makejava
 * @since 2022-04-30 14:51:54
 */
@Controller
@RequestMapping("user")
public class UsersController {
    //管理员
    @Resource
    private AdminDao adminDao;

    //用户
    @Resource
    private UsersDao usersDao;

    //评论
    @Resource
    private CommentDao commentDao;

    //杂志
    @Resource
    private MagazineDao MagazineDao;

    //杂志类别
    @Resource
    private MagazinedeptDao MagazinedeptDao;



    @RequestMapping("joinlogin")
    public String joinlogin(Model model) {

        return "user/login";
    }

    @RequestMapping("joinAdd")
    public String joinAdd(Model model) {

        return "user/register";
    }

    @RequestMapping("add")
    public String add(Model model, Users users) {
        Users admins = usersDao.queryByUsername(users.getUsername());
        if (admins != null) {
            model.addAttribute("error", "用户名已存在");
            return joinAdd(model);
        }
        users.setState("未审核");
        usersDao.insert(users);
        return joinlogin(model);
    }

    @RequestMapping("login")
    public String login(HttpSession session, Model model, Users users) {
        users = usersDao.login(users);
        if (users == null) {
            model.addAttribute("error", "用户名或密码错误");
            return joinlogin(model);
        } else if (users.getState().equals("未审核")) {
            model.addAttribute("error", "您的账号未审核,还没有登入权限");
            return joinlogin(model);
        }
        session.setAttribute("users", users);
        return MagazinedeptIndex(model);
    }

    @RequestMapping("Magazinedept/index")
    public String MagazinedeptIndex(Model model) {
        List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
        model.addAttribute("Magazinedept", Magazinedept);
        return "user/Magazinedept/index";
    }

    @RequestMapping("Magazine/index")
    public String MagazineIndex(Model model) {
        List<Magazine> Magazine = MagazineDao.queryAll();
        model.addAttribute("Magazine", Magazine);
        return "user/Magazine/index";
    }

    @RequestMapping("Magazine/selectById")
    public String MagazineSelectById(Model model, Integer id) {
        Magazine Magazine = MagazineDao.queryById(id);
        model.addAttribute("Magazine", Magazine);
        return "user/Magazine/index2";
    }

    @RequestMapping("Magazine/counts")
    @ResponseBody
    public void MagazineCounts(Model model, Integer id) {
        Magazine Magazine = MagazineDao.queryById(id);
        Magazine.setNum(Integer.parseInt(Magazine.getNum())  + 1 +"");
        MagazineDao.update(Magazine);
        Magazinedept dept = MagazinedeptDao.queryByName(Magazine.getDname());
        dept.setNums(Integer.parseInt(dept.getNums()) + 1 +"");
        MagazinedeptDao.update(dept);
    }

    @RequestMapping("comment/index")
    public String commentIndex(Model model) {
        List<Magazine> Magazine = MagazineDao.queryAll();
        model.addAttribute("Magazine", Magazine);
        return "user/comment/index";
    }

    @RequestMapping("comment/join")
    public String commentJoin(Integer id, Model model) {
        Magazine Magazine = MagazineDao.queryById(id);
        List<Comment> comment = commentDao.queryByFid(Magazine.getId());
        model.addAttribute("Magazine", Magazine);
        model.addAttribute("comment", comment);
        return "user/comment/index2";
    }

    @RequestMapping("comment/add")
    public String commentJoin(Comment comment, Model model, HttpSession session) {
        Users users = (Users) session.getAttribute("users");
        if (users == null) {
            model.addAttribute("error", "请重新登入");
            return joinlogin(model);
        }
        Integer fid = Integer.parseInt(comment.getFid());
        if (fid == null) {
            return commentIndex(model);
        }
        comment.setUid(users.getId() + "");
        comment.setUname(users.getName());
        comment.setReqtime(Tool.getTime("yyyy-MM-dd HH:ss"));
        commentDao.insert(comment);
        return commentJoin(fid, model);
    }

    @RequestMapping("Magazine2/index")
    public String MagazineIndex2(Model model) {
        List<Magazine> Magazine = MagazineDao.queryAllLimit();
        try{
            for (int i = 0; i < Magazine.size() - 1; i++) {
                for (int j = 1; j < Magazine.size() - i; j++) {
                    Magazine folderDIO;
                    // 对唯一标识进行比较,层级有小到大
                    if ((Magazine.get(j - 1).getNum()).compareTo(Magazine.get(j).getNum()) > 0) {
                        folderDIO = Magazine.get(j - 1);
                        Magazine.set((j - 1), Magazine.get(j));
                        Magazine.set(j, folderDIO);
                    }
                }
            }
        } catch (Exception e){

        }
        model.addAttribute("Magazine", Magazine);
        return "user/Magazine2/index";
    }

    @RequestMapping("Magazine2/selectById")
    public String MagazineSelectById2(Model model, Integer id) {
        Magazine Magazine = MagazineDao.queryById(id);
        model.addAttribute("Magazine", Magazine);
        return "user/Magazine2/index";
    }
}


详情关注公众号了解:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
项目完整可用,配合压缩包内数据可直接运行使用。 eclipse+mysql5.7+jdk1.8 功能:推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。 根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类: • 基于内容的推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容的推荐引擎就会给你推荐一些热门的历史方面的书籍。 • 基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。 • 基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。 • 混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。
### 回答1: 在Java Web项目中,可以通过以下步骤来限制接口每天只允许调用5万次: 1. 创建一个计数器类来记录接口的调用次数,并在计数器类中设置一个计数器变量,用于存储接口的调用次数。 2. 在计数器类中创建一个定时任务,用于在每天的零点重置计数器变量。 3. 在每个需要进行接口调用次数限制的接口方法中,首先从计数器类中获取当前接口的调用次数,如果当前次数小于5万,则增加计数器变量的值,并继续执行接口的逻辑;否则,返回一个错误提示信息,告知用户接口调用次数已经达到上限。 4. 在项目启动时,创建计数器类的单例实例,并将其存储在全局变量中,以便在所有的接口方法中共享计数器实例。 下面是一个示例代码,演示如何实现接口每天只允许调用5万次的限制: ```java public class ApiCounter { private static ApiCounter instance = new ApiCounter(); private int count = 0; private Date lastResetTime; private ApiCounter() { reset(); scheduleResetTask(); } public static ApiCounter getInstance() { return instance; } public int getCount() { return count; } public void increaseCount() { count++; } public void reset() { count = 0; lastResetTime = new Date(); } private void scheduleResetTask() { TimerTask task = new TimerTask() { @Override public void run() { reset(); } }; Timer timer = new Timer(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date firstResetTime = calendar.getTime(); if (firstResetTime.before(new Date())) { calendar.add(Calendar.DAY_OF_MONTH, 1); firstResetTime = calendar.getTime(); } timer.schedule(task, firstResetTime, TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); } } ``` 在需要进行接口调用次数限制的接口方法中,可以使用如下代码来限制每天最多调用5万次: ```java public void myApiMethod() { ApiCounter counter = ApiCounter.getInstance(); if (counter.getCount() >= 50000) { throw new RuntimeException("The daily limit of 50,000 calls has been reached."); } counter.increaseCount(); // Continue with the rest of the method logic. } ``` 这样,每次调用 myApiMethod 方法时,会先从 ApiCounter 实例中获取当前的接口调用次数,如果超过了5万,则会返回一个错误提示信息,否则会增加计数器变量的值,并继续执行接口的逻辑。同时,定时任务会在每天的零点重置计数器变量,从而实现每天最多调用5万次的限制。 ### 回答2: 在Java的web项目中,限制接口每天只允许调用5万次可以通过以下步骤实现: 1. 在项目引入一个计数器的功能,用于记录每次接口的调用次数。 2. 在项目中定义一个计数器变量,用于记录当天已经调用的次数。可以使用静态变量或者数据中的计数器表来存储这个值。 3. 在每次接口请求的地方,进行计数器的递增操作,即每次接口调用时将计数器变量加1。 4. 在接口调用之前,添加一个计数器检查功能,用于检查当前接口调用次数是否已经达到了上限。 5. 如果计数器检查结果显示接口调用次数已经达到上限(即达到5万次),则禁止继续调用接口,并返回相应的错误提示信息。 6. 如果计数器检查结果显示接口调用次数还未达到上限,那么就允许继续调用接口,继续执行接口的业务逻辑。 7. 在每天的第一个接口调用时,重置计数器变量,将计数器重置为0,重新开始计数。 通过上述步骤,就可以实现对接口每天调用次数的限制,确保每天只允许调用5万次。当然,具体的实现方式还可以依据项目框架的不同而有所调整,例如可以使用拦截器、过滤器等技术来进行计数器的检查和控制。 ### 回答3: 在Java的web项目中限制接口每天只允许调用5万次的方法有很多种,下面介绍几种常用的方法: 1. 使用计数器:通过在代码中加入计数器,每次接口被调用时,计数器加1。在数据或缓存中保存计数器的值,并定时清零。当计数器的值达到5万次时,后续的请求都会被拒绝。 2. 使用限流算法:可以使用像漏桶算法或令牌桶算法等限流算法,对接口的调用进行限制。这些算法可以设置令牌生成速率,每次调用接口时,消耗令牌,当令牌数耗尽时拒绝后续请求。 3. 使用定时任务:可以通过定时任务来监控接口的调用次数,并在每天的零点将计数器清零。通过定时任务可以定期重置接口的调用次数,保证每天只允许调用5万次。 4. 使用限流框架:可以借助一些开源的限流框架来实现接口调用次数的限制,如Guava RateLimiter。这些框架提供了方便的接口限流功能,可以设置接口的访问速率,限制每天只允许调用5万次。 需要指出的是,以上方法只是对接口调用次数进行限制,并不能阻止恶意攻击或绕过限流的行为。如果需要更加安全可靠的限制,还需要考虑使用其他方式,如IP限制、验证码等手段来进一步加强接口的访问控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贰辞园

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

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

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

打赏作者

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

抵扣说明:

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

余额充值