精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot 實現多場景抽獎活動全攻略

開發 前端
本文將基于?SpringBoot?框架,詳細介紹如何實現多種常見的抽獎活動,提供開箱即用的技術方案,助力開發者快速搭建抽獎系統。

前言

在互聯網營銷場景中,抽獎活動是吸引用戶、提升用戶活躍度的有效方式。從簡單的隨機抽獎到復雜的概率抽獎、階梯抽獎等,不同類型的抽獎活動能滿足多樣化的運營需求。

本文將基于 SpringBoot 框架,詳細介紹如何實現多種常見的抽獎活動,提供開箱即用的技術方案,助力開發者快速搭建抽獎系統。

實現

效果圖

圖片圖片

數據庫設計

#活動 ID、活動名稱、活動開始時間、活動結束時間、活動狀態(進行中、已結束等)、抽獎次數限制、活動描述
CREATE TABLE lottery_activity (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    activity_name VARCHAR(255) NOT NULL,
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    status TINYINT NOT NULL COMMENT '0:進行中, 1:已結束',
    description TEXT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

#獎品 ID、活動 ID(關聯活動表)、獎品名稱、獎品數量、獎品圖片地址、中獎概率
CREATE TABLE lottery_prize (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    activity_id BIGINT NOT NULL,
    prize_name VARCHAR(255) NOT NULL,
    prize_count INT NOT NULL,
    image_url VARCHAR(255),
    probability DECIMAL(5, 2) NOT NULL COMMENT '中獎概率,范圍0-1',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (activity_id) REFERENCES lottery_activity(id)
);

#參與 ID、用戶 ID、活動 ID、抽獎時間、是否中獎、抽中獎品 ID
CREATE TABLE lottery_participation (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    activity_id BIGINT NOT NULL,
    participate_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    is_winner TINYINT NOT NULL COMMENT '0:未中獎, 1:中獎',
    prize_id BIGINT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (activity_id) REFERENCES lottery_activity(id),
    FOREIGN KEY (prize_id) REFERENCES lottery_prize(id)
);

功能實現

隨機抽獎

隨機抽獎是最基礎的抽獎方式,從所有獎品中隨機選取一個作為中獎結果

@Service
public class RandomLotteryService {

    public LotteryPrize randomDraw(List<LotteryPrize> prizes) {
        if (prizes == null || prizes.isEmpty()) {
            return null;
        }
        Random random = new Random();
        int index = random.nextInt(prizes.size());
        return prizes.get(index);
    }
}
概率抽獎

概率抽獎根據每個獎品設置的中獎概率,按照概率分布決定用戶是否中獎以及抽中哪個獎品

@Service
public class ProbabilityLotteryService {

    public LotteryPrize probabilityDraw(List<LotteryPrize> prizes) {
        if (prizes == null || prizes.isEmpty()) {
            return null;
        }
        // 計算總概率
        double totalProbability = 0;
        for (LotteryPrize prize : prizes) {
            totalProbability += prize.getProbability();
        }

        // 生成0到總概率之間的隨機數
        Random random = new Random();
        double randomValue = random.nextDouble() * totalProbability;

        // 根據概率權重選擇獎品
        double currentProbability = 0;
        for (LotteryPrize prize : prizes) {
            currentProbability += prize.getProbability();
            if (randomValue < currentProbability) {
                return prize;
            }
        }
        return null;
    }
}
階梯抽獎

階梯抽獎根據用戶的參與次數或消費金額等條件,設置不同的抽獎階梯,每個階梯對應不同的獎品池

@Service
public class TieredLotteryService {

    public LotteryPrize tieredDraw(int drawCount, Map<Integer, List<LotteryPrize>> tieredPrizes) {
        for (Map.Entry<Integer, List<LotteryPrize>> entry : tieredPrizes.entrySet()) {
            if (drawCount >= entry.getKey()) {
                List<LotteryPrize> prizes = entry.getValue();
                if (prizes != null &&!prizes.isEmpty()) {
                    // 可以結合隨機抽獎或概率抽獎從對應獎品池中抽取獎品
                    RandomLotteryService randomLotteryService = new RandomLotteryService();
                    return randomLotteryService.randomDraw(prizes);
                }
            }
        }
        return null;
    }
}
抽獎流程整合
  • 抽獎次數限制:通過 Redis 原子操作記錄和檢查用戶抽獎次數
  • 分布式鎖:使用 Redisson 實現分布式鎖,防止并發問題
  • 緩存預熱:活動開始前將獎品庫存和配置加載到 Redis
  • Redis 庫存扣減:使用 Lua 腳本實現原子性庫存扣減,避免超賣
  • 異步庫存更新:Redis 扣減后異步更新數據庫,減輕數據庫壓力
@Service
public class LotteryProcessService {

    public static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyyMMdd");
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private DefaultRedisScript<Long> stockDeductLuaScript;

    @Autowired
    private DefaultRedisScript<Long> incrementIfNotExistLuaScript;

    @Autowired
    private RandomLotteryService randomLotteryService;

    @Autowired
    private ProbabilityLotteryService probabilityLotteryService;

    @Autowired
    private TieredLotteryService tieredLotteryService;

    @Autowired
    private LotteryActivityService lotteryActivityService;

    @Autowired
    private LotteryPrizeService lotteryPrizeService;

    @Autowired
    private LotteryParticipationService lotteryParticipationService;

    @Autowired
    private RedissonClient redissonClient;

    private static final String STOCK_KEY_PREFIX = "lottery:stock:";
    private static final String DRAW_COUNT_KEY_PREFIX = "lottery:drawCount:";
    private static final String LOCK_KEY_PREFIX = "lottery:lock:";

    public LotteryResult draw(Long userId, Long activityId, String lotteryType) {
        // 活動校驗
        LotteryActivity activity = lotteryActivityService.getById(activityId);
        if (activity == null || activity.getStatus() != 0) {
            return new LotteryResult(false, null, "活動不存在或已結束");
        }

        // 檢查用戶抽獎次數
        if (!checkUserDrawCount(userId, activityId, activity.getDailyDrawLimit())) {
            return new LotteryResult(false, null, "今日抽獎次數已用完");
        }

        // 獲取獎品列表
        List<LotteryPrize> prizes = lotteryPrizeService.listByActivityId(activityId);
        if (prizes == null || prizes.isEmpty()) {
            return new LotteryResult(false, null, "獎品列表為空");
        }

        // 預熱獎品庫存到Redis
        warmUpPrizesStock(activityId, prizes);

        // 執行抽獎邏輯
        RLock lock = redissonClient.getLock(LOCK_KEY_PREFIX + activityId + ":" + userId);
        try {
            // 嘗試獲取鎖,等待10秒,自動釋放時間30秒
            boolean locked = lock.tryLock(10, 30, TimeUnit.SECONDS);
            if (!locked) {
                return new LotteryResult(false, null, "系統繁忙,請稍后再試");
            }

            // 從Redis中扣減庫存
            LotteryPrize prize = deductStockAndDraw(userId, activityId, prizes, lotteryType);
            if (prize == null) {
                return new LotteryResult(false, null, "獎品已抽完");
            }

            // 記錄用戶參與抽獎信息
            recordLotteryParticipation(userId, activityId, prize);

            // 異步更新數據庫庫存
            asyncUpdateDbStock(prize.getId(), 1);

            return new LotteryResult(true, prize, "抽獎成功");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return new LotteryResult(false, null, "系統繁忙,請稍后再試");
        } finally {
            lock.unlock();
        }
    }

    /**
     * 檢查用戶抽獎次數
     */
    private boolean checkUserDrawCount(Long userId, Long activityId, int dailyLimit) {
        String drawCountKey = DRAW_COUNT_KEY_PREFIX + userId + ":" + activityId + ":" + DTF.format(LocalDate.now());

        // 使用Lua腳本原子性檢查并增加計數
        Long count = redisTemplate.execute(incrementIfNotExistLuaScript,
                Arrays.asList(drawCountKey),  24);

        return count != null && count <= dailyLimit;
    }

    /**
     * 預熱獎品庫存到Redis
     */
    private void warmUpPrizesStock(Long activityId, List<LotteryPrize> prizes) {
        for (LotteryPrize prize : prizes) {
            String stockKey = STOCK_KEY_PREFIX + activityId + ":" + prize.getId();
            // 如果Redis中不存在該獎品庫存,則從數據庫加載
            if (!redisTemplate.hasKey(stockKey)) {
                // 考慮到并發預熱,使用分布式鎖
                RLock lock = redissonClient.getLock("lottery:warmup:" + stockKey);
                try {
                    if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {
                        // 再次檢查,避免其他線程已經預熱
                        if (!redisTemplate.hasKey(stockKey)) {
                            // 從數據庫獲取當前庫存
                            Integer dbStock = lotteryPrizeService.getStockById(prize.getId());
                            if (dbStock != null) {
                                redisTemplate.opsForValue().set(stockKey, dbStock);
                            }
                        }
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    lock.unlock();
                }
            }
        }
    }

    /**
     * 扣減庫存并抽獎
     */
    private LotteryPrize deductStockAndDraw(Long userId, Long activityId,
                                            List<LotteryPrize> prizes, String lotteryType) {
        // 過濾掉庫存為0的獎品
        List<LotteryPrize> availablePrizes = new ArrayList<>();
        for (LotteryPrize prize : prizes) {
            String stockKey = STOCK_KEY_PREFIX + activityId + ":" + prize.getId();
            Integer stock = (Integer) redisTemplate.opsForValue().get(stockKey);
            if (stock != null && stock > 0) {
                availablePrizes.add(prize);
            }
        }

        if (availablePrizes.isEmpty()) {
            return null;
        }

        // 根據抽獎類型選擇抽獎算法
        LotteryPrize selectedPrize;
        switch (lotteryType) {
            case"random":
                selectedPrize = randomLotteryService.randomDraw(availablePrizes);
                break;
            case"probability":
                selectedPrize = probabilityLotteryService.probabilityDraw(availablePrizes);
                break;
            case"tiered":
                // 獲取用戶抽獎次數,用于階梯抽獎
                String drawCountKey = DRAW_COUNT_KEY_PREFIX + userId + ":" + activityId + ":" + LocalDate.now();
                Integer drawCount = (Integer) redisTemplate.opsForValue().get(drawCountKey);
                if (drawCount == null) drawCount = 0;

                // 獲取階梯獎品配置
                Map<Integer, List<LotteryPrize>> tieredPrizes = getTieredPrizes(activityId);
                selectedPrize = tieredLotteryService.tieredDraw(drawCount, tieredPrizes);
                break;
            default:
                selectedPrize = null;
        }

        if (selectedPrize == null) {
            return null;
        }

        // 使用Lua腳本原子性扣減庫存
        String stockKey = STOCK_KEY_PREFIX + activityId + ":" + selectedPrize.getId();
        Long result = redisTemplate.execute(stockDeductLuaScript, Arrays.asList(stockKey), 1);

        // 返回扣減成功的獎品
        return result != null && result > 0 ? selectedPrize : null;
    }

    /**
     * 記錄用戶參與抽獎信息
     */
    @Transactional
    public void recordLotteryParticipation(Long userId, Long activityId, LotteryPrize prize) {
        LotteryParticipation participation = new LotteryParticipation();
        participation.setUserId(userId);
        participation.setActivityId(activityId);
        participation.setWinner(prize != null ? 1 : 0);
        participation.setPrizeId(prize != null ? prize.getId() : null);
        lotteryParticipationService.save(participation);
    }

    /**
     * 異步更新數據庫庫存
     */
    @Async
    public void asyncUpdateDbStock(Long prizeId, int deductCount) {
        lotteryPrizeService.deductStock(prizeId, deductCount);
    }

    /**
     * 獲取階梯獎品配置
     */
    private Map<Integer, List<LotteryPrize>> getTieredPrizes(Long activityId) {
        // 從Redis緩存或數據庫獲取階梯獎品配置
        String tieredPrizesKey = "lottery:tieredPrizes:" + activityId;
        Map<Integer, List<LotteryPrize>> tieredPrizes =
                (Map<Integer, List<LotteryPrize>>) redisTemplate.opsForValue().get(tieredPrizesKey);

        if (tieredPrizes == null) {
            // 從數據庫加載
            tieredPrizes = lotteryPrizeService.getTieredPrizesByActivityId(activityId);
            // 緩存到Redis,有效期24小時
            if (tieredPrizes != null) {
                redisTemplate.opsForValue().set(tieredPrizesKey, tieredPrizes, 24, TimeUnit.HOURS);
            }
        }

        return tieredPrizes;
    }
}


責任編輯:武曉燕 來源: 一安未來
相關推薦

2010-04-23 14:04:23

Oracle日期操作

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2013-06-08 11:13:00

Android開發XML解析

2010-05-18 11:12:21

2009-02-20 11:43:22

UNIXfish全攻略

2009-12-14 14:32:38

動態路由配置

2009-10-19 15:20:01

家庭綜合布線

2014-03-19 17:22:33

2021-02-06 06:05:51

抖音APP瓜分紅包

2015-03-04 13:53:33

MySQL數據庫優化SQL優化

2022-10-21 11:30:42

用戶生命周期分析

2009-10-12 15:06:59

2009-07-04 11:26:12

unix應急安全攻略

2010-10-11 13:54:03

Windows Ser

2020-12-28 10:50:09

Linux環境變量命令

2009-07-17 17:43:49

Jruby開發Web

2009-02-12 10:12:00

NAT配置

2010-08-25 14:36:02

DHCP服務器

2009-11-10 12:08:15

點贊
收藏

51CTO技術棧公眾號

久久亚州av| 久色国产在线| 青青草成人在线观看| 在线视频日本亚洲性| 另类小说色综合| 黄黄的网站在线观看| 成人午夜av电影| 国产成人91久久精品| 国产美女福利视频| 国产精品流白浆在线观看| 一本到不卡精品视频在线观看| 亚洲自拍的二区三区| 免费国产黄色片| 蜜桃久久久久久久| 国模私拍一区二区三区| 美国黄色特级片| 成人av影音| 欧美日韩一区高清| 国产av天堂无码一区二区三区| 高清中文字幕一区二区三区| 国产成人av电影免费在线观看| 欧洲美女免费图片一区| 欧美日韩三级在线观看| 精品盗摄女厕tp美女嘘嘘| 欧美精品粉嫩高潮一区二区| 国产中文字幕视频在线观看| 中文在线字幕免费观看| 欧美国产激情二区三区 | jizzyou欧美16| 香蕉乱码成人久久天堂爱免费| 亚洲午夜在线观看| 青青草视频免费在线观看| 国产成人啪午夜精品网站男同| 国产精品久久色| 国产精品777777| 亚洲毛片视频| 久久久久久国产精品美女| 亚洲怡红院在线观看| 日韩精品看片| 一区二区国产精品视频| 亚洲精品成人无码| 久久国产精品免费精品3p| 日韩三级视频在线看| 亚洲欧美偷拍另类| 福利视频一区| 欧美日韩一区二区三区高清| 精品久久久噜噜噜噜久久图片| 久草在线资源福利站| 婷婷中文字幕综合| 3d动漫一区二区三区| 2020日本在线视频中文字幕| 夜夜爽夜夜爽精品视频| 欧美一级黄色录像片| 2017亚洲天堂1024| 国产精品女同互慰在线看| 色综合久久久久久久久五月| 国产一区二区影视| 国产三级一区二区三区| 日本最新一区二区三区视频观看| 欧美18xxxxx| 久久久不卡网国产精品一区| 免费在线观看91| 欧美美乳在线| 国产欧美日韩不卡免费| 亚洲精品在线免费| 黄色网址视频在线观看| 亚洲女性喷水在线观看一区| 久久国产精品免费观看| 国内高清免费在线视频| 图片区小说区国产精品视频| aa在线观看视频| 亚洲www免费| 欧美日韩一卡二卡| 久久综合在线观看| 91综合久久爱com| 精品亚洲精品福利线在观看| 亚洲国产无码精品| 精品国产一区二区三区久久久樱花| 尤物99国产成人精品视频| 波兰性xxxxx极品hd| 欧美精品观看| 欧美亚洲免费电影| 波多野结衣在线观看视频| 久久99精品久久久久久动态图| 亚洲综合色av| 人人妻人人澡人人爽久久av| 久久久久久久网| 在线亚洲美日韩| xxx.xxx欧美| 欧美少妇性性性| 少妇熟女视频一区二区三区| 亚洲成a人片77777在线播放 | 久久五月精品中文字幕| 欧美性感美女h网站在线观看免费| 中文字幕天天干| 在线播放一区二区精品视频| 亚洲欧洲在线播放| 国产精品免费人成网站酒店| 亚洲高清久久| 国产女人18毛片水18精品| 蜜臀久久久久久999| 国产亚洲欧洲997久久综合 | 非洲一级黄色片| 牛夜精品久久久久久久99黑人| 欧美诱惑福利视频| av免费观看网址| 国产性做久久久久久| 欧美交换配乱吟粗大25p| 亚洲www.| 亚洲精品理论电影| 黄色片子在线观看| 视频一区免费在线观看| 91亚洲人电影| 高清国产福利在线观看| 亚洲成在人线免费| 伊人五月天婷婷| 国产伦精品一区二区三区千人斩 | 欧美不卡高清一区二区三区| 欧美大胆人体bbbb| 欧美性生交大片| 先锋影音久久| 国产综合av一区二区三区| 久久77777| 欧美色中文字幕| 久久丫精品国产亚洲av不卡| 欧美日韩影院| 成人午夜在线观看| 超碰在线国产| 91久久一区二区| 国产ts丝袜人妖系列视频| 欧美精品播放| 97久久夜色精品国产九色| 精品美女视频在线观看免费软件| 精品成人久久av| 亚洲一级Av无码毛片久久精品| 欧美激情欧美| 国产精品一二三在线| 男人的天堂在线视频| 欧美日韩裸体免费视频| 性一交一黄一片| 欧美一区二区三区久久精品| 91在线免费观看网站| 老司机精品影院| 欧美理论片在线| 国产一区二区三区视频播放| 日本在线不卡一区| 污视频在线免费观看一区二区三区 | 国产精品福利一区二区| 九色porny自拍| 成人精品天堂一区二区三区| 国产精品欧美激情在线播放| 国产对白叫床清晰在线播放| 在线观看国产精品网站| 免费看黄色三级| 麻豆成人91精品二区三区| 亚洲成人第一| 日韩免费在线电影| 插插插亚洲综合网| www黄色网址| 天天操天天干天天综合网| 黄色网址在线视频| 视频在线观看国产精品| 亚洲欧洲精品在线| 精品成人18| 久久久久久噜噜噜久久久精品| 色屁屁草草影院ccyycom| 激情成人中文字幕| 摸摸摸bbb毛毛毛片| 免费欧美在线视频| 国产一二三四区在线观看| 136导航精品福利| 欧美一区二区三区艳史| 超碰在线影院| 日韩亚洲欧美成人一区| 久久草视频在线| 欧美激情一区二区三区全黄| 一道本在线免费视频| 欧美精品三级| 欧美激情第六页| 四虎地址8848精品| 久久久久久噜噜噜久久久精品| 欧美视频综合| 欧美一区日本一区韩国一区| 亚欧洲精品在线视频| 国产欧美一区二区三区沐欲| 99中文字幕在线| 99精品国产99久久久久久福利| 日韩三级电影网站| 视频二区欧美毛片免费观看| 欧美一级淫片丝袜脚交| 日本成a人片在线观看| 亚洲第一页自拍| 中文字幕在线网址| 亚洲成在人线免费| 久久精品一区二区三区四区五区| 床上的激情91.| 日韩大片一区二区| 亚洲激情国产| 国产日本欧美在线| 亚洲美女久久| 国产精品xxxx| 欧洲美女精品免费观看视频 | 色香欲www7777综合网| 久久伊人精品视频| 高清av电影在线观看| 精品国产欧美一区二区| 正在播放亚洲精品| 午夜视频一区在线观看| 九九热视频在线免费观看| av在线综合网| 中文字幕人妻无码系列第三区| 日韩精品电影一区亚洲| 草草视频在线免费观看| 亚洲精品小说| 深夜福利成人| 丝袜av一区| 粉嫩精品一区二区三区在线观看| 欧美爱爱视频| 国产精品久久久av| 一个人看的www视频在线免费观看| 久久国产精品久久久久久| 成人福利在线| 亚洲人a成www在线影院| 午夜成人鲁丝片午夜精品| 欧美一级爆毛片| 91麻豆国产视频| 欧美午夜精品一区二区三区| 亚洲免费在线视频观看| 性感美女极品91精品| 久久久久久久极品内射| 亚洲欧美成aⅴ人在线观看| 美国精品一区二区| 日本一区免费视频| 国产精品无码午夜福利| 97久久人人超碰| 黄色国产在线视频| 成人久久18免费网站麻豆| 亚洲精品久久久久久| 狠狠色丁香久久婷婷综合_中| xxxx一级片| 日韩国产精品久久| 欧美伦理片在线看| 青青青伊人色综合久久| 日本久久久久久久久久久久| 日本美女一区二区三区视频| 日本三区在线观看| 日韩电影在线免费| 最新中文字幕免费视频| 琪琪一区二区三区| 天天综合网久久| 国产综合一区二区| 青娱乐国产精品视频| 国产另类ts人妖一区二区| 成人免费播放视频| 成人深夜福利app| 国产精品一级黄片| 国产日韩欧美在线一区| 亚洲天堂岛国片| 亚洲欧洲精品成人久久奇米网| 国产三级精品三级观看| 亚洲男人电影天堂| 日韩av女优在线观看| 精品毛片三在线观看| 一区二区三区在线观看av| 91国内精品野花午夜精品| 在线观看免费视频一区| 91精品久久久久久久91蜜桃| 超碰人人人人人人| 日韩激情av在线免费观看| 黄色片视频在线观看| 中文字幕亚洲欧美| 在线黄色网页| 国产91|九色| 成人精品国产亚洲| 99爱精品视频| 亚洲va久久久噜噜噜久久| 一区二区三区免费看| 国模吧视频一区| 欧美黄色免费影院| 精品综合久久久久久8888| 亚洲乱妇老熟女爽到高潮的片| 99re热这里只有精品免费视频| 手机看片国产日韩| 一级精品视频在线观看宜春院 | 欧美另类一区二区三区| 亚洲第九十九页| 亚洲视频在线观看| 97影院秋霞午夜在线观看| 5566成人精品视频免费| 四虎国产精品免费久久5151| 久久精品国产99精品国产亚洲性色| 精品一区二区三| 中文字幕人妻熟女人妻洋洋| 首页国产欧美久久| 极品人妻一区二区| 国产女人aaa级久久久级 | 国产免费一区二区三区网站免费| 亚洲欧洲无码一区二区三区| 久久露脸国语精品国产91| 欧美日韩国产乱码电影| 男人天堂网在线视频| 日韩在线视频一区| 国产在线精彩视频| 91中文字幕在线| 精品视频久久| a级黄色一级片| 国产乱码精品一品二品| 欧美a在线播放| 欧美日韩免费观看中文| 精品人妻伦一区二区三区久久| 一本大道亚洲视频| 91九色在线播放| 亚洲最大福利视频网| 精品久久久久久久久久久下田 | 日韩精品999| 美女写真理伦片在线看| 国产v综合v亚洲欧美久久| 国产伦精品一区二区三区在线播放| 一区二区三区四区欧美日韩| 久久久久久黄| 黄色在线观看av| 亚洲.国产.中文慕字在线| 精品国产伦一区二区三| 日韩中文字幕国产精品| 日韩久久一区二区三区| 牛人盗摄一区二区三区视频| 亚洲大片在线| 佐佐木明希电影| 亚洲精品中文字幕在线观看| 在线观看黄色网| 中文字幕日韩欧美精品在线观看| 3d欧美精品动漫xxxx无尽| 久久久久久九九| 一本色道久久精品| 粉嫩av懂色av蜜臀av分享| 亚洲成a天堂v人片| 粉嫩av一区二区夜夜嗨| 欧美国产精品va在线观看| 日韩精品一区国产| 香蕉视频免费版| 国产精品一区免费视频| 无码黑人精品一区二区| 91精品久久久久久久91蜜桃| 成人日批视频| 91传媒视频免费| 欧美亚洲不卡| 香蕉视频污视频| 精品国产91久久久久久老师| 五月婷婷伊人网| 日本精品视频在线观看| 深爱激情综合网| av污在线观看| 国产精品第13页| 国产强被迫伦姧在线观看无码| 欧美成年人网站| 哺乳挤奶一区二区三区免费看| 男人天堂新网址| av不卡免费电影| 日日夜夜狠狠操| 色偷偷噜噜噜亚洲男人的天堂| 久久人人视频| 蜜桃视频一区二区在线观看| 成熟亚洲日本毛茸茸凸凹| 久久免费激情视频| 一个色综合导航| 一区二区三区在线资源| 少妇av一区二区三区无码| 国产日韩精品一区二区三区| 亚洲最大成人av| 欧美激情视频网| 香蕉久久精品日日躁夜夜躁| 亚州精品一二三区| 一区二区三区美女| 欧美91精品久久久久国产性生爱| 国产精品日韩久久久久| 综合视频在线| 黄色在线观看av| 欧美精品aⅴ在线视频| 国产探花在线观看| 日韩欧美第二区在线观看| 国产一区二区视频在线播放| 日韩精品一区二区三区国语自制| 亚洲一品av免费观看| 欧美午夜网站| 蜜臀久久99精品久久久酒店新书| 国产精品国产a| 午夜黄色小视频| 国产精品一区二区三| 在线播放一区| 日韩av网站在线播放| 精品国产第一区二区三区观看体验| 国产精品粉嫩| 高清无码一区二区在线观看吞精| 久久青草欧美一区二区三区| 国产男女猛烈无遮挡| 日本免费一区二区三区视频观看| 欧美一区成人| 欧美一区二区三区观看| 亚洲精品久久久久国产| 亚洲欧洲二区|