精华内容
下载资源
问答
  • 设计浏览记录存储方案当登录用户在浏览商品的详情页时,我们就可以把详情页这件商品信息存储起来,作为该登录用户的浏览记录。用户未登录,我们不记录其商品浏览记录。1. 存储数据说明虽然浏览记录界...

    设计浏览记录存储方案

    • 当登录用户在浏览商品的详情页时,我们就可以把详情页这件商品信息存储起来,作为该登录用户的浏览记录。

    • 用户未登录,我们不记录其商品浏览记录。

    1. 存储数据说明

    • 虽然浏览记录界面上要展示商品的一些SKU信息,但是我们在存储时没有必要存很多SKU信息。

    • 我们选择存储SKU信息的唯一编号(sku_id)来表示该件商品的浏览记录。

    • 存储数据:sku_id

    2. 存储位置说明

    • 用户浏览记录是临时数据,且经常变化,数据量不大,所以我们选择内存型数据库进行存储。

    • 存储位置:Redis数据库 3号库

    CACHES = {
        "history": { # 用户浏览记录
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/3",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },
    }
    

    3. 存储类型说明

    • 由于用户浏览记录跟用户浏览商品详情的顺序有关,所以我们选择使用Redis中的list类型存储 sku_id

    • 每个用户维护一条浏览记录,且浏览记录都是独立存储的,不能共用。所以我们需要对用户的浏览记录进行唯一标识。

    • 我们可以使用登录用户的ID来唯一标识该用户的浏览记录。

    • 存储类型:'history_user_id' : [sku_id_1, sku_id_2, ...]

    4. 存储逻辑说明

    • SKU信息不能重复。

    • 最近一次浏览的商品SKU信息排在最前面,以此类推。

    • 每个用户的浏览记录最多存储五个商品SKU信息。

    • 存储逻辑:先去重,再存储,最后截取。

    展开全文
  • 商品浏览记录实现 分为2个接口 post保存浏览记录sku_id get获取浏览记录 为什么使用redis保存浏览记录  浏览记录频繁更新和读取,redis读写速度快。 redis的数据存储设计  ‘history_用户id’: [sku_id...

    商品浏览记录实现 分为2个接口

    1. post保存浏览记录sku_id 
    2. get获取浏览记录

    为什么使用redis保存浏览记录

      浏览记录频繁更新和读取,redis读写速度快。

    redis的数据存储设计

      ‘history_用户id’: [sku_id列表]

      列表有序

     

    实现流程

    在user/serializers定义浏览历史序列化器  

    class AddUserBrowsingHistorySerializer(serializers.Serializer):
        """
        添加用户浏览历史序列化器
        """
        sku_id = serializers.IntegerField(label="商品SKU编号", min_value=1)
    
        def validate_sku_id(self, value):
            """
            检验sku_id是否存在
            """
            try:
                SKU.objects.get(id=value)
            except SKU.DoesNotExist:
                raise serializers.ValidationError('该商品不存在')
            return value
    
        def create(self, validated_data):
            """
            保存
            """
            user_id = self.context['request'].user.id
            sku_id = validated_data['sku_id']
    
            redis_conn = get_redis_connection("history")
            pl = redis_conn.pipeline()
    
            # 移除已经存在的本商品浏览记录
            pl.lrem("history_%s" % user_id, 0, sku_id)
            # 添加新的浏览记录
            pl.lpush("history_%s" % user_id, sku_id)
            # 只保存最多5条记录
            pl.ltrim("history_%s" % user_id, 0, constants.USER_BROWSING_HISTORY_COUNTS_LIMIT-1)
    
            pl.execute()
    
            return validated_data

    在user/views.py中定义视图继承 CreateModelMixin,GenericAPIView

    class UserBrowsingHistoryView(mixins.CreateModelMixin, GenericAPIView):
        """
        用户浏览历史记录
        """
        serializer_class = AddUserBrowsingHistorySerializer
        permission_classes = [IsAuthenticated]
    
        def post(self, request):
            """
            保存
            """
            return self.create(request)

    在goods/utils.py定义商品列表序列化器

    from rest_framework import serializers
    
    from .models import SKU
    
    class SKUSerializer(serializers.ModelSerializer):
        class Meta:
            model = SKU
            fields = ('id', 'name', 'price', 'default_image_url', 'comments')

    在user/views.py中添加获取浏览记录视图

    from goods.serializers import SKUSerializer
    
    class UserBrowsingHistoryView(mixins.CreateModelMixin, GenericAPIView):
        """
        用户浏览历史记录
        """
        ...
    
        def get(self, request):
            """
            获取
            """
            user_id = request.user.id
    
            redis_conn = get_redis_connection("history")
            history = redis_conn.lrange("history_%s" % user_id, 0, constants.USER_BROWSING_HISTORY_COUNTS_LIMIT-1)
            skus = []
            # 为了保持查询出的顺序与用户的浏览历史保存顺序一致
            for sku_id in history:
                sku = SKU.objects.get(id=sku_id)
                skus.append(sku)
    
            s = SKUSerializer(skus, many=True)
            return Response(s.data)

     

    转载于:https://www.cnblogs.com/whigym/p/10040365.html

    展开全文
  • 商品一个列表,并且每一件商品设置一个编号,用户点击每个商品时都会向servlet提交一个请求,servlet得知用户点击了哪件商品,并将商品...首先我们需要实现一个商品列表:<%@ page language="java" contentType="t

    给商品一个列表,并且每一件商品设置一个编号,用户点击每个商品时都会向servlet提交一个请求,servlet得知用户点击了哪件商品,并将商品编号保存在cookie中,用框图表示:

    这里写图片描述

    可以通过JSP与Servlet的结合来实现这一功能,利用JSP作为View,利用Servlet作为Control。

    首先我们需要实现一个商品列表:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!-- 页面由两个部分组成,一部分是商品列表,一部分是显示历史浏览记录 -->
    <h1>商品列表</h1>
    <!-- 通过超链接进行跳转到Servlet程序并执行,参数通过get方式,即?进行传递 ,url为servlet配置的路径-->
    <a href="/history/producthistory?id=1">冰箱</a><br/>
    <a href="/history/producthistory?id=2">洗衣机</a><br/>
    <a href="/history/producthistory?id=3">笔记本电脑</a><br/>
    <a href="/history/producthistory?id=4">手机</a><br/>
    <a href="/history/producthistory?id=5">空调</a><br/>
    <a href="/history/producthistory?id=6">热水器</a><br/>
    <a href="/history/producthistory?id=7">微波炉</a><br/>
    <a href="/history/producthistory?id=8">电风扇</a><br/>
    
    <h1>商品浏览记录</h1><!--通过读取cookie完成功能-->
    <%
        Cookie[] cookies = request.getCookies();
        if(cookies == null){
            out.println("无浏览记录");
        }else{
            //遍历cookie,找到对应的history
            for(Cookie c:cookies){
                if(c.getName().equals("history")){
                    String id = c.getValue();
                    String[] arr = { "冰箱", "洗衣机", "笔记本电脑", "手机", "空调", "热水器", "微波炉", "电风扇" };
                    out.println(arr[Integer.parseInt(id)-1]);
                }
            }
        }
    
    %>
    </body>
    </html>

    Servlet程序,使用cookie不要忘记import对应包(import javax.servlet.http.Cookie;)

    package cn.megustas.servlet.cookie.demo1;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Cookie;
    
    /**
     * 浏览商品,将商品浏览记录添加到cookie
     */
    
    public class ProductHistoryServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1获得商品编号
            String id = request.getParameter("id");
            //2将商品编号存入cookie
            Cookie cookie = new Cookie("history",id);
            cookie.setMaxAge(60*60);
            cookie.setPath("/history");
            //3写回cookie
            response.addCookie(cookie);
            //提示用户浏览的是哪件商品
            //如果是真正的系统开发,商品信息应该存储在数据库中
            String[] arr = { "冰箱", "洗衣机", "笔记本电脑", "手机", "空调", "热水器", "微波炉", "电风扇" };
            response.setContentType("text/html;charset=utf8");
            response.getWriter().println("用户正在浏览商品:" + arr[Integer.parseInt(id) - 1]);
    
        }
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

    对Servlet程序进行配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- 对servlet进行配置 -->
    <servlet>
        <servlet-name>ProductHistory</servlet-name>
        <servlet-class>cn.megustas.servlet.cookie.demo1.ProductHistoryServlet</servlet-class>
    </servlet>  
    
    <servlet-mapping>
        <servlet-name>ProductHistory</servlet-name>
        <url-pattern>/producthistory</url-pattern>
    </servlet-mapping>
    
    </web-app>

    改进:对于一些经常使用的操作,我们可以将其抽取出来,我们可以定义一个类CookieUtils:

    package cn.megustas.utils;
    import javax.servlet.http.Cookie;
    
    /**
     * 经常读取Cookie,每次读取需要执行for循环,将读取cookie操作抽取出来
     * 
     * @author megustas
     * 
     */
    public class CookieUtils {
        /**
         * 在Cookie数组中 查找指定name cookie
         * 
         * @param cookies
         * @param name
         * @return
         */
        public static Cookie findCookie(Cookie[] cookies, String name) {
            if (cookies == null) {// 没有cookie
                return null;
            } else {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals(name)) {
                        return cookie;
                    }
                }
                return null;
            }
        }
    }

    这里写图片描述

    删除浏览记录

    package cn.megustas.servlet.cookie.demo1;
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 清除 history的cookie信息
     * 
     * @author megustas
     * 
     */
    public class CleanHistoryServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Cookie cookie = new Cookie("history", "");
    
            // 设置MaxAge 为0,即删除了cookie
            cookie.setMaxAge(0);
    
            // path一致
            cookie.setPath("/history");
    
            response.addCookie(cookie);
    
            // 跳转到商品列表页面 :转发或重定向,从性能上说,转发好于重定向
            //request.getRequestDispatcher("/cookie/demo/product.jsp").forward(request,response);
            //重定向
            response.sendRedirect("/history/cookie/demo/product.jsp");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    

    同理,在JSP中的操作也可以通过import我们所定义的包来进行简化,其完整实现代码可以到https://coding.net/u/TwistFate/p/ShoppingHistory/git/tree/master/history进行下载。

    展开全文
  • 记录用户的商品浏览记录

    千次阅读 2018-05-21 04:07:01
    * * 判断当前的商品是否已经在浏览记录. * * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始. * * 没在浏览记录中: * * 判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个 将当前元素添加到最前面...
    C3P0JDBCUtils
    User
    UserDao
    UserService
    ProductServlet
    package bull02.VisitHistoty;
    
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.LinkedList;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import bull.Utils.CookieUtils;
    /**
     * 
     * * 接收商品id.
     * * 接收从客户端带过来的所有Cookie.
     * * 从Cookie的数组中查找指定名称的Cookie.
     * * 判断是否是第一次浏览商品:
     *     * 第一次浏览商品
     *        * 直接将商品的ID存入到Cookie.
     *        * 将Cookie回写到浏览器.
     *     * 不是第一次浏览商品 1-2
     *        * 判断当前的商品是否已经在浏览记录.
     *            * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始.
     *            * 没在浏览记录中: 
     *                * 判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个 将当前元素添加到最前面.
     *                * 没有超过:直接将该元素添加到最前位置.
     *        * 将转换的id的值存入到Cookie,回写浏览器.
     * @author 45度炸
     *
     */
    public class ProductServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //接收商品ID
            String id = request.getParameter("id");
            //获取Cookie信息
            Cookie[] cookies = request.getCookies();
            //从Cookie数组中查找指定名称的cookie,这边要找的是history
            Cookie cookie = CookieUtils.find(cookies, "history");
    
            if(cookie == null) {
                //如果cookie中没有东西则把id加入history这个cookie中
                Cookie c = new Cookie("history",id);
                c.setPath("/Web11");
                c.setMaxAge(60*60*24*7);
                response.addCookie(c);
            } else {
                //获得history这个cookie的所有值
                String value = cookie.getValue();
                //将value(1-2-3-4)这个字符串以"-"分割开成[1,2,3,4]
                String[] ids = value.split("-");
                LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));
    
                    //如果商品在浏览记录里
                    if(list.contains(id)) {
                        //除去原纪录,并添加到第一个。
                        list.remove(id);
                        list.addFirst(id);
                    } else {
                        //如果商品不在浏览记录里
                        if(list.size() >= 3) {
                            //记录大于等于三个时,删掉最后一个记录,再添加一个新的记录
                            list.removeLast();
                            list.addFirst(id);
                        } else {
                            list.addFirst(id);
                    }
                }
                //将list元素取出来,用"-"连接保存到Cookie中写回浏览器
                StringBuffer sb = new StringBuffer();
                for (String string : list) {
                    sb.append(string).append("-");
                }
                //将最后一个"-"去掉:(1-2-3-)-->(1-2-3)
                String cookieValue = sb.toString().substring(0,sb.length()-1);
                System.out.println(cookieValue);
                //写回浏览器
                Cookie c = new Cookie("history",cookieValue);
                c.setPath("/Web11");
                c.setMaxAge(60*60*24*7);
                response.addCookie(c);
            }
            //转发跳到商品详情页
            request.getRequestDispatcher("/history/product_info.htm").forward(request, response);;
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request,response);
        }
    
    }
    
    

    product_list.jsp

    (商品部分)
    <div class="col-md-2">
                    <a href="${pageContext.request.contextPath }/ProductServlet?id=1">
                        <img src="/Web11/history/products/1/cs10001.jpg" width="170" height="170" style="display: inline-block;">
                    </a>
                    <p><a href="${pageContext.request.contextPath }/ProductServlet?id=1" style='color:green'>冬瓜</a></p>
                    <p><font color="#FF0000">商城价:&yen;299.00</font></p>
                </div>
    (显示浏览记录图片)
    <div style="overflow: hidden;">
                    <a href="${pageContext.request.contextPath }/ClearServlet">清除浏览记录</a>
                    <ul style="list-style: none;">
                    <%
                        Cookie[] cookies = request.getCookies();
                        Cookie cookie = CookieUtils.find(cookies, "history");
                        if(cookie == null) {
                        %>
                        <h5>您的浏览记录为空!</h5>
                        <%
                        } else {
                            String value = cookie.getValue();
                            String[] ids = value.split("-");
                            for(String id:ids) {
                            %>
                        <li style="width: 150px;height: 216;float: left;margin: 0 8px 0 0;padding: 0 18px 15px;text-align: center;"><img src="/Web11/history/products/1/cs1000<%=id %>.jpg" width="130px" height="130px" /></li>                            
                            <% 
                            }
                        }
                     %>
                    </ul>
    
                </div>
    ClearServlet:清除浏览记录
    package bull02.VisitHistoty;
    /**
     * 清空持久性cookie
     */
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ClearServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Cookie cookie = new Cookie("history",null);
            cookie.setPath("/Web11");
            cookie.setMaxAge(0);
            response.addCookie(cookie);
    
            request.getRequestDispatcher("/history/product_list.jsp").forward(request, response);
        }
    
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request,response);
        }
    
    }
    
    展开全文
  • 使用Cookie实现保存商品浏览记录

    千次阅读 2016-04-19 23:00:52
    使用Cookie实现保存商品浏览记录 1.确定好框架 我新建了三个类。DBHelper.java来连接数据库,Items.java来封装数据,ItemsDAO.java来提供对Items的方法。 在页面显示上,我新建了俩个jsp。index.jsp来负责提供...
  • 7.1 设计浏览记录存储方案 当登录用户在浏览商品的详情页时,我们就可以把详情页这件商品信息存储起来,作为该登录用户的浏览记录。 用户未登录,我们不记录其商品浏览记录。 7.1.1. 存储数据说明 虽然浏览...
  • Cookie在工作中的使用,最近项目写到了用户浏览商品模块,用到了cookie对象,把我对cookie的认识分享给大家。...下面是商城的浏览记录模块的技术实现。 首先技术分析: Cookie cookie = new Cookie(cookiename,coo...
  • 使用Cookie实现商品浏览记录 https://www.imooc.com/video/4720 1.展示商品的详细信息 <body> <h1>商品详情</h1> <hr> <center> <table width="750" height="60" cellpadding=...
  • 历史记录只需保存多个商品的sku_id即可,而且需要保持添加sku_id的顺序,所以采用redis中的列表来保存,redis的数据存储设计-----‘history_用户id’: [sku_id列表] 1、在配置文件中增加浏览历史记录的redis配置 ...
  • cookie技术案例-用户浏览商品记录

    千次阅读 2014-05-19 17:13:13
    模拟用户在网上商城,浏览商品,同时显示商品浏览记录 1.查询所有商品页面-index.jsp/index.html  a.查询所有商品的按钮-----FindAllBooksServlet.java-com.ghsy.servlet 2.显示商城的商品  a.用bean存储...
  • Session案例,显示商品浏览记录

    千次阅读 多人点赞 2012-01-11 22:56:48
    因为session为每一个浏览器用户创建了一个session,这样对服务器的要求无形之中高了很多,而cookie是对每个浏览器发送数据,所以服务器负担小,所以大部分浏览器还是选择使用cookie来实现浏览记录的显示。...
  • 案例:商品浏览记录的实现

    千次阅读 2017-04-11 17:24:31
    //存储集合 try { conn= DBHelper.getConnection(); //获取连接对象 String sql = "select * from items;" ; //建立sql语句 stmt=conn.prepareStatement(sql); //创语句对象并放sql语句 rs = stmt....
  • 在主页中显示商品,点击商品可以查看商品的具体信息,带用户浏览完之后,回到主页,就会看到自己曾经浏览过什么商品商品主页Servlet [java] view plain copy CookieDemo3.java: package ...
  • 使用redis存储用户的浏览记录

    千次阅读 2019-07-13 15:11:23
    访问商品的详情页面的时候,添加历史浏览记录 2)、什么时候获取历史浏览记录: 访问用户中心个人信息页的时候获取历史浏览记录 3)、历史浏览记录需要存储在哪里? 使用redis数据库存储历史浏览记录 4)、...
  • 使用redis存储历史浏览记录

    千次阅读 2019-04-21 20:59:18
    使用redis存储历史浏览记录 核心是分析流程 1.什么时候需要添加历史浏览记录? 访问具体商品详情页面时 2.什么时候需要获取历史浏览记录? 根据具体情况而定 3.存储在哪? redis数据库,如果使用普通的关系型数据库,...
  • 用户查看商品的历史浏览记录存成什么格式: history_用户id:[商品id,商品id] 添加用户浏览记录: # 添加用户的历史记录history_用户id:[商品id,商品id,商品id]conn = get_redis_connection('default')...
  • 下面我们用cookie技术来做一个商品浏览记录的案例, 第一步:先建一个jsp的页面,用来模拟数据库,存储商品的列表 代码如下: jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8...
  • Java Cookie记录商品浏览历史

    千次阅读 2016-02-28 20:59:17
    存储图书信息类Book.java package com.app2; public class Book { private String id; private String name; private String price; private String author; private String description; publi
  • 我们经常在淘宝,京东,亚马逊等电商平台浏览商品是,经常会看到最近浏览记录这一栏,如下图:Q题目现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录。如下图例如: 1)现有如下网上...
  • 用户进入详情页,在详情页加载的同时,把该商品加进redis,以用户id做不同用户浏览记录区分,最后再获取。 获取redis链接: REDIS_DB_URL = { 'host': '127.0.0.1', 'port': 6379, 'password': '', 'db': 0 } ...
  • 第一个servlet显示商品列表和历史记录 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置防止乱码 response.setCharacter...
  • Redis实现用户浏览商品的历史记录 思路: 用户每次浏览商品时, 向后台发送请求, 携带商品ID, 然后在 Redis中存储: 用户ID和... // redis存用户浏览记录,根据浏览时间, 只存8条 // redis key上线 2.5亿 // key: user...
  • 用户在访问每个商品详情页面时,都要记录浏览记录。 历史记录只需要保存多个商品的sku_id即可, 而且需要保持添加sku_id的顺序, 所以采用redis中列表来保存,redis的数据存储设计。 'history_用户id': [sku_id,] 在...
  • 显示商品浏览记录的Servlet package com.xiaozhi.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet....
  • 使用JSP知识实现简单的动态淘宝商品浏览,使用COOKIE保存浏览记录. 连接数据库: import java.sql.Connection; import java.sql.DriverManager; public class DBHelper { private static final String ...
  • 文章目录用户浏览记录介绍[redis 数据类型选择(文档)](http://redisdoc.com/list/lrem.html)redis存储逻辑读取数据命令 用户浏览记录介绍 我们记录用户的最多五条 浏览历史商品记录,并呈现 使用redis 作为存储 ...
  • 对于商城项目中的历史浏览记录我们将它储存在redis缓存中,便于存储和拿取数据, 而我们首先要明确历史记录什么时候添加,什么时候获取 添加 访问商品详情页面的时候,需要添加历史浏览记录 获取 访问用户中心...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,899
精华内容 7,559
关键字:

商品浏览记录如何存储