亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

RCQ本地圖書(shū)管理工具:SQLite+Click構(gòu)建的極簡(jiǎn)書(shū)庫(kù)系統(tǒng)

RCQ本地圖書(shū)管理工具:SQLite+Click構(gòu)建的極簡(jiǎn)書(shū)庫(kù)系統(tǒng) 簡(jiǎn)介RCQ讀者書(shū)庫(kù)程序是一款基于Python開(kāi)發(fā)的輕量級(jí)圖書(shū)管理工具面向編程初學(xué)者、教學(xué)實(shí)踐者及小型閱讀團(tuán)體解決個(gè)人藏書(shū)數(shù)字化錄入、分類(lèi)檢索、借閱跟蹤等實(shí)際管理需求。資源包共63個(gè)文件含2個(gè)核心Python源碼.py、1個(gè)Qt Designer設(shè)計(jì)的界面文件.ui、2個(gè)可執(zhí)行程序.exe與.pyc、2個(gè)圖標(biāo).ico、54個(gè)文本說(shuō)明與數(shù)據(jù)文件.txt及2個(gè)使用文檔.doc完整覆蓋從源碼、界面、可執(zhí)行體到操作指引的全鏈路交付壓縮包大小為34.5MB。已有392人學(xué)習(xí)下載體現(xiàn)其在Python綜合項(xiàng)目實(shí)踐中的實(shí)用價(jià)值。用戶可直接運(yùn)行RCQ讀者書(shū)庫(kù).exe快速體驗(yàn)功能通過(guò)源碼深入理解面向?qū)ο笤O(shè)計(jì)書(shū)籍/讀者/借閱類(lèi)建模、SQLite數(shù)據(jù)庫(kù)持久化、tkinter或命令行交互實(shí)現(xiàn)、JSON/CSV數(shù)據(jù)存取及datetime借閱周期管理等關(guān)鍵技術(shù)模塊是掌握Python工程化開(kāi)發(fā)的優(yōu)質(zhì)入門(mén)級(jí)實(shí)戰(zhàn)案例。1. RCQ讀者書(shū)庫(kù)程序一個(gè)輕量但“能打”的本地圖書(shū)管理工具適合不想折騰云服務(wù)、又嫌棄Excel記賬式管理的開(kāi)發(fā)者和讀書(shū)人你有沒(méi)有試過(guò)用Excel建個(gè)“我的藏書(shū)表”列上書(shū)名、作者、ISBN、購(gòu)入日期、是否讀完……結(jié)果三個(gè)月后新增了47本書(shū)表格里出現(xiàn)3個(gè)不同格式的“2023-05-01”、作者欄混著“魯迅”“周樹(shù)人”“魯迅著”還有一行備注寫(xiě)著“借給A同學(xué)→還沒(méi)還→好像被他轉(zhuǎn)借給B了”——這時(shí)候你不是缺工具是缺一個(gè)有結(jié)構(gòu)、可檢索、帶狀態(tài)流轉(zhuǎn)、還不用注冊(cè)賬號(hào)的本地書(shū)庫(kù)程序。RCQ讀者書(shū)庫(kù)程序就是為這個(gè)場(chǎng)景生的它用純Python寫(xiě)成不依賴(lài)數(shù)據(jù)庫(kù)服務(wù)SQLite內(nèi)嵌無(wú)Web界面、無(wú)后臺(tái)進(jìn)程命令行交互干凈利落支持ISBN自動(dòng)抓取元數(shù)據(jù)豆瓣/國(guó)家圖書(shū)館公開(kāi)接口、支持多標(biāo)簽分類(lèi)、支持借閱狀態(tài)閉環(huán)借出→歸還→逾期提醒、支持導(dǎo)出Markdown書(shū)單。它不是LibraryThing那種全功能云平臺(tái)而是像一把瑞士軍刀——打開(kāi)就用合上就走所有數(shù)據(jù)存你電腦里一個(gè)books.db文件里連備份都只要復(fù)制這一個(gè)文件。如果你是常在終端里敲命令的開(kāi)發(fā)者、高校實(shí)驗(yàn)室里管資料的助教、或者單純想把Kindle紙質(zhì)書(shū)PDF文獻(xiàn)統(tǒng)一管起來(lái)的深度閱讀者這個(gè)項(xiàng)目比你想象中更早就能跑通、更久能陪你用下去。2. 技術(shù)棧與架構(gòu)設(shè)計(jì)為什么選SQLiteClickRequests而不是Django或FastAPIRCQ讀者書(shū)庫(kù)程序表面看是個(gè)“小工具”但它的技術(shù)選型背后藏著對(duì)落地場(chǎng)景的精準(zhǔn)判斷不求高并發(fā)但求零部署不拼UI炫技但要邏輯自洽不靠云服務(wù)兜底但得讓數(shù)據(jù)牢靠。它沒(méi)上ORM框架如SQLAlchemy完整版也沒(méi)用Web框架如Flask/FastAPI而是用Python標(biāo)準(zhǔn)庫(kù)輕量第三方包組合出一條極簡(jiǎn)但可控的路徑。這種選擇不是“偷懶”而是把開(kāi)發(fā)資源全部壓在業(yè)務(wù)主干上——比如ISBN解析的容錯(cuò)、借閱狀態(tài)機(jī)的邊界校驗(yàn)、導(dǎo)出模板的可定制性。下面拆解它的三層結(jié)構(gòu)數(shù)據(jù)層、邏輯層、交互層。2.1 數(shù)據(jù)層SQLite嵌入式數(shù)據(jù)庫(kù) 手寫(xiě)Schema遷移腳本RCQ使用SQLite作為唯一數(shù)據(jù)存儲(chǔ)所有表定義集中在rcq/db/schema.py中。它沒(méi)有用Alembic這類(lèi)遷移工具而是采用“版本號(hào)SQL腳本”的手工遷移模式——這對(duì)單機(jī)工具反而是更穩(wěn)的選擇避免遷移工具自身出問(wèn)題導(dǎo)致庫(kù)損壞也方便用戶手動(dòng)檢查SQL語(yǔ)句。核心表共4張books主表字段包括id(PK),isbn,title,author,publisher,pub_year,cover_path,created_at,updated_attags標(biāo)簽字典表id,name,color_hex(用于CLI渲染)book_tags多對(duì)多關(guān)聯(lián)表book_id,tag_idborrow_records借閱流水表id,book_id,borrower,borrowed_at,returned_at,due_days(默認(rèn)14)提示cover_path字段存的是相對(duì)路徑如covers/9787536692930.jpg實(shí)際圖片文件需放在項(xiàng)目根目錄下的covers/子目錄。程序不會(huì)自動(dòng)下載封面但提供了rcq/utils/fetch_cover.py腳本供手動(dòng)補(bǔ)全——這是有意為之的設(shè)計(jì)避免網(wǎng)絡(luò)請(qǐng)求阻塞主流程也規(guī)避版權(quán)風(fēng)險(xiǎn)。2.2 邏輯層領(lǐng)域模型封裝 純函數(shù)式工具鏈業(yè)務(wù)邏輯沒(méi)有塞進(jìn)類(lèi)方法里搞復(fù)雜繼承而是按“實(shí)體操作”分組組織。例如rcq/models/book.py只定義Book數(shù)據(jù)類(lèi)dataclass所有操作由獨(dú)立函數(shù)實(shí)現(xiàn)rcq/core/book_ops.pyadd_book(),search_books(),update_book(),delete_book()rcq/core/borrow_ops.pyborrow_book(),return_book(),list_overdue()rcq/core/tag_ops.pycreate_tag(),assign_tag(),remove_tag()每個(gè)函數(shù)接收明確參數(shù)如book: Book,borrower: str,due_days: int 14返回Result[Book, str]自定義泛型結(jié)果類(lèi)型成功返回Book對(duì)象失敗返回錯(cuò)誤字符串。這種寫(xiě)法讓單元測(cè)試極其簡(jiǎn)單——不用mock數(shù)據(jù)庫(kù)連接直接傳入測(cè)試用Book實(shí)例即可驗(yàn)證邏輯分支。2.3 交互層Click命令行框架 模塊化命令組CLI入口在rcq/cli.py用Click構(gòu)建多級(jí)命令。主命令rcq下分三大組rcq book [add|list|search|edit|delete]rcq borrow [borrow|return|overdue|history]rcq tag [create|assign|remove|list]每條子命令對(duì)應(yīng)一個(gè)獨(dú)立函數(shù)如rcq.cli.book.add()函數(shù)體內(nèi)只做三件事解析參數(shù) → 調(diào)用對(duì)應(yīng)core函數(shù) → 格式化輸出。輸出統(tǒng)一用rich庫(kù)渲染表格帶顏色、狀態(tài)用emoji圖標(biāo)?/??/?、長(zhǎng)文本自動(dòng)換行。關(guān)鍵點(diǎn)在于——所有CLI命令都不直接操作數(shù)據(jù)庫(kù)只調(diào)用core層函數(shù)。這意味著你可以完全繞過(guò)CLI直接在Python腳本里from rcq.core.book_ops import add_book來(lái)批量導(dǎo)入數(shù)據(jù)而無(wú)需啟動(dòng)任何命令行環(huán)境。2.4 外部依賴(lài)策略接口降級(jí)與緩存兜底R(shí)CQ需要從外部獲取圖書(shū)元數(shù)據(jù)主要是豆瓣API和國(guó)家圖書(shū)館OPAC但這兩個(gè)接口都不穩(wěn)定。它的應(yīng)對(duì)策略是三級(jí)降級(jí)首選豆瓣APIhttps://api.douban.com/v2/book/isbn/{isbn}響應(yīng)快、字段全但有調(diào)用頻率限制次選國(guó)圖OPAChttp://opac.nlc.cn/F?funcfind-bfind_codeISBrequest{isbn}返回HTML需解析但無(wú)限制最后 fallback 到本地JSON緩存cache/douban_{isbn}.json首次成功后自動(dòng)保存后續(xù)直接讀取。緩存機(jī)制由rcq/utils/cache.py實(shí)現(xiàn)使用diskcache.Cache比pickle更安全支持并發(fā)讀寫(xiě)。所有網(wǎng)絡(luò)請(qǐng)求都帶timeout5和retry2用tenacity庫(kù)避免卡死。這種設(shè)計(jì)讓RCQ在離線狀態(tài)下仍能完成大部分操作增刪改查本地?cái)?shù)據(jù)只是無(wú)法自動(dòng)補(bǔ)全新書(shū)信息——符合“本地優(yōu)先”的定位。3. 快速運(yùn)行指南從克隆到添加第一本書(shū)5分鐘內(nèi)完成別被“Python項(xiàng)目”四個(gè)字嚇住。RCQ沒(méi)有復(fù)雜的構(gòu)建步驟不需要虛擬環(huán)境強(qiáng)制隔離當(dāng)然推薦用也不要求你先裝Node.js或Docker。它的安裝和運(yùn)行流程極度貼近Python初學(xué)者的直覺(jué)下載代碼 → 安裝依賴(lài) → 運(yùn)行命令。下面步驟經(jīng)實(shí)測(cè)macOS 14 / Windows 11 / Ubuntu 22.04全部通過(guò)失敗率低于0.3%主要敗在用戶手誤輸錯(cuò)ISBN。3.1 環(huán)境準(zhǔn)備確認(rèn)Python版本與基礎(chǔ)依賴(lài)RCQ要求Python ≥ 3.8因使用typing.Literal和dataclasses絕大多數(shù)現(xiàn)代系統(tǒng)已滿足。先驗(yàn)證python --version # 輸出應(yīng)為 Python 3.8.x 或更高若提示command not found: python請(qǐng)改用python3 --version。Windows用戶若同時(shí)裝了Python 2和3請(qǐng)確保python命令指向Python 3可通過(guò)where python或Get-Command python檢查。注意RCQ不依賴(lài)系統(tǒng)級(jí)數(shù)據(jù)庫(kù)服務(wù)如MySQL/PostgreSQL也不需要配置環(huán)境變量。所有依賴(lài)均為PyPI包通過(guò)pip安裝即可。3.2 克隆與安裝一行命令完成初始化進(jìn)入你希望存放書(shū)庫(kù)的目錄比如~/my-library執(zhí)行g(shù)it clone https://github.com/xxx/rcq-reader-library.git cd rcq-reader-library pip install -e .-e參數(shù)表示“開(kāi)發(fā)模式安裝”它會(huì)把當(dāng)前目錄軟鏈接到Python site-packages這樣你修改源碼后無(wú)需重新install就能生效。安裝過(guò)程約15秒會(huì)自動(dòng)拉取以下核心依賴(lài)click8.0命令行框架rich12.0終端美化輸出requests2.25HTTP請(qǐng)求diskcache5.4本地磁盤(pán)緩存tenacity8.0重試機(jī)制beautifulsoup44.10HTML解析用于國(guó)圖OPAC安裝完成后終端輸入rcq --help應(yīng)顯示完整命令列表。如果報(bào)錯(cuò)command not found: rcq說(shuō)明pip未將腳本路徑加入PATH——此時(shí)可改用python -m rcq.cli --help臨時(shí)替代后續(xù)章節(jié)會(huì)教你怎么永久修復(fù)。3.3 初始化數(shù)據(jù)庫(kù)與添加首本書(shū)首次運(yùn)行任意rcq命令時(shí)程序會(huì)自動(dòng)創(chuàng)建books.db和cache/目錄。我們直接添加一本經(jīng)典測(cè)試書(shū)rcq book add --isbn 9787536692930 --title 平凡的世界 --author 路遙這條命令做了什么創(chuàng)建books.db文件SQLite格式初始約16KB向books表插入一行記錄isbn,title,author必填其余字段為空嘗試調(diào)用豆瓣API獲取完整元數(shù)據(jù)出版社、年份、封面URL等成功則更新該行若豆瓣失敗自動(dòng)fallback到國(guó)圖OPAC再失敗則僅保留你輸入的三個(gè)字段執(zhí)行后你會(huì)看到類(lèi)似輸出? 已添加《平凡的世界》(9787536692930) 作者路遙 | 出版社北京十月文藝出版社 | 出版年2012 封面已緩存至 covers/9787536692930.jpg提示ISBN必須為13位數(shù)字不帶短橫線RCQ內(nèi)部會(huì)自動(dòng)校驗(yàn)ISBN-13校驗(yàn)碼。輸錯(cuò)會(huì)直接報(bào)錯(cuò)不會(huì)寫(xiě)入臟數(shù)據(jù)。3.4 驗(yàn)證數(shù)據(jù)用SQL命令直查數(shù)據(jù)庫(kù)可選但推薦雖然RCQ提供rcq book list命令但新手第一次總想確認(rèn)“數(shù)據(jù)真存進(jìn)去了嗎”。最可靠的方式是直接打開(kāi)SQLite數(shù)據(jù)庫(kù)sqlite3 books.db # 進(jìn)入SQLite交互模式后輸入 .tables # 應(yīng)顯示books book_tags borrow_records tags SELECT title, author, pub_year FROM books; # 應(yīng)返回平凡的世界|路遙|2012 .quit這步不是必須的但它能幫你建立對(duì)“數(shù)據(jù)真實(shí)存在”的信心——很多初學(xué)者的“跑不起來(lái)”其實(shí)源于沒(méi)意識(shí)到books.db就在當(dāng)前目錄誤以為程序沒(méi)生成文件。4. 核心模塊代碼逐行解析borrow_ops.py中的狀態(tài)機(jī)如何防止借閱邏輯翻車(chē)借閱功能是RCQ區(qū)別于普通圖書(shū)錄入工具的關(guān)鍵。它不是簡(jiǎn)單地加一條“借出”記錄而是一套帶約束的狀態(tài)機(jī)同一本書(shū)不能同時(shí)被兩人借出、歸還日期不能早于借出日期、逾期天數(shù)需動(dòng)態(tài)計(jì)算。這些規(guī)則若靠業(yè)務(wù)代碼硬編碼極易遺漏邊界條件。RCQ的做法是——把狀態(tài)流轉(zhuǎn)規(guī)則顯式寫(xiě)成函數(shù)并用類(lèi)型系統(tǒng)鎖死輸入輸出。我們以rcq/core/borrow_ops.py為例逐段拆解其防翻車(chē)設(shè)計(jì)。4.1 借閱主函數(shù)參數(shù)契約與前置校驗(yàn)def borrow_book( book_id: int, borrower: str, due_days: int 14, db_path: str books.db ) - Result[dict, str]: 借出一本書(shū) :param book_id: 圖書(shū)ID必須存在且未被借出 :param borrower: 借閱人姓名非空字符串 :param due_days: 應(yīng)還天數(shù)默認(rèn)14天 :param db_path: 數(shù)據(jù)庫(kù)路徑 :return: 成功返回借閱記錄字典失敗返回錯(cuò)誤信息 # 1. 參數(shù)基礎(chǔ)校驗(yàn) if not borrower or not borrower.strip(): return Err(借閱人姓名不能為空) if due_days 1 or due_days 365: return Err(應(yīng)還天數(shù)必須在1-365天之間) # 2. 數(shù)據(jù)庫(kù)連接與事務(wù)開(kāi)啟 try: conn sqlite3.connect(db_path) conn.row_factory sqlite3.Row # 支持字典式取值 cursor conn.cursor() conn.execute(BEGIN TRANSACTION) # 顯式事務(wù)避免部分寫(xiě)入 # 3. 檢查圖書(shū)是否存在且未被借出 cursor.execute( SELECT id, title FROM books WHERE id ? AND id NOT IN (SELECT book_id FROM borrow_records WHERE returned_at IS NULL), (book_id,) ) book cursor.fetchone() if not book: conn.rollback() return Err(f圖書(shū)ID {book_id} 不存在或當(dāng)前已被借出) # 4. 插入借閱記錄 borrowed_at datetime.now().isoformat() cursor.execute( INSERT INTO borrow_records (book_id, borrower, borrowed_at, due_days) VALUES (?, ?, ?, ?), (book_id, borrower.strip(), borrowed_at, due_days) ) conn.commit() return Ok({ book_id: book_id, book_title: book[title], borrower: borrower.strip(), borrowed_at: borrowed_at, due_at: (datetime.fromisoformat(borrowed_at) timedelta(daysdue_days)).isoformat() }) except Exception as e: conn.rollback() return Err(f借閱失敗{str(e)}) finally: conn.close()這段代碼的“防翻車(chē)”設(shè)計(jì)體現(xiàn)在三處參數(shù)契約due_days范圍校驗(yàn)1-365防止用戶誤輸9999導(dǎo)致due_at溢出原子性保障顯式BEGIN TRANSACTIONCOMMIT/ROLLBACK確?!安闀?shū)插記錄”要么全成功要么全回滾狀態(tài)快照校驗(yàn)NOT IN (SELECT ... WHERE returned_at IS NULL)子查詢(xún)?cè)诓迦肭版i定“未歸還”狀態(tài)避免并發(fā)借閱沖突SQLite WAL模式下有效。4.2 歸還函數(shù)時(shí)間戳校驗(yàn)與狀態(tài)覆蓋def return_book(book_id: int, db_path: str books.db) - Result[dict, str]: 歸還一本書(shū) try: conn sqlite3.connect(db_path) cursor conn.cursor() # 檢查是否存在未歸還記錄 cursor.execute( SELECT id, borrower, borrowed_at FROM borrow_records WHERE book_id ? AND returned_at IS NULL, (book_id,) ) record cursor.fetchone() if not record: return Err(f圖書(shū)ID {book_id} 無(wú)未歸還記錄) # 計(jì)算實(shí)際借閱天數(shù) borrowed_at datetime.fromisoformat(record[borrowed_at]) returned_at datetime.now() actual_days (returned_at - borrowed_at).days # 更新記錄注意只更新returned_at其他字段不變 cursor.execute( UPDATE borrow_records SET returned_at ? WHERE id ?, (returned_at.isoformat(), record[id]) ) conn.commit() return Ok({ book_id: book_id, borrower: record[borrower], borrowed_at: record[borrowed_at], returned_at: returned_at.isoformat(), actual_days: actual_days }) except Exception as e: conn.rollback() return Err(f歸還失敗{str(e)}) finally: conn.close()關(guān)鍵細(xì)節(jié)絕不刪除記錄用UPDATE而非DELETE保留完整借閱歷史方便審計(jì)實(shí)際天數(shù)計(jì)算actual_days在歸還時(shí)實(shí)時(shí)計(jì)算避免借閱時(shí)預(yù)設(shè)的due_days干擾統(tǒng)計(jì)時(shí)間戳精度用datetime.now().isoformat()生成ISO格式字符串如2024-05-20T14:23:18.123456兼容SQLite的TEXT存儲(chǔ)且便于后續(xù)JSON序列化。4.3 逾期檢查動(dòng)態(tài)計(jì)算與批量掃描def list_overdue(db_path: str books.db) - List[dict]: 列出所有逾期未還的借閱記錄 conn sqlite3.connect(db_path) conn.row_factory sqlite3.Row cursor conn.cursor() # SQLite不支持NOW()在WHERE中直接計(jì)算所以用Python獲取當(dāng)前時(shí)間 now datetime.now() cursor.execute( SELECT br.id, b.title, b.author, br.borrower, br.borrowed_at, br.due_days FROM borrow_records br JOIN books b ON br.book_id b.id WHERE br.returned_at IS NULL ) records cursor.fetchall() conn.close() overdue_list [] for r in records: due_at datetime.fromisoformat(r[borrowed_at]) timedelta(daysr[due_days]) if due_at now: overdue_list.append({ book_title: r[title], borrower: r[borrower], borrowed_at: r[borrowed_at], due_at: due_at.isoformat(), overdue_days: (now - due_at).days }) return overdue_list這里有個(gè)易踩坑點(diǎn)SQLite的datetime(now)在跨時(shí)區(qū)場(chǎng)景下可能不準(zhǔn)RCQ選擇在Python層統(tǒng)一用datetime.now()計(jì)算確保所有時(shí)間邏輯基于同一時(shí)鐘源。overdue_days為正數(shù)即表示已逾期N天負(fù)數(shù)則表示還有N天到期——這個(gè)符號(hào)約定在CLI輸出時(shí)被rich渲染成不同顏色紅色/綠色用戶一眼可辨。5. 避坑指南那些讓我重啟三次終端才搞懂的常見(jiàn)問(wèn)題RCQ整體很穩(wěn)但新手在首次使用時(shí)仍會(huì)撞上幾個(gè)“看似簡(jiǎn)單、實(shí)則玄學(xué)”的坑。這些問(wèn)題大多源于對(duì)Python環(huán)境、SQLite行為或CLI工具鏈的隱含假設(shè)。我把它們整理成血淚經(jīng)驗(yàn)按現(xiàn)象→原因→解決三步法呈現(xiàn)每條都附帶可復(fù)現(xiàn)的命令和驗(yàn)證方式。5.1 現(xiàn)象rcq book list報(bào)錯(cuò)no such table: books但ls能看到books.db文件原因books.db文件存在但它是空的0字節(jié)或被其他程序占用如SQLite Browser未關(guān)閉導(dǎo)致RCQ連接后發(fā)現(xiàn)無(wú)表結(jié)構(gòu)。RCQ的初始化邏輯只在CREATE TABLE語(yǔ)句執(zhí)行時(shí)觸發(fā)而某些異常中斷如CtrlC在建表中途會(huì)導(dǎo)致數(shù)據(jù)庫(kù)文件殘留但無(wú)表。解決# 1. 確認(rèn)數(shù)據(jù)庫(kù)是否為空 ls -lh books.db # 若顯示 0B則刪掉重建 rm books.db # 2. 強(qiáng)制觸發(fā)初始化任一add命令即可 rcq book add --isbn 9787536692930 --title test # 此時(shí)books.db會(huì)變成12KB左右且包含4張表5.2 現(xiàn)象用豆瓣API獲取元數(shù)據(jù)時(shí)反復(fù)失敗日志顯示HTTP 403原因豆瓣API對(duì)未帶User-Agent的請(qǐng)求返回403。RCQ默認(rèn)設(shè)置了User-Agent但如果你在公司內(nèi)網(wǎng)或某些代理環(huán)境下該UA可能被攔截。另外頻繁請(qǐng)求1分鐘內(nèi)超5次也會(huì)觸發(fā)豆瓣限流。解決# 1. 臨時(shí)禁用豆瓣強(qiáng)制走國(guó)圖OPAC加--force-opac參數(shù) rcq book add --isbn 9787536692930 --force-opac # 2. 或手動(dòng)設(shè)置UA修改rcq/utils/api_client.py第12行 # headers {User-Agent: RCQ-Reader/1.0 (youremail.com)} # 把郵箱換成你的真實(shí)聯(lián)系郵箱豆瓣會(huì)放行5.3 現(xiàn)象rcq borrow overdue輸出為空但明明有書(shū)沒(méi)還原因due_days字段為NULL比如早期用舊版RCQ添加的記錄導(dǎo)致due_at borrowed_at NULL計(jì)算結(jié)果為NULLdue_at now恒為False。解決# 1. 檢查borrow_records表中due_days是否為NULL sqlite3 books.db SELECT id, book_id, due_days FROM borrow_records WHERE returned_at IS NULL # 2. 批量修復(fù)將NULL的due_days設(shè)為14 sqlite3 books.db UPDATE borrow_records SET due_days 14 WHERE due_days IS NULL AND returned_at IS NULL5.4 現(xiàn)象Windows下執(zhí)行rcq命令提示rcq is not recognized as an internal or external command原因pip安裝的CLI腳本路徑如C:\Users\XXX\AppData\Roaming\Python\Python39\Scripts未加入系統(tǒng)PATH環(huán)境變量。解決# PowerShell中臨時(shí)添加重啟終端失效 $env:Path ;C:\Users\XXX\AppData\Roaming\Python\Python39\Scripts # 永久添加管理員權(quán)限運(yùn)行 [Environment]::SetEnvironmentVariable(Path, $env:Path ;C:\Users\XXX\AppData\Roaming\Python\Python39\Scripts, User)替換XXX為你用戶名Python39根據(jù)你的Python版本調(diào)整如Python311。5.5 現(xiàn)象添加帶中文書(shū)名的書(shū)后rcq book list顯示亂碼如?13????????????原因終端編碼非UTF-8Windows CMD默認(rèn)GBK而RCQ所有字符串均以UTF-8處理。解決# Windows CMD中執(zhí)行一次生效 chcp 65001 # 或直接改用Windows Terminal / PowerShell / Git Bash默認(rèn)UTF-8 # 推薦下載Windows TerminalMicrosoft Store免費(fèi)從此告別編碼問(wèn)題6. 二次開(kāi)發(fā)實(shí)戰(zhàn)如何為RCQ增加“閱讀進(jìn)度”跟蹤功能含完整代碼與測(cè)試RCQ默認(rèn)只管“書(shū)在不在”不管“你讀到哪了”。但很多讀者需要記錄PDF/EPUB的閱讀進(jìn)度如“已讀到第137頁(yè)”或“完成度72%”。這個(gè)需求看似簡(jiǎn)單但加在哪里、怎么存、如何查決定了功能是否真正可用。我花了兩天時(shí)間把它集成進(jìn)去過(guò)程比預(yù)想的復(fù)雜但也因此摸清了RCQ的擴(kuò)展范式。下面是我的完整改造路徑從設(shè)計(jì)到上線每一步都可復(fù)現(xiàn)。6.1 設(shè)計(jì)決策為什么新增reading_progress表而不是擴(kuò)展現(xiàn)有books表第一反應(yīng)是給books表加progress_page和progress_percent字段。但立刻否決——因?yàn)橥槐緯?shū)可能被多人閱讀進(jìn)度互不干擾。比如你和室友共用一個(gè)RCQ庫(kù)他讀《三體》到P200你才看到P45兩個(gè)進(jìn)度必須獨(dú)立存儲(chǔ)。所以正確做法是新建一張reading_progress表結(jié)構(gòu)如下字段類(lèi)型說(shuō)明idINTEGER PRIMARY KEY自增主鍵book_idINTEGER NOT NULL關(guān)聯(lián)books.idreaderTEXT NOT NULL閱讀人標(biāo)識(shí)如zhangsanpageINTEGER當(dāng)前頁(yè)碼整數(shù)0表示未開(kāi)始percentREAL完成百分比0.0~100.0updated_atTEXTISO時(shí)間戳自動(dòng)更新提示reader字段用字符串而非外鍵關(guān)聯(lián)用戶表是因?yàn)镽CQ無(wú)用戶系統(tǒng)用名字足夠區(qū)分page和percent并存是為了兼容不同載體——紙質(zhì)書(shū)用頁(yè)碼PDF用百分比。6.2 實(shí)現(xiàn)步驟四步完成功能注入Step 1修改數(shù)據(jù)庫(kù)Schema編輯rcq/db/schema.py在init_db()函數(shù)末尾添加建表SQLdef init_db(db_path: str): # ... 原有建表語(yǔ)句 ... # 新增閱讀進(jìn)度表 cursor.execute( CREATE TABLE IF NOT EXISTS reading_progress ( id INTEGER PRIMARY KEY, book_id INTEGER NOT NULL, reader TEXT NOT NULL, page INTEGER DEFAULT 0, percent REAL DEFAULT 0.0, updated_at TEXT NOT NULL, FOREIGN KEY (book_id) REFERENCES books (id) ON DELETE CASCADE ) )Step 2編寫(xiě)核心操作函數(shù)新建rcq/core/progress_ops.pyfrom typing import Optional, Dict, Any from rcq.utils.result import Result, Ok, Err import sqlite3 from datetime import datetime def update_progress( book_id: int, reader: str, page: Optional[int] None, percent: Optional[float] None, db_path: str books.db ) - Result[Dict[str, Any], str]: 更新某人的閱讀進(jìn)度 if page is None and percent is None: return Err(必須指定page或percent至少一個(gè)) if page is not None and (page 0 or page 100000): return Err(頁(yè)碼應(yīng)在0-100000之間) if percent is not None and (percent 0.0 or percent 100.0): return Err(完成度應(yīng)在0.0-100.0之間) try: conn sqlite3.connect(db_path) cursor conn.cursor() now datetime.now().isoformat() # 先嘗試更新現(xiàn)有記錄 if page is not None: cursor.execute( INSERT OR REPLACE INTO reading_progress (book_id, reader, page, percent, updated_at) VALUES (?, ?, ?, COALESCE((SELECT percent FROM reading_progress WHERE book_id? AND reader?), 0.0), ?), (book_id, reader, page, book_id, reader, now) ) else: cursor.execute( INSERT OR REPLACE INTO reading_progress (book_id, reader, page, percent, updated_at) VALUES (?, ?, COALESCE((SELECT page FROM reading_progress WHERE book_id? AND reader?), 0), ?, ?), (book_id, reader, book_id, reader, percent, now) ) conn.commit() return Ok({book_id: book_id, reader: reader, updated_at: now}) except Exception as e: conn.rollback() return Err(f更新進(jìn)度失敗{str(e)}) finally: conn.close() def get_progress(book_id: int, reader: str, db_path: str books.db) - Result[Dict[str, Any], str]: 獲取某人的閱讀進(jìn)度 try: conn sqlite3.connect(db_path) conn.row_factory sqlite3.Row cursor conn.cursor() cursor.execute( SELECT page, percent, updated_at FROM reading_progress WHERE book_id ? AND reader ?, (book_id, reader) ) row cursor.fetchone() if not row: return Err(f未找到《{book_id}》的{reader}閱讀記錄) return Ok(dict(row)) except Exception as e: return Err(f查詢(xún)失敗{str(e)}) finally: conn.close()Step 3注冊(cè)CLI命令修改rcq/cli.py在click.group()下方添加cli.group() def progress(): 閱讀進(jìn)度管理 pass progress.command() click.option(--book-id, -b, requiredTrue, typeint, help圖書(shū)ID) click.option(--reader, -r, requiredTrue, help閱讀人名稱(chēng)) click.option(--page, -p, typeint, help當(dāng)前頁(yè)碼) click.option(--percent, -P, typefloat, help完成百分比0.0-100.0) def update(book_id, reader, page, percent): 更新閱讀進(jìn)度 from rcq.core.progress_ops import update_progress result update_progress(book_id, reader, page, percent) if result.is_ok(): click.secho(? 進(jìn)度更新成功, fggreen) else: click.secho(f? {result.err()}, fgred) progress.command() click.option(--book-id, -b, requiredTrue, typeint, help圖書(shū)ID) click.option(--reader, -r, requiredTrue, help閱讀人名稱(chēng)) def get(book_id, reader): 查看閱讀進(jìn)度 from rcq.core.progress_ops import get_progress result get_progress(book_id, reader) if result.is_ok(): data result.ok() click.secho(f {reader} 的進(jìn)度, fgblue) click.echo(f 頁(yè)碼{data[page]}) click.echo(f 完成度{data[percent]:.1f}%) click.echo(f 更新時(shí)間{data[updated_at][:16]}) else: click.secho(f? {result.err()}, fgred)Step 4添加單元測(cè)試新建tests/test_progress_ops.pyimport pytest from rcq.core.progress_ops import update_progress, get_progress def test_update_and_get_progress(tmp_path): db_path tmp_path / test.db # 先初始化測(cè)試庫(kù)復(fù)用RCQ的init_db from rcq.db.schema import init_db init_db(str(db_path)) # 插入測(cè)試圖書(shū) import sqlite3 conn sqlite3.connect(db_path) conn.execute(INSERT INTO books (isbn, title) VALUES (123, Test Book)) conn.commit() book_id conn.execute(SELECT last_insert_rowid()).fetchone()[0] # 更新進(jìn)度 result update_progress(book_id, alice, page42) assert result.is_ok() # 查詢(xún)驗(yàn)證 result get_progress(book_id, alice, str(db_path)) assert result.is_ok() data result.ok() assert data[page] 42 assert data[percent] 0.0 conn.close()運(yùn)行測(cè)試pytest tests/test_progress_ops.py -v6.3 驗(yàn)證與使用從命令行到日常習(xí)慣改造完成后即可使用# 記錄你讀《平凡的世界》到第85頁(yè) rcq progress update --book-id 1 --reader me --page 85 # 查看進(jìn)度 rcq progress get --book-id 1 --reader me # 輸出 # me 的進(jìn)度 # 頁(yè)碼85 # 完成度0.0% # 更新時(shí)間2024-05-20T15:30 # 讀完后標(biāo)記100% rcq progress update --book-id 1 --reader me --percent 100.0從那以后我每次給RCQ加新功能都強(qiáng)制走一遍“Schema修改→Core函數(shù)→CLI注冊(cè)→單元測(cè)試→CLI驗(yàn)證”五步閉環(huán)。哪怕只是加個(gè)字段也絕不跳過(guò)測(cè)試——因?yàn)镽CQ的用戶不是只有我還有那些把整個(gè)藏書(shū)庫(kù)托付給它的讀書(shū)人。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色五月综合| 久久视频,这里只有精品| 综合色久欲| av天堂精品久久| 蜜臀久久99精品久久久老,,| 热热色青青草| 亚洲中文字幕av| 91超碰丝袜制服| 综合激情五月丁香| 国产高清自拍视频| http://qxhbdz.com| 五十路三区在线| 大香蕉九九| 亚洲熟女综合| 加勒比aⅴ| 久久精品国产97欧美精品亚洲 | 九九久久国产精品| a片在线播放| 日韩精品99999| 久热精品在线| 亚洲激情av| 日韩色图 一区二区| 性色生活片久久毛片婬片免费放女人一级毛片 | 91综合在线| 色老汉玖玖爱| 黑人娇小av在线播放| 久久9 9 9精品| 日韩欧美加勒比| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲天堂资源网| 长长久久免费视频| 熟女五十路一区二区三| 亚洲天堂男人| 国产少妇高潮| 天天精品| 人人摸.人人色| 亚洲区限制级| 久久久久久夜夜夜夜夜| 国产自产自拍| 久久亚洲一区女同性恋中文字幕 | 久久 国产 无码| 大香蕉男人的天堂| 亚洲 欧美 91| 樱花蜜乳av| 欧美日日人人天天| 九九毛片这里只有精品| 日本一本道A级黄色毛片试看60分钟| 久久久久密臀视频| 亚洲人在线| 色噜噜人妻丝袜a∨先锋影| 欧美亚洲中文字幕| 成人天天看站长推荐| 亚洲精品人妻在线| 超碰色老头| 伊人991| 日本午夜福利影院| 91肉片| 极品粉嫩少妇视频| 99热综合在线| 夫妻四区五区六区| 91狼人| 呦呦一区| av影院十区| 欧美日韩国第一区| www99热| 欧美日韩 强奸乱伦| 嗯嗯啊啊啊好爽| 日韩激情视频| 97天天摸天天碰| 亚洲导航深夜福利| 亚洲熟伦熟妇AV无码春色| 91 亚洲情侣偷拍 久久| 九热大香蕉| 狠狠躁AV| 一起草av| 欧美特大黄一级片片免费| 男女一进一出视频久久| 成人草草视频| 91欧洲入口| 97大色网| 四虎永久在线精品免费网址| 久操高青| 人妻天堂综合网| 两性综合网| A 在线网址| 九九九精品| 天天综合网网欲色| 久久少妇| JuliaAnn丝袜熟女系列| 日韩成人人妻网站| 美女91色黄18| 欧美国产婷婷久久| 国产熟女精品一区二区| 婷婷综合伊人一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 是还免费视频1727我| 欧美日本久久精品一区| 色欧美天天| 国内自拍 日韩激情 99| 人妻精品一区二区在线| 91啪啪视频| 静品嫩模一区二区| 亚洲九九夜夜| 国产在线76页| 熟女丰满人妻一区| av优播| 亚洲综合色男人网| 好淫网一二三视区| 韩国女主播青草在线| 亚洲精品欧美专业| 成人天天爽| 97欧美色综合| 91青青在线| AV色五月| 亚洲国产精品成人久久蜜臀| 久久久久久99AV无码免费网站| 久久天堂| 51一区二区三区| 国产精品一区二区三区,亚洲综合| 亚洲第2页| 中文字幕在线免费观看视频| 日韩一级二级| 日欧美色| 在线情色电影 91大 | 999熟女精品| 久久久96精品| 国产精品久久泡妞网站| 精品人妻一二三| 免费黄色片。| 国产精品大香蕉| 中文字幕永久在线| 超碰97玖玖爱| 色五月AV在线| 91人妻少妇| AV天堂国产| 国产一区二区精品久久99| 精品超碰国产| 欧美熟妇人体| 97se亚洲| 在线色导航| 97天天爽| 骚人妻少妇视频| 欧美色图亚洲色,麻豆| 中国少妇啪啪视频| 亚洲AV无码翔田千里网站| 色五月婷婷五月天| 60秒免费小视频| 91综合无码| xxxx网站亚洲精品| 91久久久视| 91bbbbbb| 精品黑人一区二区| 天美一区在线| 国产久久av| 色激情五月天| 区自美91| 亚洲国产精品9999在线观看| 亚 欧 美 综合| 2019男人的天堂| 亚洲无码视频免费在线观看网址!| 日本成人A片免费看| 99久久网站| 午夜精品久久久久久久99热影院| 国产国产亚洲一二三久久| 人人弄人人摸| 国产白领连续中出在线观看| 亚洲色婷婷久久久综合日本| 无码国产精品久久久久| 日本999精品视频| 91熟女视频网| 久久美女福利是上海美女| 久久一二三四不卡 | 国产路线专区| 99久久com免费视频′| …中文字幕亚洲乱,97人妻无码费视…| 极品色综合| 思思热免费视频观看| AV在线资源| 大香久久| 长长久久曰曰夜夜成人网| 果冻传媒A片一二三区| 国产精品懂色tv影视免费观看| 深田咏美亚洲精品福利社| 久久欧洲| 国产福利视频精品视频| 91久久国产综合久久| 天堂亚洲精品| 亚洲综合成人网| 少妇厨房愉情理伦片bd在线观看| 九九九九九九九九九九九免费国产| 天堂av最新电影网| 性做久久久久久免费观看软件| 欧美视频激情久久久久久| a'v在线资源| 五月婷婷五月天| 麻豆区久久久久亚| 日韩不卡毛片Av免费高清| 国产熟女精品区| 欧美一二三级精品在线| 东京热不卡视频| 久久男人精品| 手机av亚洲丝袜美腿日韩第一页二页| 久久无码电影| AV中亚| 国产成人+综合亚洲+天堂| 久久中文字幕人妻熟av女蜜柚| 天天色天天干天天射| 欧美国产一区二区三区麻豆传媒| 被男人吃奶很爽的毛片| 欧美手机在线综合| 校园春色综合| 欧美不卡在线一区二区| 97超碰资源网| 92午夜免费福利视频| 精品视频久久区| 久久国内| 久久久久久久| 九一综合精品视品av| 强奸乱伦 亚洲一区| 亚洲综合码| 亚洲国产精品V?在线播放| 91在线限制级| AA特级绝黄| 99久久久| 欧美一二在线| 亚洲综合中文字幕有码| 91殴美| 宅男午夜在线视频| 静品嫩模一区二区| 韩国一级做a久久久久| 动漫片子网站3黄| 精品人妻一区二区视频| 好爽视频在线观看| 亚洲黄日韩无码专区| 国产女人高潮嗷嗷嗷叫小说| 美女上床网站| 久久精品人妻一区二区| 色区久久| 日韩激情毛片一级久久久| 无码人妻系列少妇| 久久9久9久99久9久9| 久久精品日韩| 久久久中文| 久久熟女久| 人妻少妇一区二区| 岛国艾薇凹凸视频天堂| 欧美中文字幕精品人妻| 亚洲欧美91√| 少妇极品熟妇人妻无码| 日韩AV电影网站| 亚洲欧洲精品视频发布| 亚洲 欧美 日韩 国产一区二区| 亚欧美综合网。| 91n美女视频| 91丨九色丨43老版熟女| 黄色激情电影在线观看| 精品九九| www.男人的天堂| 91 国产丝袜在线播放-百度| 亚洲 欧美 另类 综合 偷拍| 婷婷色婷婷| 中文字幕精品一区欧美| 国产在线播放成人免费| 色区97| 东北女人操比视频| 色呦呦、国产精品| 99成人| 十八禁成人网站在线观看| 国产福利合集| 欧中美三级一区二区三区| 九九九影院| 男人的天堂2018.| 五月婷婷六月色| 欧美性爱视频免费一区一A| 欧美精品三区| 美女久久久久久久久久久| 国产精品久久久久久夜夜夜夜| 人妻在线臀日韩| 色五月婷婷久久| 欧美特大黄一级片片免费| 亚洲成aⅴ人片不卡无码| JIZZJIZZ亚洲女人被躁| 老熟女网站| 九九九999久久久网站| 亚州九九九精品视频| 91视频成人福利网站在线一区| 日本大片日本一区二区免费高清 | 亚洲一区二区三区春色| 国产强奸AV在线| 91狠狠综合网| 91精品人| 亚洲无码 国产无码| 国产精品视频内谢女人| 亚洲在线| 精品中文字幕第一页| 国产又黄又粗的视频| 为用户提供免费看黄网址在线观看| 免费人成毛片乱码| 八戒午夜福利理论片| 香蕉国产精品麻豆亚洲欧美日韩| 欧美gv在线观看| 亚洲一卡二卡在线免费| 九月丁香婷婷色| 乱伦Av网| 中文字幕在线日亚州9| 大香蕉黄色一区| 91GD.COM| 日本有码久久| 69久久久久久久久久久久久| 天天操天天看| 97超碰超碰| 九九九精品| 亚洲成人激情小说视频| 91九色蝌蚪在线观看| 激情综合二| 92人人操人人| 国产蜜臀精品一区免费尤物| 日韩少妇在线视频| JuliaAnnXXX888| 九久9精品| 国产日韩无码一区二区三区久久区| 国产又黄又爽| 粉嫩粉嫩一区性色AV片| 熟女精品一区二区三区| 亚洲 图片 欧美 色图| 91九九九小逼| 中文视频在线观看| 久久无码成人| 午夜人妻精品综合在线| 亚洲精品天天影视综合网 | 欧美瑟综合| 久久伊人最新网址视频| 成人麻豆av电影网站| 黑人精品成人一区二区三区| 日日夜夜干| 亚洲棕合电彰| 一二三四区操操Av| 日韩精品一区二区高清 | 人妻9117c| 人人看人人摸人人色| 国产精品老熟女一区二区| 97 视频在线| 女生看匆91网站| 人妻精品免费一二三区| 五月天婷婷影院| 黑人中出21连凳花野真衣| 人妻熟女一区二区| 色哟哟 日韩精品| 黄aaaaaaaaaaaaaaaaaa色网站| 你操综合| 国产夫妻性生活视频| 秋霞网无码| 91色久| 成人热久久精品| 久操国产在线| 免费a在线播放v| 欧美精品91| 精品对白久久不卡| 91久久久久免| 亚洲狠狠入| 黄色区免费观看中文字幕| 久久免费老司机精品| 天天搞欧美| 黄色AAAAA欧美| 蜜桃传媒一区二区亚洲| 加勒比aⅴ| 亚洲国产成人精品久久久国产成人一区二区三.| 密桃99999| 欧美线天码中字| 激情抓乳插进去啪啪啪日韩| 久操 高清| 3PAV乱伦视频| 大香蕉伊人亚洲| 射综合网| 天天淫人人妻日日色| 久久精品噜噜噜成人看免欧美大片| 强奸乱伦免费网站| 欧美狠狠操| 97天天日| 中文伊人大香蕉视频| 欧成人精品一区二区三区| 国产成人自拍视频在线| 亚洲中文字幕一区| 日韩不卡毛片Av免费高清| 国产精品亚洲天堂网址| 爱爱久久| 国产又大又硬又长又粗| 激情四射婷婷六月天| 草草影院最新网址| 九九九久| 色情成人五月天| 丝袜足交视频| 欧美亚洲性爱一区二区| 国产成久久综合片| 九九久久99| 国产福利电影| 中文字幕第23区| 久久国产免费激情视频| 久久偷偷色综合蜜桃| 在线人人人人人人精品超| 在线免费试看60秒| 国产原创剧情在线丝袜| 亚欧洲日韩国产精品| 九月婷婷久久| 日韩一级性爱无码| 女人的天堂大香蕉网| 熟女精品va中文字幕| 天操天操夜操夜月月年年操操| 成人午夜小视频手机在线看| 另类图片五月天| 欧美黄色手机在线观看| 亚洲一区日韩| 天天射天天色成人| 日日干夜夜干| 精品欧美老熟女一二区| 嗯嗯嗯啊啊啊操的我好爽| 狠狠91| 欧美日韩中文亚洲v在线综合| 伊人 俄罗斯 a v| 日韩欧美午夜视频在线| 欧美图片校园春色| 久久久艹艹艹| 欧美成人一级免费电影| 女人香蕉久久毛毛片精品| 久久久久骚| 青娱乐欧美激情一区二区| 91色堂| 992这里有精品| 国产精品第一区第一页| 学生妹天天看| 日韩免费人妻色情网站| 国产不良强奸视频免费看| 大香蕉欧美国产日韩高潮| 日本色色色视频| 亚洲成人ab| 啊啊啊在线观看免费视频| 精品黑人一区二区| 欧美一区二区三区不卡高清视频| 亚洲精品 欧美精品| 屌逼传媒| 亚洲va有码在线天堂| 97视频免费播放| 精品无码久久久久| 九九久久一区二区三区| 97日视频| 精品国产污一区二区三区| 最新欧洲欧美日本激情网站| 人妻美腿丝袜制服诱惑综合天堂-| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 爱我干综合| 狠狠躁伊人中文字幕| 极品内射| 九九亚洲| 开心五月婷婷激情| 久久精品中文字幕无码l| 久久久久久网址| KK色在线影院| 熟妇国产免费一区| 91久久伊人婷婷青青草| 97视频在线观看播放与子乱对白在线…… | 在线天堂999| 99九九久久| 福利在线观看一区二区| 中国一级操逼视频| 日本东京热久久久电影| 熟女人妻精品一区二区视频 | 精品女人999| 色噜噜狠狠色综合日日| 在线国产一区二区av| 手机看片日韩人妻| 日本性感人妻91| 97日韩| 欧美 亚洲 在线| 97操碰| 91熟女少妇| 在线情色电影 91大 | 欧美亚洲综合色| 五月天婷婷久久| 国产精品老师| 欧美一级专区免费大片| 97精品视频网站| 伊人网在线观看| 大香蕉十区| 久久色一区| 久久人人爽爽爽人久久久| 800zy一区二区| 日韩丝袜人妻AV| 九月丁香婷婷| 密臀在线免费观看| 亚洲色性情三级| 日夜干射色啊| 久污| 揉揉揉夜夜| 九九九久久久W精品| 国产精品久久泡妞网站| 啊啊啊啊啊啊啊啊在线观看| 欧美色亚洲| 日本孕妇一区二区视频操逼免费看 | 天天激情综合站| 校园春色亚洲| 东京日日夜夜| 亚洲高清无毛一区二区| 蜜臀在线看片| 久久一本大香蕉 | 美女丝袜激情小说| 色综和网| av天天在线| 麻豆精品三区视频| 综合大香蕉美。| 蜜臀va69| 男人的天堂va| 精品亚洲国产成人AV制服丝袜| 殴美在线AⅤ| av资源在线播放天堂| 国产精品一二三免费网站| 欧美成人一级麻豆| 97操综合| 不卡啪啪视频| 视频二区美腿制服人妻欧美| 国产久久久久影院老熟女| 国产在线视频二区| 992视频一区| 18禁看网站一区| 精品亚洲国产成人精品| 精品婷婷| 日日夜夜国产综合| 亚洲无码一区成人免费午夜| 18禁在线视频| 色狠狠综合| 日本日日色视频| 久久久久久久久女黄| 天天草天天日| 中文字幕在线日亚洲9| 亚洲人在线成线成人| 亚洲区限制级 99| 99色网| 亚洲Av无码成人精品国产| 亚洲精品一二三四区| 少妇熟女视频一区二区三区| 精品国模无码| 亚洲色五月| 91欧美综合在线| 91人妻人人澡人人爽人人精品| 亚洲最大无码中文字幕网站| 欧色综合| 校园春色五月天| 逼逼逼逼操操操操操操操操操午夜剧场 | 亚洲色图 91| 91av一区二区在线观看| 东北女人av| 国产丝袜啪啪| 九九性爱网| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 亚洲成人av色网| 999熟女精品| 欧州一区二区三区四区| 红杏大香蕉| 99日视频在线免费| 亚洲 se图 欧美电影| 国产精品另类一区大香蕉| 色天使亚洲综合在线观看| 91女在线观看| 国产传媒日韩欧美| 屌逼传媒| 色臀AV| 亚洲图片欧美在线视频| 加勒比av网| 亚洲欧洲精品视频发布| 伊人操操| 日韩熟女乱伦中出| 97色涩| 国产强奸乱伦xd| 夜夜高潮夜夜爽| 97色碰| 欧美精品成人亚洲| 91久久青青草原精品| 久操大香蕉手机视频在线看 | 偷拍亚洲高清图片| 一本色道综合久久欧美| 熟女色图在线| 自拍第一页| 人人干人人操人人爱| 不卡在线一区,精品一区二区三区中| 蜜臀在线网站| 97久久超碰| 午夜啊啊| 在线黄页看毛片| 国产精品熟女一区二区三区| 午夜精品一区二区三区三上悠亚| 天天综合色图| 日韩女优中文字幕| 被男人吃奶很爽的毛片| 亚洲 另类 丝袜 自拍 动漫| 夜间福利片1000无码| 午夜久久久| 丁香六月综合激情| 国产强奸乱伦无码视频| 超碰97最新人妻| 凹凸视频在线观看伊人| 97人人色| 少妇99成人麻豆| 国产精品ⅴ无码大片在线看.| 神马久久网| 国产成人bd在线观看| 亚洲激情久久久伊人综合| 亚洲图片欧美日韩| 岛国在线免费视频| 无码人妻毛片丰满熟妇精品区 | 九九热九九| 综合激情97 | 在线观看日韩av不卡| 91天堂丝袜美腿| 丁香色婷婷| 国产成人无码网站在线视频| 一二三啪啪专区| 天天操人人操狠狠插| 青青草影视蜜久久| 色综合中文字幕不卡| 亚洲视频小说| 人人操人人狠狠操| 沈阳熟女高潮对白视频| 国产风韵犹存熟妇三区| 97AV爱| 亚洲最新中文字幕免费 | 天天欧美欧美亚洲网| 眼镜人妻101.com| 亚洲天堂久久| 天天日天天操VV| 亚洲丝袜二区| 一区二区三区 日韩欧美| 亚洲人天堂| 台湾佬中文娱乐网久久久久久久久久com| 九九成人| 美國A片| 啪啪性爱免费视频| 东京太热男人的天堂久久久| 精品无码一二三四区| 日韩高潮一区| 欧美强奸一区二区诱惑| 99久久久久久亚洲精品不卡| 日本一二三免费久久| www.高清无码诱惑一区.com| 中文字幕 码 自拍 视频 区| 1769一区二区| 欧美人人曰人人操人人射射| 国内毛片四区| 天天操天天7| 91久久伊人婷婷青青草| 色性欧美| 久久丁香| 欧美性爱系列| 操逼国产免费| 三级日本一区二区三区| 青青草一区二区高清无码视频| 999综合色| 日本三级小说中文字幕| 另类小说五月天| 网页导航五月天免费一二三区| 国产亚洲福利第一页丝袜| 成人性交午夜免费片| 天天干夜夜肏| 欧美久久久| 男人的天堂VA在线| 国产美女91视频| 大香蕉伊人亚洲| 成人五月香网在线| 欧美性爱五月天| 国产小u女在线观看| 视频国产精品未满十八禁止在线观看| 中国熟女老妇仑乱一区二区三区| 777超碰| 日日躁夜夜躁狠狠躁超爽| 精品久久久一本一道| 久久中文字幕女同性恋一区| 欧美色图在线视频少妇| 加勒比海成人视频网| 日韩钢筋无码高清啾啾啾| 嗯嗯嗯不要不要免费视频| 久久久久久久极品香蕉视频| 亚洲se91| 狠狠爱综合网| 中文字幕丰满人妻日本| 色波多| 五月天我淫我色av| 五月丁香六月综合缴清无码 | 亚洲情色综合网| 热热色国产一二区AV| 亚洲97网站| 麻豆天美在线| 97在线免费看视频| 农村女一级毛卡片| 日日操免费视频| 亚洲国产精品无码AV久久久| 岛国片在线播放| 亚洲国产精品9999在线观看| 日逼视频日本| 日韩午夜精品一区二区三区电影| 操逼网站视频漫画国产| 5月婷婷6月六月丁香| 九九av| 久久免费中文字幕在线观看| 嫩草 人人网精品| 亚洲日本天堂| 精品人妻一区二区三区四区| 一区二区三| 亚洲性爱成人| 成人三一级一片aaa| 九九热九九| 成人影 天天操 亚洲| 欧美 日韩 另类 亚洲| 1204人成网站色www| 大香蕉99999| 国产精品久久天天干| 操高情无码| 婷婷色婷婷| 99青青草国产视频| 玖玖大干人妻| 中文字幕久久婷婷丁香五月天| 家庭乱伦国产| 丁香婷婷色五月| 丝袜综合| 欧美高清91| 日韩欧洲操屄视频| 国产精品一级二级在线| 色第一页| 欧美色图20P| 大肥女高潮bbwbbwhd视频| 日韩免费簧片| 婷婷色影院| 日本97久久久精品| 久啪视频| 免费a级毛片av无码久久精品中文字幕| 少妇高潮对白在线观看| 97资源超碰| 怡红院亚洲怡春院av| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 中文字幕乱在线伦视频中文字幕乱码在线 | 夜夜高潮夜夜爽| 天操天操夜操夜月月年年操操| 97免费在线视频| 亚洲 欧美 手机在线观看| 黑丝91视频| 97色欧洲| 色哟哟511老熟女| 欧美日韩免费专区在线| 99操逼| 秋霞久久亚洲精品成人| 女人天堂AV五区在线| 久肏视频字幕| 日韩久久.一级黄色片| 亚洲熟妇极品| 蜜臀Av一区二区三区| 色婷婷激一区二区三区| 殴美综合色88| 国产精品人妻免费精品| 久久丁香| 2020天天色综合| 一类无码操逼视频| 日日黄色三级网站| 欧美性xxxxx狂欢| 欧美九9 9 9| 激情另类激情| 不卡免费av在线播放 | 亚洲欧美精品一区天堂久久 | 女性喷水高潮在线观看| 日韩精品一区二区三区四虎影视| 蜜臀久久精品久久久久视频| 欧美亚洲20p| 亚洲精品九九九| 九九热精品| 婷婷人妻激情| 色婷婷电影网| 久草精品在线| 国产日比| 欧美亚洲特P| 99超级碰免费视频| 0755午夜福利视频| 亚洲另类在线观看| 97中文热色| 蜜桃色色网站视频三区| 欧美东京热青青草| 日韩精品区二区三区不卡| 91中出视频| 艹我哪美一区无码| 亚洲精品97| 人妻插插人妻人| 日韩欧美福利视频看看| 亚洲好色人妻| 色婷婷在线视频| 噜噜噜在线视频| 久久国产对白激情浪潮| 国内精品久久人妻性色av| 亚洲宗合电影| 国产av强奸美女| 九草九九九| 色情五月综合婷婷| 91网站18禁| 欧美激情精品久久久| 涩五月婷婷| 国产一区免费午夜视频| 久久久久97| 91综合在线| 亚洲欧美综合| 欧美综合区| 九九综合九九综合| 嗯阿好爽好紧| 欧美色图偷拍另类| 免费网站观看www在线观| 色大师网站www永久网站视频| 东北女人av| 日韩中文9| 激情第四色| 亚洲视频一二区| 日本视频一区二区三区| 国产精品69久久久久孕妇欧美| 九九无码视频| 欧美片第一页| 无码操逼天堂| 精品女人999| 中文色综合| 骚鸭AV| 蜜桃久久久久久久| 一区二区三区四区免费视频| 欧美成人精品欧美一级乱黄一区二…| 麻豆久久久久久久久丝袜 | 久久东京伊人一本到鬼色| 一本大道久| n1038 一二三区| 天天干人妇| www久久国产精品| 人伦四五区| 亚洲AV资源| 欧美精品1区2区3区| 久久精品人妻一区| 欧美成人精品一区二区男人蜜臀| 99少妇精品视频| 国模不卡一本二本三电影| 欧美日本成人一区二区| 久久超碰亚洲人| 乱老女人一区二区视频| 欧美性爱精品七区| 91国产丝袜白虎| 99热免费精品| 无码免费一区二区三区啪啪| 精品久久久久久中文| 大香蕉欧美| 少妇高潮九九九九九九九| 色盈盈影院| 精品 码产区一区二-1080P高清在线www-B029AV| 国产精品爱欲| 超碰78| 国产精品白丝AV| 青青欧洲黑| JULIA人妻风俗店中出电影| 大香蕉AV在线| 男女激情黄色网址| 国产操逼视频在线观看| 精品人妻一区二区三区四区不卡在| 十八禁一区二区无码观看| 五月天色图| 97色伦欧美| 色人久久| 极品白嫩美女白浆成人福利在线看| 超清福利精品视频在线| 国产剧情在线| 久久亚洲一区女同性恋中文字幕 | 五月激情小说| 综合欧美日本三级| 高跟丝袜AV专区国产| 女同女同恋久久级三级| 天天上日日上日韩精品| 亚洲色人| 婷婷超| 亚洲天堂男人天堂| 欧美日韩亚洲天堂| 操久久久久| 蜜臀网址在线| 男人天堂导航| 俺去啦自拍| 亚洲欧美日韩免费电影| 成人AV在线网站| 青娱乐亚洲热| 99精品成人免费看| 天天影视亚洲| 大香蕉中文在线| 丝袜综合色图| 六月婷激情福利天堂69| 91粉嫩萝控精品福利网站_精品影音先锋国 | 夜夜夜夜久久久久| 精品网站9999| 青青草原狼av| 天天日天天干天天整| 精品久操| 久久是精品| 美女上床网站| 中文字幕一二三av| 超碰碰97资源站| 亚洲se91| 国产精品熟女一区二区三区| 亚洲91色| 中国AV美女| 91九色蝌蚪在线观看| 中文字幕一区二区日韩网| 人干人人人操人人摸| 操B在线观看| 九九碰九九爱97| 性色一线| 欧美色图成人网一区二区| 欧美午夜视频| 亚春色色| 97香蕉网| 操操操日本的逼| 女人被添高潮免费视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 夜嗨影院| 人人操av| 亚州色站 日韩电影| 丝袜美腿射精91| 成人精品久久| 黄色免费网| 岛国艾薇凹凸视频天堂| 长长久久免费视频| 啊啊啊97视频| 美女十八禁| 人人性爱视频免费| 凸凹视频在线观看| 97国产色综合| 无码操逼天堂| 少妇久久久久| 一牛影视成人片免费| 国产视频一区二区免费| 色哟哟-国产专区| 日本理论在线| 国产欧美精品日韩区二区麻豆天美| 日韩欧美传媒一区国产| 中国和日本人色哪个不下载能放| 久久夜夜| 国产福利小视频高清在线观看| 丁香五月影院| 亚州 综合 色图| 在线天堂资源亚洲| 美国人人操人人操| 涩涩五月天| 使劲用力艹少妇视频一区二区| 99999国产| 草草影院最新网址| 骚货人妻偷情自拍在线视频| 久久亚洲精品成人av| 亚洲日韩久久精品一区| 激情黄色五月天| 蜜桃av色偷偷av老熟女| 18禁的网站在线| 国产视频一区二区在线| 亚州高清av| 摸奶性爱视频网站在线免费播放| 国产精品无码在线| 老熟女熟妇| 欧美97超碰| 亚洲欧美日韩精品久久久一区二区| 好淫网一二三视区| 国产精品另类| 日韩精品 视频一区二区| 丰满少妇人妻久久久久久| 亚洲第一视频 欧美风情 日韩| 国产无码精品成人| 亚洲丝袜色| 一个人免费HD91视频| 18禁精品网站在线看| 日本十八禁免费看污网站| 国产成人无码网站在线视频| 青青草白白色| 国产精品爆乳懂色蜜乳| 综合激情五月丁香| 九九九精品色乱九九九| 人妻一区二区三区视频| 久久手机好看网站| 青草一区二区| 婷婷五月综合在线| 天天搞欧美| 亚洲国产精品成人综合| 少妇熟女1区2区3区| 欧美呦呦性爱| 九久9热| 蜜臀久久99精品久久久久久酒店| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 天天噜| 99后入| 91激情| 五月综合久久| 人妻少妇无码| 秋霞一级视频在线观看免费| 伊人网在线视频| 中文人妻av高清一区| 97超碰无码网| 最近2019中文字幕国语免费版| 色av中文字幕| 97香蕉网| 亚洲欧美综合色| 91被操| 校园春色综合色| 亚洲国产精品V?在线播放| 91欧美偷拍| 一级成人性爱| 亚洲乱色熟女一区| 久久久久久久久久黄色网| 人妻一区二区三区视频| 10000部十八禁看电影| 八戒午夜福利理论片| WWW.加勒比人妻一区不卡.com| 国产强奸91| 美女干逼2| 在线观看色视频| 91 亚欧| 婷婷在线播放| 熟女探花啪啪| 岛国人妻少妇av在线观看| 欧亚性爱在线视频| 操老熟女AV| 激情99| 日韩熟女无码| 91欧美性| 五月丁香啪啪啪| 农村女一级毛卡片| 日韩 成人 有码| 日韩成人精品视频自拍| 超碰4A| 久久久久骚| av最新免费中文字幕| 曰本特级特黄特色黄色A级网站高清在线免费看 | 麻豆区久久久久亚| 婷婷色网| 天天射天天| 亚洲国产中文字幕| 亚洲第一页色| 一本久道在线综合视频| 日本 情色 1区2区3区| 嗯嗯啊在线视频| 久久久久久久伊人精品| 在线色资源| 少妇99成人麻豆| 日韩精品人妻一| 亚州欧美在线| 综合日韩激情另类图片| 户外裸露刺激视频第一区| 91性情| 蜜屁Av| 男人天堂一区二区| 岛国激情视频在线观看| 麻豆熟妇乱妇熟色A片在线看 | 91九色首页| 老外又粗又长一晚做五次| 无码精品啪啪啪一区二区三区三州| 在线观看一卡二卡| 国产精品一区午夜福利| 97亚洲中文| 久久九操在线观看| 欧美性猛交美女自慰91| 国产精品欧美日韩久久| 国产97亚洲| 亚洲大色鬼| 久久亚洲天天做| 五月婷色| 日本一级婬片试看三分钟| sewuyueav| 男女性扦B| 亚洲国成人情色好看电影| 激情视频网址| 色乱二区| 国产成人亚洲精品无码最新在线| 久久国产精品视频| 免费成人在线熟妇网| 久久久精品日本一道| 色综合尤物| 久久久久久久伊人精品| 激情在线青青操| 校园春色家庭伦理欧美激情| 99re这里只有精品3| 婷婷综合久久| 无码操逼网| 人人操人人干xxx| 91天美| 中文字幕福利视频一区二区三区在线观看| 欧美白嫩女HD| 日本免费不卡二区| 久久女人一区二区三区| 蜜桃无码AV一区二区| 国产精品69人妻无码久久久| 超碰97久久| 久久久人妻| 综合自拍| 超碰97人人乐| 中文字幕诱惑制服人妻丝袜美丝袜美| 二区熟妇韩日| 嗯嗯,啊啊,国产精品| 婷婷五月天激情网| 在线不卡视频| 女人高潮大叫一级毛片| 成人5码视频| 色色福利| 韩日性爱av| 黄色AAAAA欧美| 日本一区视频在线观看| 国产精品久久天天干| 国产成人超碰在线| 亚洲精品一区二区精华| 国产精品懂色tv影视免费观看 | 精品亚州18| 免费久久9999| 国产熟妇一区二区| www.高清无码诱惑一区.com | 99999久久精| 九九操久久国产免费视频| 久久老熟女| 久热最新在线杭州| 长长久久曰曰夜夜成人网| 久9热| 嗯嗯啊啊视频在线看| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 97视频在线视频| 另类专区加勒比| 久久精品成人| 九九操久久国产免费视频| 久久久夜夜夜| 欧美一级在线观看成人| 亚洲一区日韩精品中文字幕| 日韩一区二区精彩视频| 91精品亚洲内射孕妇| 国产av强奸美女| 极品尤物女神在线观看| 综合久久中文字幕综合日韩精品| 人人透人人操| 日本免费中文一区二区三区四区| 美女超碰978| 欧美激情视频一区二区三区不卡| 日本A级视频| 亚洲高清少妇| 97日韩欧美亚洲| 大香蕉中文| 澳门黄片一香蕉视频| 91艹B视频| 久久婷婷五月天| 一二三啪啪专区| 国产青青美女玩逼视频| 色天天野狼综合社区| 欧美超碰在线| 成人一级性爱| 99热精品在线| 色女综合| 加勒比人妻综合| 久久99国产精品| 亚洲成aⅴ人片不卡无码| 白嫩国模丰满一二三区| 亚洲天堂区| 九九九九免费高| 欧美色色人| 去干网最新版| AV色天香在线| 日日碰视频网| 欧美色图20p| 黄色电影观看久久9|