日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Spring Boot使用系統參數表提升系統的靈活性

瀏覽:32日期:2023-02-28 11:44:35
目錄一、使用系統參數表的好處二、系統參數表的表結構三、系統參數表在項目中的使用3.1、Entity類3.2、Dao類3.3、Service類3.4、ServiceImpl類3.5、全局配置服務類3.6、啟動時加載3.7、在服務實現類中訪問系統參數一、使用系統參數表的好處

​​以數據庫表形式存儲的系統參數表比配置文件(.properties文件或.yaml文件)要更靈活,因為無需重啟系統就可以動態更新。

​系統參數表可用于存儲下列數據:

表字段枚舉值,如下列字段:

`question_type` TINYINT(4) NOT NULL DEFAULT 0 COMMENT ’題型,1-單選題,2-多選題,3-問答題’,

​這個字段現在有3種取值,但是難保將來有擴展的可能,如:是非題、計算題、應用題等。

​因此將取值的枚舉值用系統參數表來配置,可以提高系統擴展靈活性。

​另一方面,對于前端而言,就可以通過查詢系統參數表數據,用于UI呈現,而不必硬編碼。如前端需要用下拉框來顯示所有可能的”題型“,這個列表就可以查詢系統參數表來獲取。

​因此可以將所有字段枚舉值納入系統參數表管理。

參數設置,如郵件參數,對接的第三方系統的URL等。

二、系統參數表的表結構

​系統參數表的表結構如下:

DROP TABLE IF EXISTS `sys_parameters`;CREATE TABLE `sys_parameters`( `class_id` INT(11) NOT NULL DEFAULT 0 COMMENT ’參數大類id’, `class_key` VARCHAR(60) NOT NULL DEFAULT ’’ COMMENT ’參數大類key’, `class_name` VARCHAR(60) NOT NULL DEFAULT ’’ COMMENT ’參數大類名稱’, `item_id` INT(11) NOT NULL DEFAULT 0 COMMENT ’參數大類下子項id’, `item_key` VARCHAR(200) NOT NULL DEFAULT ’’ COMMENT ’子項key’, `item_value` VARCHAR(200) NOT NULL DEFAULT ’’ COMMENT ’子項值’, `item_desc` VARCHAR(512) NOT NULL DEFAULT ’’ COMMENT ’子項描述’, -- 記錄操作信息 `login_name` VARCHAR(80) NOT NULL DEFAULT ’’ COMMENT ’操作人賬號’, `delete_flag` TINYINT(4) NOT NULL DEFAULT 0 COMMENT ’記錄刪除標記,1-已刪除’, `create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT ’創建時間’, `update_time` DATETIME DEFAULT NULL ON UPDATE NOW() COMMENT ’更新時間’, PRIMARY KEY (`class_id`, `item_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ’系統參數表’;

​說明:

​class_id字段只要確保一個參數大類(如一個枚舉字段名)使用唯一值。使用class_key和item_key自動,便于提高記錄數據和代碼的可讀性。class_key一般可以取字段名,但如果發生同名時,需要修改,確保不同表的同名字段,使用不同的class_key。對于枚舉值類型,item_key可以取item_id相同的值,只是數據類型不同,此item_key轉換成整型數,就是對應字段的值。

​這個表的數據一般可以由開發人員提供,包括初始或變動的SQL腳本,由DBA執行,項目無需為此開發界面來維護。

​下面是初始腳本示例:

INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (11, ’receive_flag’, ’短信接收標志’, 0, ’0’, ’未接收’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (11, ’receive_flag’, ’短信接收標志’, 1, ’1’, ’已接收’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (11, ’receive_flag’, ’短信接收標志’, 2, ’2’, ’發送失敗’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (12, ’question_type’, ’題型’, 1, ’1’, ’單選題’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (12, ’question_type’, ’題型’, 2, ’2’, ’多選題’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (12, ’question_type’, ’題型’, 3, ’3’, ’問答題’, ’’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (101, ’url_param’, ’URL參數’, 0, ’url_prefix’, ’http://questinvest.abc.com:8880’, ’url前綴部分’);INSERT INTO sys_parameters(class_id, class_key, class_name, item_id, item_key, item_value, item_desc)VALUES (101, ’url_param’, ’URL參數’, 1, ’url_action’, ’/questInvest/show’, ’請求接口方法’);三、系統參數表在項目中的使用

​在Spring Boot項目中,系統參數表一般只需在應用啟動時加載一次,并提供更新接口允許管理員來更新數據。下面詳細說明使用方法。

3.1、Entity類

​先定義系統參數表的實體類,實體類為SysParameter,代碼如下:

package com.abc.questInvest.entity;import javax.persistence.Column;import lombok.Data;/** * @className: SysParameter * @description: 系統參數信息對象類 * */@Datapublic class SysParameter {//參數大類id@Column(name = 'class_id')private Integer classId;//參數大類key@Column(name = 'class_key')private String classKey;//參數大類名稱@Column(name = 'class_name')private String className;//子項id@Column(name = 'item_id')private Integer itemId;//子項key@Column(name = 'item_key')private String itemKey;//子項值@Column(name = 'item_value')private String itemValue;//子項描述@Column(name = 'item_desc')private String itemDesc;//========記錄操作信息================ // 操作人姓名 @Column(name = 'login_name') private String loginName; // 記錄刪除標記,保留 @Column(name = 'delete_flag') private Byte deleteFlag;// 創建時間 @Column(name = 'create_time') private Date createTime; // 更新時間 @Column(name = 'update_time') private Date updateTime;}3.2、Dao類

​數據訪問類為SysParameterDao,代碼如下:

package com.abc.questInvest.dao;import java.util.List;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;import com.abc.questInvest.entity.SysParameter;/** * @className: SysParameterDao * @description: sys_parameters表數據訪問類 * */@Mapperpublic interface SysParameterDao {//查詢所有系統參數,按class_id,item_id排序@Select('SELECT class_id,class_key,class_name,item_id,item_key,item_value,item_desc'+ ' FROM sys_parameters WHERE delete_flag = 0' + ' ORDER BY class_id,item_id') List<SysParameter> selectAll();}

​SysParameterDao類,使用Mybatis,只需提供查詢接口就行了,因為修改在數據庫后臺執行了。當然如果項目方認為有必要提供界面來維護該表,則可增加相應CRUD的接口。

3.3、Service類

​服務接口類為SysParameterService,代碼如下:

package com.abc.questInvest.service;import java.util.List;import com.abc.questInvest.entity.SysParameter;/** * @className: SysParameterService * @description: 系統參數數據服務 * */public interface SysParameterService {/** * * @methodName: loadData * @description: 加載數據庫中數據,允許重復調用 * @return: 成功返回true,否則返回false。 * */public boolean loadData();/** * * @methodName: getParameterClass * @description: 獲取指定classKey的參數類別的子項列表 * @param classKey: 參數類別key * @return: 指定classKey的參數類別的子項列表 * */public List<SysParameter> getParameterClass(String classKey);/** * * @methodName: getParameterItemByKey * @description: 根據classKey和itemKey獲取參數子項 * @param classKey: 參數類別key * @param itemKey: 子項key * @return: SysParameter對象 * */public SysParameter getParameterItemByKey(String classKey,String itemKey);/** * * @methodName: getParameterItemByValue * @description: 根據classKey和itemValue獲取參數子項 * @param classKey: 參數類別key * @param itemValue: 子項值 * @return: SysParameter對象 * */public SysParameter getParameterItemByValue(String classKey,String itemValue);}

​SysParameterService類定義了下列接口方法:

loadData方法,用于初始加載數據和更新數據。 getParameterClass方法,獲取指定classKey的類別的所有子項列表。此方法調用會非常頻繁。 getParameterItemByKey方法,根據classKey和itemKey獲取參數子項,用于根據枚舉值顯示物理含義。此方法調用會非常頻繁。 getParameterItemByValue方法,根據classKey和itemValue獲取參數子項,用于根據物理含義取得枚舉值。此方法調用會非常頻繁。3.4、ServiceImpl類

​服務實現類為SysParameterServiceImpl,代碼如下:

package com.abc.questInvest.service.impl;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.abc.questInvest.dao.SysParameterDao;import com.abc.questInvest.entity.SysParameter;import com.abc.questInvest.service.SysParameterService;import lombok.extern.slf4j.Slf4j;/** * @className: SysParameterServiceImpl * @description: SysParameterService實現類 * @summary: 實現對系統參數的管理 * */@Slf4j@Servicepublic class SysParameterServiceImpl implements SysParameterService{//sys_parameters表數據訪問對象@Autowiredprivate SysParameterDao sysParameterDao;//管理全部的SysParameter表記錄private Map<String,Map<String,SysParameter>> sysParameterMap = new HashMap<String,Map<String,SysParameter>>();/** * * @methodName: loadData * @description: 加載數據庫中數據 * @return: 成功返回true,否則返回false。 * */@Overridepublic boolean loadData() {try{//查詢sys_parameters表,獲取全部數據List<SysParameter> sysParameterList = sysParameterDao.selectAll();synchronized(sysParameterMap) {//先清空map,便于刷新調用sysParameterMap.clear();//將查詢結果放入map對象中,按每個類別組織for(SysParameter item : sysParameterList) {String classKey = item.getClassKey();String itemKey = item.getItemKey();Map<String,SysParameter> sysParameterClassMap = null;if (sysParameterMap.containsKey(classKey)) {//如果存在該類別,則獲取對象sysParameterClassMap = sysParameterMap.get(classKey);}else {//如果不存在該類別,則創建sysParameterClassMap = new HashMap<String,SysParameter>();//加入map中sysParameterMap.put(classKey, sysParameterClassMap);}sysParameterClassMap.put(itemKey,item);}}}catch(Exception e) {log.error(e.getMessage());e.printStackTrace();return false;}return true;}/** * * @methodName: getParameterClass * @description: 獲取指定classKey的參數類別的子項列表 * @param classKey: 參數類別key * @return: 指定classKey的參數類別的子項列表 * */@Overridepublic List<SysParameter> getParameterClass(String classKey){List<SysParameter> sysParameterList = new ArrayList<SysParameter>();//獲取classKey對應的子map,將所有子項加入列表中if (sysParameterMap.containsKey(classKey)) {Map<String,SysParameter> sysParameterClassMap = sysParameterMap.get(classKey);for(SysParameter item : sysParameterClassMap.values()) {sysParameterList.add(item);}}return sysParameterList;}/** * * @methodName: getParameterItemByKey * @description: 根據classKey和itemKey獲取參數子項 * @param classKey: 參數類別key * @param itemKey: 子項key * @return: SysParameter對象 * */@Overridepublic SysParameter getParameterItemByKey(String classKey,String itemKey) {SysParameter sysParameter = null;if (sysParameterMap.containsKey(classKey)) {//如果classKey存在Map<String,SysParameter> sysParameterClassMap = sysParameterMap.get(classKey);if (sysParameterClassMap.containsKey(itemKey)) {//如果itemKey存在sysParameter = sysParameterClassMap.get(itemKey);}}return sysParameter;}/** * * @methodName: getParameterItemByValue * @description: 根據classKey和itemValue獲取參數子項 * @param classKey: 參數類別key * @param itemValue: 子項值 * @return: SysParameter對象 * */@Overridepublic SysParameter getParameterItemByValue(String classKey,String itemValue) {SysParameter sysParameter = null;if (sysParameterMap.containsKey(classKey)) {//如果classKey存在Map<String,SysParameter> sysParameterClassMap = sysParameterMap.get(classKey);//遍歷for (Map.Entry<String,SysParameter> item : sysParameterClassMap.entrySet()) {if(item.getValue().getItemValue().equals(itemValue)) {//如果匹配值sysParameter = item.getValue();break;}}}return sysParameter;}}

​SysParameterServiceImpl類使用了Map<String,Map<String,SysParameter>>類型的屬性變量sysParameterMap來管理全部的系統參數,外層Map管理classKey到Map<String,SysParameter>的映射關系,每一項為一個參數類別,而里層Map<String,SysParameter>,用于管理itemKey與SysParameter之間的映射關系,每一項為該類別下的一個子項。使用sysParameterMap屬性的目的,是將所有系統參數都加載到內存中,從而無需頻繁訪問數據庫。

​loadData方法,用于初始加載數據和更新時刷新數據,為了防止更新時臟讀數據,加了同步鎖。這個方法調用不頻繁。

3.5、全局配置服務類

​全局配置服務類用于管理全局配置參數,包括系統參數、權限樹等。如果只有一種參數,可以不必有此類,因為這樣加了一層殼。

​服務接口類為GlobalConfigService,代碼如下:

package com.abc.questInvest.service;/** * @className: GlobalConfigService * @description: 全局變量管理類 * */public interface GlobalConfigService {/** * * @methodName: loadData * @description: 加載數據 * @return: 成功返回true,否則返回false * */public boolean loadData();//獲取SysParameterService對象public SysParameterService getSysParameterService();//獲取其它配置數據服務對象//public FunctionTreeService getFunctionTreeService();}

​GlobalConfigService提供了下列接口方法:

loadData方法,加載配置對象數據,確定多個配置對象的加載次序。 getSysParameterService方法,獲取系統參數服務類對象。 獲取其它可能的配置服務對象的方法。

​服務實現類為GlobalConfigServiceImpl,代碼如下:

package com.abc.questInvest.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.abc.questInvest.service.FunctionTreeService;import com.abc.questInvest.service.GlobalConfigService;import com.abc.questInvest.service.RoleFuncRightsService;import com.abc.questInvest.service.SysParameterService;import com.abc.questInvest.service.TableCodeConfigService;/** * @className: GlobalConfigServiceImpl * @description: GlobalConfigService實現類 * */@Servicepublic class GlobalConfigServiceImpl implements GlobalConfigService{//系統參數表數據服務對象@Autowiredprivate SysParameterService sysParameterService;//其它配置數據服務對象/** * * @methodName: loadData * @description: 加載數據 * @return: 成功返回true,否則返回false * */@Overridepublic boolean loadData() {boolean bRet = false;//加載sys_parameters表記錄bRet = sysParameterService.loadData();if (!bRet) {return bRet;}//加載其它配置數據return bRet;}//獲取SysParameterService對象@Overridepublic SysParameterService getSysParameterService() {return sysParameterService;}//獲取其它配置數據服務對象方法}3.6、啟動時加載

​全局配置服務類在應用啟動時加載到Spring容器中,這樣可實現共享,減少對數據庫的訪問壓力。

​實現一個ApplicationListener類,代碼如下:

package com.abc.questInvest;import javax.servlet.ServletContext;import org.springframework.context.ApplicationListener;import org.springframework.context.event.ContextRefreshedEvent;import org.springframework.stereotype.Component;import org.springframework.web.context.WebApplicationContext;import com.abc.questInvest.service.GlobalConfigService;/** * @className: ApplicationStartup * @description: 應用偵聽器 * */@Componentpublic class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent>{ //全局變量管理對象,此處不能自動注入 private GlobalConfigService globalConfigService = null;@Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {try {if(contextRefreshedEvent.getApplicationContext().getParent() == null){ //root application context 沒有parent.System.out.println('========定義全局變量==================');// 將 ApplicationContext 轉化為 WebApplicationContext WebApplicationContext webApplicationContext = (WebApplicationContext)contextRefreshedEvent.getApplicationContext(); // 從 webApplicationContext 中獲取 servletContext ServletContext servletContext = webApplicationContext.getServletContext();//加載全局變量管理對象 globalConfigService = (GlobalConfigService)webApplicationContext.getBean(GlobalConfigService.class); //加載數據 boolean bRet = globalConfigService.loadData(); if (false == bRet) { System.out.println('加載全局變量失敗'); return; } //====================================================================== // servletContext設置值 servletContext.setAttribute('GLOBAL_CONFIG_SERVICE', globalConfigService); } } catch (Exception e) {e.printStackTrace(); } }}

​注意,globalConfigService不能自動注入,否則得到空指針。通過下列代碼來加載bean。

//加載全局變量管理對象globalConfigService = (GlobalConfigService)webApplicationContext.getBean(GlobalConfigService.class);

​代碼中,將globalConfigService對象作為全局變量加入ServletContext中,就可以實現共享了。

​在啟動類中,加入該應用偵聽器ApplicationStartup。

public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(QuestInvestApplication.class); springApplication.addListeners(new ApplicationStartup()); springApplication.run(args); }3.7、在服務實現類中訪問系統參數

​HttpServletRequest類型對象request在控制器方法中可以獲取,可作為參數傳入服務實現類的方法中。下面是服務實現類訪問系統參數的示例代碼:

//獲取ServletContext對象ServletContext servletContext = request.getServletContext();//獲取全部數據服務對象GlobalConfigService globalConfigService = (GlobalConfigService)servletContext.getAttribute('GLOBAL_CONFIG_SERVICE');//獲取系統參數url_prefix的值String url_prefix = '';SysParameter sysParameter = null;sysParameter = globalConfigService.getSysParameterService().getParameterItemByKey('url_param', 'url_prefix');if (sysParameter != null) { url_prefix = sysParameter.getItemValue();}

以上就是詳解Spring Boot使用系統參數表提升系統的靈活性的詳細內容,更多關于Spring Boot使用系統參數表提升系統的靈活性的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久中文字幕二区| 香蕉久久久久久久av网站| 人人爽香蕉精品| 色偷偷色偷偷色偷偷在线视频| 国产精品麻豆成人av电影艾秋| 日韩成人在线看| 日本在线成人| 欧美日韩午夜电影网| 国产精品调教| 精品资源在线| 国产成人精品一区二区三区视频| 精品久久电影| 色网在线免费观看| 色88888久久久久久影院| 久久久国产精品一区二区中文| 欧美日韩视频网站| 久久亚洲精品中文字幕蜜潮电影| 欧美日韩中文字幕一区二区三区| 亚洲一级少妇| 久久国产小视频| 尹人成人综合网| 亚洲人成亚洲精品| 日本不卡视频在线| 国产精选一区| 久久99精品久久久野外观看| 精品少妇av| 韩国三级一区| 国产精品嫩草99av在线| 中文字幕一区二区三区日韩精品| 日韩高清电影免费| 另类欧美日韩国产在线| 精品国产免费人成网站| 狠狠久久婷婷| 男人的天堂久久精品| 日韩精品视频在线看| 国产精品亚洲人成在99www| 精品久久美女| 天堂资源在线亚洲| 日韩精品一级中文字幕精品视频免费观看| 亚洲精品高潮| 国产一区二区精品福利地址| 在线日韩av| 亚洲欧美在线专区| 欧美精品成人| 欧美另类综合| 国产欧美日韩一级| av亚洲一区二区三区| 免费日韩精品中文字幕视频在线| 日韩欧美中文字幕一区二区三区| 国产精品免费99久久久| 麻豆精品蜜桃| 日韩有吗在线观看| 在线看片福利| 视频一区欧美日韩| 国产中文欧美日韩在线| 亚洲精品一区二区在线看| 日本不卡视频一二三区| 日产精品一区二区| 国产农村妇女精品一二区| 国产精品红桃| 狠狠爱成人网| 美女精品久久| 亚洲资源av| 欧美91在线| 99riav国产精品| 精品免费av| 男女性色大片免费观看一区二区| 毛片不卡一区二区| 日本 国产 欧美色综合| 不卡福利视频| 欧美日韩亚洲一区三区| 亚洲精品1区2区| 麻豆精品在线播放| 免费成人在线观看| 久久久一本精品| 国产日韩欧美三区| 国产午夜精品一区二区三区欧美| 精品一区二区三区的国产在线观看| 午夜久久黄色| 欧美丰满日韩| 日本不卡一区二区三区| 在线观看免费一区二区| 久久中文欧美| 亚洲精品伊人| 免费观看久久av| 久久这里只有精品一区二区| 日韩激情视频网站| 香蕉成人久久| 欧美成人午夜| 成人在线网站| 国产一区二区三区四区五区 | 久久97久久97精品免视看秋霞| 欧美在线综合| 蜜桃国内精品久久久久软件9| 精品视频免费| 国产精品任我爽爆在线播放| 亚洲日本欧美| 视频一区二区三区入口| 蜜桃视频欧美| 三级精品视频| 欧美国产美女| 国产一区二区三区久久久久久久久| 日韩精品国产欧美| 最新国产精品视频| 免费人成网站在线观看欧美高清| 亚洲激情久久| 久久免费大视频| 亚洲一区资源| 九九99久久精品在免费线bt| 7777精品| 亚洲综合小说| 夜夜嗨一区二区三区| 欧美性感美女一区二区 | 国产精品99一区二区三区| 亚洲麻豆一区| 综合一区二区三区| 国产综合婷婷| 国产高清久久| 久久电影tv| 美女网站视频一区| 精品无人区麻豆乱码久久久| 欧美国产日本| 青草国产精品| 欧美一级久久| 亚洲香蕉久久| 国产亚洲一区二区三区不卡| 免费不卡在线观看| 亚洲精品欧洲| 性色一区二区| 蜜臀久久久99精品久久久久久| 1024精品久久久久久久久| 91精品推荐| 久久久9色精品国产一区二区三区| 中文字幕在线高清| 精品免费在线| 福利一区二区三区视频在线观看| 国产日韩欧美在线播放不卡| 你懂的国产精品永久在线| 国产视频网站一区二区三区| 国产精品免费大片| 国产精品美女午夜爽爽| 国产一区二区三区日韩精品| 国产激情一区| 黄毛片在线观看| 精品久久亚洲| 久久久久久免费视频| 国产 日韩 欧美一区| 亚洲成人精选| 女人av一区| 日韩在线卡一卡二| 老鸭窝毛片一区二区三区| 日本免费在线视频不卡一不卡二| 亚洲乱码久久| 捆绑调教美女网站视频一区| 国产精品亚洲综合久久| 91亚洲成人| 午夜影院一区| 久久成人国产| 亚洲欧美网站在线观看| 久久三级毛片| av免费不卡国产观看| av不卡在线看| 亚洲免费资源| 精品精品国产三级a∨在线| 吉吉日韩欧美| 在线一区欧美| 亚洲日本久久| 国产伦久视频在线观看| 亚洲夜间福利| 欧美日韩一区二区三区四区在线观看| 国产毛片一区二区三区| 日韩黄色大片| 午夜精品免费| 国产精品igao视频网网址不卡日韩 | 久久精品99国产国产精| 日韩三级一区| 亚洲女同av| 欧美~级网站不卡| 欧美日本精品| 91日韩免费| 亚洲精品无播放器在线播放| 91精品国产自产精品男人的天堂| 国产在线视频欧美一区| 亚洲天堂成人| 欧美日韩va| 日韩成人免费| 蜜桃一区二区三区在线| 免费国产亚洲视频| 红杏一区二区三区| 亚洲一区欧美激情| 亚洲精品美女| 久久久9色精品国产一区二区三区| 欧美精品一二| 欧美激情aⅴ一区二区三区 | 妖精视频成人观看www| 首页亚洲欧美制服丝腿| 日韩中文在线电影| 久久精品青草| 蜜臀av一区二区在线免费观看| 久久狠狠久久|