精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

9l视频自拍9l视频自拍| 97久久精品人搡人人玩| 婷婷六月天在线| 国产激情视频在线| 成人av免费在线观看| 欧美中文字幕第一页| 亚洲精品国产精品乱码在线观看| 亚洲日本va| 在线视频一区二区三| 中文字幕一区二区三区四区五区人| 丁香六月色婷婷| 日韩和欧美一区二区三区| 欧美成人午夜激情视频| 在线 丝袜 欧美 日韩 制服| 国产精品一区二区精品视频观看 | 91精品欧美一区二区三区综合在| 91免费黄视频| 免费网站看v片在线a| 91在线视频网址| 91热福利电影| 欧美一区二区三区不卡视频| 欧美~级网站不卡| 国产一区二区三区中文| 你懂得在线视频| 蜜桃精品一区二区三区| 欧美性猛交xxxx黑人交| 日本少妇高潮喷水视频| 性爱视频在线播放| 国产精品国模大尺度视频| 欧美日韩精品不卡| 人妻夜夜爽天天爽| 狠狠色丁香久久婷婷综合_中| 青青精品视频播放| 五月天婷婷网站| 在线观看日韩| 日韩中文字幕av| 性の欲びの女javhd| 麻豆一区二区| 亚洲国产福利在线| 黄色激情在线观看| 色妞ww精品视频7777| 91精品国产免费| 日本中文字幕观看| 成人精品国产亚洲| 欧美伊人久久久久久午夜久久久久| 缅甸午夜性猛交xxxx| 超免费在线视频| 亚洲国产精品一区二区www| 亚洲天堂第一区| 2021国产在线| 一区二区三区成人在线视频| 永久免费网站视频在线观看| jizzjizz亚洲| 亚洲精品久久久蜜桃| 国产免费一区二区三区四在线播放| 在线观看免费网站黄| 国产精品免费视频观看| 午夜啪啪免费视频| 国产黄色在线免费观看| 一区二区三区精密机械公司| 日韩 欧美 视频| 国产精品25p| 欧美日韩中文字幕综合视频| 免费黄色福利视频| 欧美www.| 欧美日韩国产123区| 天天摸天天舔天天操| 国产精品18| 精品国产在天天线2019| 亚洲の无码国产の无码步美| 西野翔中文久久精品字幕| 亚洲精品一区二区网址| 一区二区三区久久久久| 久久一本综合| 欧美国产日韩一区二区| 成人午夜视频精品一区| 日本aⅴ亚洲精品中文乱码| 成人精品视频在线| 国产精品久久久午夜夜伦鲁鲁| 国产一区二区影院| 国产三区精品| 阿v免费在线观看| 亚洲欧美一区二区三区孕妇| www.亚洲视频.com| av亚洲一区二区三区| 欧美老人xxxx18| 少妇熟女视频一区二区三区| 国产麻豆精品久久| 久久精品久久久久| 在线观看亚洲欧美| 久久精品国产99国产| 成人黄色片视频网站| 色视频在线看| 亚洲精品免费看| 欧美日韩亚洲第一| 国产视频一区二| 亚洲国产成人一区| 91狠狠综合久久久| 亚洲少妇在线| 91久久精品国产| 亚洲AV成人无码一二三区在线| 国产精品护士白丝一区av| 国产人妻777人伦精品hd| 欧美高清你懂的| 日韩av网站电影| 欧美日韩综合一区二区| 日韩精品乱码免费| 国产区一区二区| 男女啪啪在线观看| 色综合久久88色综合天天6| 久久无码人妻一区二区三区| 精品久久国产| 欧美性受xxxx黑人猛交| 国产99999| 国产精品系列在线| 精品中文字幕av| 亚洲一区二区三区日本久久九| 在线观看亚洲区| 天天干天天干天天| 成人国产精品免费观看| 日本道在线视频| 91成人在线| 亚洲性猛交xxxxwww| 日本免费观看视| 国产传媒日韩欧美成人| 亚洲一区二区三区在线观看视频| 亚洲优女在线| 精品盗摄一区二区三区| 国产精品 欧美激情| 蜜桃av一区二区三区| 欧美亚洲另类在线一区二区三区| 国内激情视频在线观看| 日韩欧美aaaaaa| 成人观看免费视频| 国内久久精品视频| 一区二区三区久久网| 日本欧美一区| 一本色道久久综合亚洲精品小说 | 国产丝袜在线播放| 日韩三区在线观看| 一起操在线播放| 国模大尺度一区二区三区| 亚洲国产高清国产精品| 日本欧美韩国| 在线观看欧美日韩国产| 在线观看国产精品入口男同| 国产欧美日韩中文久久| 一区二区在线播放视频| 欧美一区二区三| 国产精品视频99| 日本福利在线| 欧美一区三区二区| 久久黄色免费视频| 不卡电影一区二区三区| www国产精品内射老熟女| 日本午夜精品久久久| 欧美一区二区.| h视频在线观看免费| 欧美日韩视频一区二区| 日韩在线观看免| 国产精品一区二区在线播放| 国产 欧美 日本| 久久影院资源站| 日韩av色综合| 日本在线免费看| 精品国产一区a| 欧美激情黑白配| 国产欧美精品区一区二区三区| 亚洲黄色av网址| 五月久久久综合一区二区小说| 91国产在线免费观看| 不卡av免费观看| 亚洲人成电影网站色…| 制服丝袜在线一区| 亚洲人成在线播放网站岛国| 国产污在线观看| 久久一区二区三区超碰国产精品| 色姑娘综合网| 一区三区自拍| 日韩av免费看网站| 麻豆传媒视频在线观看| 精品国产不卡一区二区三区| 久久国产精品免费看| 中文字幕高清一区| 国产裸体视频网站| 久久狠狠婷婷| 喜爱夜蒲2在线| 自拍自偷一区二区三区| 成人国产精品久久久久久亚洲| 波多一区二区| 自拍亚洲一区欧美另类| 色香蕉在线视频| 欧美日韩小视频| 日韩在线观看第一页| 亚洲欧美自拍偷拍| av无码一区二区三区| 狠狠色丁香久久婷婷综合_中 | 欧美gv在线| 综合网中文字幕| 日韩在线观看视频一区二区三区| 欧美视频一区在线| 国产精品suv一区二区| 中文字幕第一页久久| 欧美激情一区二区三区p站| 日韩av不卡一区二区| av在线播放天堂| 天天久久综合| 欧美深深色噜噜狠狠yyy| 亚洲国产精品免费视频| 国产精品久久久久久久久久新婚 | av成人在线电影| 国产精品黄色片| 欧美一区二区三区…… | 一本大道久久精品懂色aⅴ| caoporn91| 国产精品视频看| 女人被狂躁c到高潮| 国产福利一区二区三区视频在线| 亚洲成人福利在线观看| 日韩天堂av| a级片一区二区| 国产精品成人一区二区不卡| 日产精品高清视频免费| 偷窥自拍亚洲色图精选| www.久久爱.cn| 欧美a级大片在线| 成人免费午夜电影| 国产精品久久乐| 国产成人一区三区| 成人免费直播| 欧美在线观看网址综合| 丁香高清在线观看完整电影视频| 精品中文字幕乱| 91精品国产91久久久久久青草| 在线视频中文亚洲| 国产福利小视频在线| 亚洲视频第一页| 91video| 电影在线高清| 欧美疯狂party性派对| 国产精品福利在线观看| 人成在线免费网站| 欧美精品久久久久久久| 色呦呦久久久| www.久久撸.com| 91精彩视频在线播放| 国产一区二区激情| eeuss影院在线观看| 在线视频国产日韩| av网站在线播放| 日韩中文字幕在线播放| 国产日本在线视频| 日日骚久久av| 黄色片网站在线观看| 久久久精品日本| 影院在线观看全集免费观看| 欧美激情免费视频| 1024在线看片你懂得| 欧美最近摘花xxxx摘花| 免费亚洲电影| 国产啪精品视频| 精品国产不卡一区二区| 懂色中文一区二区三区在线视频| 一区二区三区在线免费看 | 欧美影院在线| 国产高清精品一区二区| 玖玖玖免费嫩草在线影院一区| 久久久一本精品99久久精品| 欧美日韩在线观看视频小说| 国产又大又长又粗又黄| 欧美午夜精品| 久久免费视频3| 免费成人在线观看| 中文字幕在线视频一区二区| 波多野洁衣一区| 极品人妻videosss人妻| 1000部国产精品成人观看| 久久综合亚洲色hezyo国产| 欧美性色视频在线| 中文字幕乱码视频| 日韩欧美一卡二卡| 亚洲色大成网站www| 在线视频一区二区| av成人影院在线| 国产精品精品视频一区二区三区| 免费一级欧美在线大片| 蜜桃传媒视频麻豆一区| 亚洲精品在线观看91| 波多野结衣之无限发射| 老汉av免费一区二区三区 | 久久精品亚洲乱码伦伦中文| 秋霞欧美一区二区三区视频免费| 亚洲福利一二三区| 亚洲怡红院av| 亚洲国产日韩欧美综合久久| 欧洲美女少妇精品| 91精品国产乱码久久久久久蜜臀 | 精品一区二区三区不卡 | 天海翼亚洲一区二区三区| 综合操久久久| 性欧美暴力猛交另类hd| 国产精品19p| 国产精品女主播在线观看| 永久免费看片在线播放| 91精品国产综合久久久蜜臀粉嫩| 欧美zozo| 久久全球大尺度高清视频| 成人亚洲免费| 欧美一区二区三区四区在线观看地址 | 日韩欧美在线番号| 久久网站热最新地址| 国产黄色录像视频| 五月激情六月综合| 亚洲娇小娇小娇小| 欧美xxxhd| 国产精品精品久久久久久| 久久大胆人体视频| 男人天堂网站在线| 久久99久久久久| 久久精品无码一区| 五月天精品一区二区三区| 国产伦精品一区二区三区免.费| 亚洲欧美另类中文字幕| 爱草tv视频在线观看992| 亚洲xxx大片| 天天综合国产| 国模私拍视频在线观看| 国产视频亚洲色图| 日韩不卡在线播放| 亚洲精品久久久一区二区三区| 91cn在线观看| 91亚洲人电影| 亚洲精品国产偷自在线观看| 91福利国产成人精品播放| 久久久久免费观看| 国产精品suv一区| 亚洲精品久久久久久下一站| 51漫画成人app入口| 国产精品国产一区二区| 欧美精品aa| 激情小说欧美色图| 一区二区理论电影在线观看| 精品人妻久久久久一区二区三区| 久久精品夜夜夜夜夜久久| 高清一区二区中文字幕| 干日本少妇视频| 国产精品18久久久久久vr| 欧美日韩成人免费观看| 日韩欧美一二三| 国产美女一区视频| 精品视频免费观看| 久久99伊人| 国精产品一区一区三区免费视频| 欧美视频在线视频| 精品av中文字幕在线毛片| 国产精品丝袜久久久久久高清| 欧美激情国产在线| 中文字幕55页| 午夜久久电影网| 头脑特工队2免费完整版在线观看 头脑特工队2在线播放 | 日韩欧美国产黄色| 九色蝌蚪在线| 国产日本欧美一区| 欧美精品导航| 中国极品少妇videossexhd| 欧美日韩精品在线播放| 国产特黄在线| 成人亚洲欧美一区二区三区| 97久久夜色精品国产| 奇米777在线| 激情成人在线视频| 国产h视频在线观看| 国产精品亚洲综合天堂夜夜| 欧美精品一级| 国产精品密蕾丝袜| 在线成人av影院| 99色在线观看| 先锋影音亚洲资源| 国产91在线观看| 天天综合天天干| www.久久色.com| 国产成人澳门| 国产v亚洲v天堂无码久久久| 中文字幕一区二区三区蜜月| 国产18精品乱码免费看| 日本国产欧美一区二区三区| 欧美疯狂party性派对| 久久久久久久无码| 在线电影欧美成精品| 中文在线8资源库| 永久域名在线精品| 91香蕉国产在线观看软件| 91久久精品国产91性色69| 久久久久久国产精品美女| 日韩精品91| 强迫凌虐淫辱の牝奴在线观看| 欧美日韩国产小视频| 国产三级电影在线播放| 日本黄色a视频| 久久久亚洲国产美女国产盗摄|