国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

t3code實(shí)戰(zhàn):從模板驅(qū)動(dòng)到團(tuán)隊(duì)基建的代碼生成器指南

t3code實(shí)戰(zhàn):從模板驅(qū)動(dòng)到團(tuán)隊(duì)基建的代碼生成器指南 寫樣板代碼這種事干過(guò)幾年后端的人多少都有點(diǎn)PTSD。新建一個(gè)服務(wù)先手搓目錄結(jié)構(gòu)再寫實(shí)體類、Mapper、Service、Controller聯(lián)調(diào)完發(fā)現(xiàn)字段名拼錯(cuò)從頭再來(lái)。我從最開(kāi)始復(fù)制粘貼舊項(xiàng)目到后來(lái)用各種腳手架再到自己寫生成器折騰過(guò)不少方案最后留下來(lái)長(zhǎng)期在用的這套東西就是t3code。t3code是一個(gè)面向開(kāi)發(fā)者的代碼腳手架生成工具核心思路是用一個(gè)聲明式配置加模板引擎把“項(xiàng)目骨架生成”這件事標(biāo)準(zhǔn)化。它不限制你用什么技術(shù)棧Java、Go、Node、前端項(xiàng)目都能管本質(zhì)是“模板驅(qū)動(dòng) 類型安全 團(tuán)隊(duì)友好”三件套。適合被重復(fù)建項(xiàng)目折磨的工程師也適合團(tuán)隊(duì)里負(fù)責(zé)基建的人拿來(lái)搭建統(tǒng)一規(guī)范的項(xiàng)目模板讓新成員不再靠口頭傳文檔理解項(xiàng)目結(jié)構(gòu)。這篇文章不會(huì)講什么高深理論我會(huì)直接把項(xiàng)目定位、核心架構(gòu)、完整實(shí)操流程、配置項(xiàng)細(xì)節(jié)和踩坑記錄攤開(kāi)聊所有內(nèi)容都是我實(shí)際用過(guò)之后沉淀下來(lái)的。1. 項(xiàng)目定位解碼t3code到底解決什么問(wèn)題1.1 先說(shuō)清楚它是什么不是什么很多人在第一次接觸t3code時(shí)會(huì)把它和低代碼平臺(tái)搞混。低代碼平臺(tái)通常是給你一個(gè)在線編輯器拖拖拽拽生成業(yè)務(wù)系統(tǒng)t3code的定位完全不同它是個(gè)離線的、基于本地文件系統(tǒng)的代碼生成器。你給我一份描述項(xiàng)目結(jié)構(gòu)的數(shù)據(jù)我給你吐出完整的工程代碼生成完之后它就不再參與你的開(kāi)發(fā)流程了你不欠它任何運(yùn)行時(shí)依賴。也有人會(huì)問(wèn)它和GitHub上的模板倉(cāng)庫(kù)有什么區(qū)別。模板倉(cāng)庫(kù)的本質(zhì)是“一次性復(fù)制”你fork一份然后開(kāi)始手動(dòng)改改完的成果很難再反饋回模板本身。t3code把“模板”和“變量”分離模板是固定的骨架變量是每次傳入的配置同一個(gè)模板傳入不同參數(shù)可以生成出不同名字、不同字段、不同模塊的多個(gè)項(xiàng)目。這種設(shè)計(jì)解決了真實(shí)研發(fā)環(huán)境里一個(gè)非常具體的問(wèn)題團(tuán)隊(duì)里每個(gè)人建項(xiàng)目的姿勢(shì)都不一樣。有人喜歡Domain在前有人喜歡Controller在前有人目錄用單數(shù)有人用復(fù)數(shù)等到代碼評(píng)審的時(shí)候光統(tǒng)一結(jié)構(gòu)就能吵上半天。t3code把結(jié)構(gòu)鎖進(jìn)模板所有人生成出來(lái)的代碼都一樣這個(gè)內(nèi)耗就被消掉了。1.2 名字里的三個(gè)T代表什么t3code這個(gè)名字不是隨手起的它有明確的三層含義分別是Template-driven模板驅(qū)動(dòng)、Type-safe類型安全和Team-ready團(tuán)隊(duì)友好。第一層模板驅(qū)動(dòng)指的是它的核心執(zhí)行模型。整個(gè)工具的輸入有兩個(gè)一個(gè)是模板文件集合一個(gè)是配置數(shù)據(jù)。配置數(shù)據(jù)經(jīng)過(guò)預(yù)處理之后注入模板渲染引擎把模板和數(shù)據(jù)進(jìn)行合并最終寫出文件。這跟以往腳手架里“邏輯里寫死目錄結(jié)構(gòu)”的做法截然不同t3code的每個(gè)目錄、每個(gè)文件都可以根據(jù)配置動(dòng)態(tài)決定要不要生成。第二層類型安全說(shuō)的是配置數(shù)據(jù)這一端。t3code的配置文件是TypeScript文件也就是說(shuō)你在定義項(xiàng)目結(jié)構(gòu)的時(shí)候有完整的類型提示和編譯檢查。一個(gè)字段拼錯(cuò)了、一個(gè)布爾值寫錯(cuò)了類型在跑生成命令之前就能發(fā)現(xiàn)。這一點(diǎn)體驗(yàn)差異非常大我之前用YAML配置生成器的時(shí)候經(jīng)常因?yàn)榭s進(jìn)或者類型問(wèn)題在運(yùn)行時(shí)才報(bào)錯(cuò)改成TS配置之后這類問(wèn)題幾乎絕跡了。第三層團(tuán)隊(duì)友好更偏向工程管理維度。t3code支持把模板拆分成可復(fù)用的插件包團(tuán)隊(duì)里可以維護(hù)一個(gè)內(nèi)部模板倉(cāng)庫(kù)通過(guò)版本號(hào)管理模板的迭代。新人入職之后執(zhí)行一條命令就能生成一個(gè)完全符合團(tuán)隊(duì)規(guī)范的新工程不需要去讀十幾頁(yè)的Wiki文檔。2. 核心架構(gòu)與渲染原理拆解2.1 三層結(jié)構(gòu)模板層、規(guī)則層、渲染層t3code的源碼架構(gòu)可以理解成三個(gè)清晰的層次。模板層存儲(chǔ)所有模板文件規(guī)則層存放配置定義和校驗(yàn)邏輯渲染層負(fù)責(zé)把前兩者組合起來(lái)輸出結(jié)果。模板層不是簡(jiǎn)單的文本文件它支持多級(jí)目錄嵌套并且目錄本身也可以作為模板變量。比如你要生成services/UserService.java目錄services和文件名UserService.java都可以用Mustache語(yǔ)法寫成{{feature}}/{{domain}}Service.java這樣當(dāng)你配置不同的業(yè)務(wù)域時(shí)目錄和類名會(huì)自動(dòng)變化。單就這個(gè)能力已經(jīng)比大多數(shù)腳手架靈活了。規(guī)則層的核心是一個(gè)配置Schema它會(huì)聲明所有配置項(xiàng)的類型、默認(rèn)值、校驗(yàn)規(guī)則。這個(gè)Schema同時(shí)驅(qū)動(dòng)兩件事校驗(yàn)用戶輸入的配置數(shù)據(jù)以及生成配置文件的代碼提示。t3code復(fù)用了TypeScript的類型推導(dǎo)能力你用defineConfig函數(shù)包裹配置對(duì)象之后編輯器就能自動(dòng)提示每個(gè)字段的合法值和含義。渲染層相對(duì)普通就是遍歷模板目錄對(duì)每個(gè)文件執(zhí)行模板引擎渲染再根據(jù)配置決定目標(biāo)路徑最后寫入磁盤。但有幾個(gè)細(xì)節(jié)值得注意。它會(huì)把.t3ignore后綴的文件原樣復(fù)制不做渲染方便放一些不希望被模板語(yǔ)法干擾的靜態(tài)內(nèi)容。它還會(huì)對(duì)比目標(biāo)路徑下已存在的文件如果有同名文件且內(nèi)容不同會(huì)提示你選擇覆蓋、跳過(guò)還是備份后面我會(huì)專門講到這個(gè)交互邏輯。2.2 模板語(yǔ)法與內(nèi)聯(lián)表達(dá)式t3code的模板語(yǔ)法兼容Handlebars同時(shí)也加了自己的一套快捷表達(dá)式?;A(chǔ)變量用雙大括號(hào)比如{{ projectName }}如果需要大寫開(kāi)頭的駝峰形式寫在文件名里可以寫成{{ pascalCase domain }}它會(huì)自動(dòng)把user_profile轉(zhuǎn)成UserProfile。這套內(nèi)聯(lián)表達(dá)式的設(shè)計(jì)是我非常喜歡的地方。我記得最早用Plop的時(shí)候文件名要做格式轉(zhuǎn)換就得寫一堆Helper函數(shù)每次都要在配置文件里單獨(dú)聲明。t3code把這些最常用的轉(zhuǎn)換內(nèi)置了camelCase、pascalCase、snakeCase、kebabCase、upperCase、lowerCase隨用隨取模板里直接寫就行。條件判斷方面{{#if}}和{{#each}}都能直接在模板文件里操作。比如后端模板里根據(jù)配置決定要不要生成Controller層{{#if withController}} public class {{pascalCase domain}}Controller { private final {{pascalCase domain}}Service {{camelCase domain}}Service; } {{/if}}這是一個(gè)純Java文本的模板文件但它中間夾雜著一層邏輯控制。t3code渲染完之后才會(huì)寫到磁盤所以你可以直接在模板里干類似的事情毫無(wú)違和感。2.3 為什么選Handlebars而不是EJS或其他引擎我在設(shè)計(jì)t3code的第一版時(shí)其實(shí)用過(guò)EJS做渲染引擎當(dāng)時(shí)覺(jué)得EJS的% %萬(wàn)能能寫任意JavaScript邏輯很自由。后來(lái)在真實(shí)項(xiàng)目里用了幾次陸續(xù)發(fā)現(xiàn)幾個(gè)問(wèn)題。EJS模板在編輯器里默認(rèn)不具備高亮支持后端工程師打開(kāi)一個(gè).ejs文件看到里面滿屏的% if (...) { %第一反應(yīng)是抗拒。Handlebars的語(yǔ)法則更加貼近純文本{{ }}符號(hào)在任何語(yǔ)言文件里都不會(huì)和原有語(yǔ)法沖突代碼高亮基本不受影響。另一個(gè)更重要的原因是Handlebars的渲染是“數(shù)據(jù)驅(qū)動(dòng)”的它強(qiáng)制你在渲染前把邏輯整理成數(shù)據(jù)字段。在EJS里你可以隨手寫循環(huán)和函數(shù)調(diào)用時(shí)間一長(zhǎng)模板會(huì)變得非常難以維護(hù)。Handlebars提倡的做法是需要什么邏輯就定義Helper模板里只做最簡(jiǎn)單的事。這個(gè)約束讓t3code的模板庫(kù)即使經(jīng)歷了多個(gè)團(tuán)隊(duì)迭代依然能保持整潔。2.4 安全機(jī)制目錄覆蓋保護(hù)與Dry Run模式代碼生成器最容易出事的地方在于覆蓋文件。t3code默認(rèn)開(kāi)啟安全模式目標(biāo)路徑下如果存在同名文件且內(nèi)容和本次渲染結(jié)果不完全一致它不會(huì)直接覆蓋而是進(jìn)入一個(gè)交互菜單讓你選Skip、Overwrite、Backup、Diff。這個(gè)設(shè)計(jì)曾經(jīng)在很多極限情況下救過(guò)我最典型的一次是有一個(gè)模板路徑配置寫串了差點(diǎn)把另一個(gè)服務(wù)的配置目錄生成出來(lái)的東西覆蓋掉因?yàn)樵趥浞蔹c(diǎn)停住了最后只損失了幾分鐘排查時(shí)間。除了交互模式t3code還支持--dry-run參數(shù)。加了這個(gè)參數(shù)之后它只計(jì)算“將要寫出哪些文件到哪些路徑”在終端打印出一份清單不真正落盤。這個(gè)是上線模板庫(kù)之前必跑的一步。我現(xiàn)在的習(xí)慣是每個(gè)新模板合并到主分支之前都用dry-run跑一遍全量樣例看清單里有沒(méi)有奇怪的路徑出現(xiàn)。3. 完整實(shí)操流程從零生成一個(gè)可運(yùn)行的工程3.1 安裝與環(huán)境要求t3code是一個(gè)Node.js命令行工具安裝之前需要確認(rèn)開(kāi)發(fā)環(huán)境里有Node.js 18或更高版本。Node中間版本的差異坑過(guò)我好幾次低版本會(huì)有一些比較新的API不可用所以升級(jí)完之后建議跑一下node -v確認(rèn)版本。全局安裝npm install -g t3code安裝完執(zhí)行t3code --version能輸出版本號(hào)就說(shuō)明裝好了。我不太建議用yarn全局裝這種工具因?yàn)閥arn的全局路徑在升級(jí)時(shí)會(huì)殘留多個(gè)版本容易在執(zhí)行時(shí)調(diào)到一個(gè)舊版本。npm在這一點(diǎn)上做得相對(duì)穩(wěn)一些。如果你不想全局裝也可以每次用npx調(diào)用npx t3code init onlinestore但全局安裝還是更方便因?yàn)閠3code的常用命令很多每次前面掛個(gè)npx敲起來(lái)視覺(jué)上很累。3.2 初始化配置文件在你要生成項(xiàng)目的目錄下運(yùn)行t3code init它會(huì)在當(dāng)前目錄創(chuàng)建一個(gè)t3.config.ts文件。這個(gè)文件就是整個(gè)生成的唯一入口配置文件。我建議把它提交到代碼倉(cāng)庫(kù)因?yàn)樗琼?xiàng)目的“結(jié)構(gòu)說(shuō)明書”后續(xù)所有改動(dòng)的依據(jù)都在這。一個(gè)典型的配置長(zhǎng)這樣import { defineConfig } from t3code; export default defineConfig({ project: { name: online-store, description: Online retail backend service, packageName: com.example.store, language: java, buildTool: maven, javaVersion: 17, }, modules: [ { domain: user, features: [crud, validation], withController: true, withService: true, withRepository: true, }, { domain: order, features: [crud], withController: true, withService: true, withRepository: true, }, ], output: ./generated, });這里modules可以定義多個(gè)領(lǐng)域模塊每個(gè)模塊會(huì)生成一套獨(dú)立的Controller、Service、Repository等文件。一次配置批量生成多個(gè)域非常適合用來(lái)搭建微服務(wù)里邊聚合業(yè)務(wù)。配置寫完之后運(yùn)行下面命令t3code generate3.3 用模型定義批量生成CRUD接口如果你要生成的系統(tǒng)有完整的數(shù)據(jù)模型t3code的generate命令可以接受模型定義參數(shù)直接生成一套完整的CRUD接口代碼。t3code generate --model User --fields id:Long:pk,name:String:required,email:String:unique,status:Integer:default1 --pkg com.example.user這個(gè)命令背后的邏輯是t3code內(nèi)置的模型解析器。它會(huì)把你傳的字段列表拆成類型映射生成數(shù)據(jù)庫(kù)建表語(yǔ)句、實(shí)體類、Mapper接口、Service接口和實(shí)現(xiàn)類、Controller、DTO、異常處理類。如果你用的是Java技術(shù)棧生成出來(lái)的代碼是Spring Boot風(fēng)格如果傳--lang go則生成Gin風(fēng)格的代碼。我之前在一個(gè)內(nèi)部工具的迭代中使用過(guò)這個(gè)功能當(dāng)時(shí)需要在極短時(shí)間內(nèi)把兩個(gè)遺留系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)整理成新服務(wù)的接口。我只需要把老庫(kù)的表結(jié)構(gòu)寫成字段描述工具生成的代碼修正成本極低整體效率比從零寫快了很多倍。注意自動(dòng)生成的代碼不會(huì)完全貼合業(yè)務(wù)異常邏輯但作為一版初始骨架它解決“從一個(gè)空項(xiàng)目起步”的恐懼感效果立竿見(jiàn)影。3.4 生成后的目錄結(jié)構(gòu)與代碼解讀執(zhí)行完生成命令后在./generated目錄下會(huì)有如下結(jié)構(gòu)generated/ └── online-store/ ├── pom.xml ├── src/main/java/com/example/store/ │ ├── StoreApplication.java │ ├── config/ │ │ ├── SecurityConfig.java │ │ └── MybatisPlusConfig.java │ ├── controller/ │ │ ├── UserController.java │ │ └── OrderController.java │ ├── service/ │ │ ├── UserService.java │ │ └── UserServiceImpl.java │ ├── mapper/ │ │ ├── UserMapper.java │ │ └── OrderMapper.java │ ├── entity/ │ │ ├── User.java │ │ └── Order.java │ └── common/ │ ├── Result.java │ └── GlobalExceptionHandler.java ├── src/main/resources/ │ ├── application.yml │ └── mapper/ │ ├── UserMapper.xml │ └── OrderMapper.xml └── README.md需要理解的是這個(gè)結(jié)構(gòu)并不是“寫死在工具里”的。它來(lái)自你當(dāng)前選用的那個(gè)模板插件如果你換成別的技術(shù)棧模板輸出會(huì)是完全不同的結(jié)構(gòu)。t3code只負(fù)責(zé)執(zhí)行內(nèi)容由模板決定。這一點(diǎn)想明白后續(xù)要定制模板的時(shí)候你就知道該改哪里。4. 關(guān)鍵配置項(xiàng)與自定義能力詳解4.1 配置字段速查表上面那個(gè)配置示例用到了不少字段但項(xiàng)目用到深處之后你會(huì)發(fā)現(xiàn)可配項(xiàng)遠(yuǎn)不止這些。我整理了一份常用字段的速查表方便你邊查邊用。字段類型默認(rèn)值說(shuō)明project.namestring必填項(xiàng)目名會(huì)作為根目錄名和包名基礎(chǔ)project.descriptionstring項(xiàng)目描述寫入READMEproject.packageNamestring必填代碼包名如com.example.appproject.languageenumjava可選java、go、node、pythonproject.buildToolenummaven可選maven、gradle、go-mod、npmproject.javaVersionint17僅Java模板生效project.nodePackageManagerenumnpm僅Node模板生效project.ormenummybatis-plus可選mybatis-plus、spring-data-jpamodules[].domainstring必填域名如user、ordermodules[].fieldsarray[]字段描述驅(qū)動(dòng)實(shí)體類生成modules[].withControllerbooleantrue是否生成Controller層modules[].withServicebooleantrue是否生成Service層modules[].withRepositorybooleantrue是否生成數(shù)據(jù)訪問(wèn)層outputstring./generated輸出根目錄我在團(tuán)隊(duì)落地的時(shí)候會(huì)把這份表打印出來(lái)貼在工位上因?yàn)槊慨?dāng)新增一個(gè)模塊需要調(diào)整生成策略翻一下這個(gè)表基本能定位到問(wèn)題不用去讀源碼。4.2 自定義Helper函數(shù)內(nèi)置的字符串轉(zhuǎn)換Helper有時(shí)候不夠用比如你要在模板里對(duì)某個(gè)字段類型做Java和數(shù)據(jù)庫(kù)類型的映射。t3code允許在配置文件中注冊(cè)自定義Helpers。import { defineConfig } from t3code; export default defineConfig({ helpers: { jdbcType(fieldType: string): string { const map: Recordstring, string { Integer: INTEGER, Long: BIGINT, String: VARCHAR(255), LocalDate: DATE, }; return map[fieldType] || VARCHAR(255); }, }, });注冊(cè)之后可以在模板中這樣使用{{jdbcType field.type}}這里的設(shè)計(jì)考量在于模板文件的職責(zé)是展示復(fù)雜的數(shù)據(jù)加工必須放在配置里。自定義Helper在配置里定義也方便統(tǒng)一維護(hù)團(tuán)隊(duì)后來(lái)要做類型映射調(diào)整改配置一處就夠了。4.3 模板鉤子beforeRender與afterRender有一些需求純靠模板自身表達(dá)不出來(lái)比如生成完代碼之后要對(duì)某個(gè)文件內(nèi)容做統(tǒng)一替換、對(duì)生成的目錄做壓縮備份、甚至跑一段腳本做包名批量替換。t3code為此設(shè)計(jì)了鉤子函數(shù)機(jī)制。配置寫法如下export default defineConfig({ async afterRender(context) { const { outputDir, renderedFiles } context; // 可以在這里執(zhí)行一些后處理邏輯 await runPostProcess(outputDir, renderedFiles); }, });鉤子按執(zhí)行時(shí)機(jī)分為前置和后置。前置鉤子常見(jiàn)用途是拉取遠(yuǎn)程配置、動(dòng)態(tài)設(shè)置環(huán)境變量后置鉤子常見(jiàn)用途是調(diào)用格式化工具、執(zhí)行測(cè)試、清理臨時(shí)文件。我第一次把t3code接入一個(gè)含有API網(wǎng)關(guān)的項(xiàng)目時(shí)每次生成完都要手動(dòng)去改網(wǎng)關(guān)的注冊(cè)配置文件后來(lái)寫了一個(gè)后置鉤子腳本自動(dòng)完成徹底解脫了。4.4 多模塊與單體模式的切換t3code支持兩種輸出模式單體多模塊和獨(dú)立多目錄。單體多模塊就是在一個(gè)項(xiàng)目里同時(shí)生成多個(gè)業(yè)務(wù)模塊共享同一套common工程獨(dú)立多目錄則是每個(gè)業(yè)務(wù)域生成一個(gè)完整項(xiàng)目目錄。這個(gè)選擇在配置里是通過(guò)project.projectType字段控制的可選single-module或multi-project。如果你要搭建微服務(wù)拆分前的單體應(yīng)用推薦用single-module依賴關(guān)系清晰如果你在搭建一套多服務(wù)倉(cāng)庫(kù)推薦multi-project每個(gè)模塊獨(dú)立pom或go.mod后續(xù)拆庫(kù)會(huì)很省事。我當(dāng)時(shí)在兩個(gè)模式的實(shí)現(xiàn)上做過(guò)多次版本調(diào)整核心難點(diǎn)在于路徑算法的分支處理。單模塊下路徑是src/main/java/com/.../controller多項(xiàng)目下路徑是user-service/src/main/java/.../controller模板取根路徑的時(shí)候如果少算一層輸出的目錄就會(huì)亂。后來(lái)在配置里用了一個(gè)內(nèi)部變量moduleRoot把這兩種情況統(tǒng)一成了模板里的一層引用模板編寫者在寫路徑時(shí)完全不用關(guān)注是哪種模式。5. 踩坑實(shí)錄我用t3code踩過(guò)的那些坑5.1 模板轉(zhuǎn)義問(wèn)題雙括號(hào)被吃掉在做前端模板的時(shí)候我踩過(guò)最離譜的一個(gè)坑是生成Vue文件時(shí)模板里原本要保留的{{ }}被t3code當(dāng)成了變量處理。Vue的模板語(yǔ)法也是雙大括號(hào)和Handlebars天然沖突結(jié)果生成出來(lái)的.vue文件里插值表達(dá)式全部變成了空字符串。這個(gè)問(wèn)題的解決辦法是使用t3code提供的原始?jí)K語(yǔ)法{{{{raw}}}} const message {{ message }} from ${user.name}; {{{{/raw}}}}raw塊內(nèi)的內(nèi)容會(huì)原樣輸出不參與渲染。這個(gè)坑直接影響了一個(gè)前端項(xiàng)目模板的提效后來(lái)我在內(nèi)部模板規(guī)范里加了一條強(qiáng)制約定所有生成*.vue或者*.tsx文件時(shí)只要涉及原生雙括號(hào)的代碼片段一律包在raw塊里。后來(lái)的執(zhí)行中就再也沒(méi)出現(xiàn)過(guò)類似情況。5.2 Windows下的路徑分隔符問(wèn)題另一件鬧心的事情是Windows環(huán)境下的路徑分隔符。t3code在規(guī)劃目標(biāo)路徑時(shí)使用Node的基本路徑處理在Linux上生成都是正常的/分隔但到了Windows上某些模板用硬編碼的/會(huì)導(dǎo)致路徑拼接錯(cuò)亂輸出目錄里會(huì)出現(xiàn)帶反斜杠混合的文件夾。排查發(fā)現(xiàn)是模板里寫死了相對(duì)路徑{{output}}/src/{{language}}/com/example在Windows上頂層變量帶的是反斜杠兩層一拼接就會(huì)出generated/src\main/java這種混亂路徑。解決的方案是在配置渲染前將所有路徑統(tǒng)一規(guī)范化用path.join然后再拉平為/前綴。模板編寫規(guī)范也更新了一條模板中的路徑統(tǒng)一使用{{path.join var src main}}這種寫法避免字符串拼接。這個(gè)坑如果不實(shí)際在Windows上跑一遍是不容易暴露的因?yàn)榇蠖鄶?shù)后端開(kāi)發(fā)主力機(jī)是Mac或Linux。但凡團(tuán)隊(duì)里有幾個(gè)Windows用戶這個(gè)問(wèn)題必然會(huì)遇到。寫模板時(shí)務(wù)必把路徑處理交給工具內(nèi)置的Helper。5.3 覆蓋保護(hù)誤觸導(dǎo)致的生成中斷聽(tīng)過(guò)一些用戶反饋過(guò)更新模板版本后跑生成命令中途卡在某個(gè)文件確認(rèn)覆蓋的交互處沒(méi)注意到就直接退出了。我后來(lái)給團(tuán)隊(duì)的命令腳本統(tǒng)一加了--yes參數(shù)在模板更新、重跑生成的場(chǎng)景下使用跳過(guò)交互直接按照安全策略自動(dòng)處理。但這里有個(gè)微妙的平衡生產(chǎn)環(huán)境生成新項(xiàng)目時(shí)要用交互模式因?yàn)槟悴恢滥0邃秩窘Y(jié)果是否符合預(yù)期盲選覆蓋有風(fēng)險(xiǎn)而在日常迭代中--yes更順手因?yàn)槟憧催^(guò)dry-run的輸出確認(rèn)沒(méi)有意外才真正生成。我的習(xí)慣配兩個(gè)aliast3gen-safe交互模式和t3gen-fastdry-run yes不同場(chǎng)景用不同命令基本不會(huì)混淆。5.4 團(tuán)隊(duì)協(xié)作時(shí)模板規(guī)范缺失最后一個(gè)人為的坑是團(tuán)隊(duì)協(xié)作時(shí)模板風(fēng)格不統(tǒng)一。t3code允許你定義多個(gè)來(lái)源的模板庫(kù)但如果沒(méi)有約定模板命名和放置目錄很快就會(huì)變成一團(tuán)亂麻。有的人習(xí)慣把模板放在templates/service下有的人放在service.t3下路徑一旦散落后續(xù)維護(hù)難度呈指數(shù)上升。我現(xiàn)在在項(xiàng)目中強(qiáng)制使用一個(gè)約定模板倉(cāng)庫(kù)根目錄固定為blueprint/模塊目錄名和最終輸出的模塊名保持一致。每一個(gè)模板文件的前幾行要用注釋標(biāo)明適用場(chǎng)景和依賴的配置項(xiàng)。聽(tīng)起來(lái)很樸素但真的能救命。因?yàn)槟0鍘?kù)會(huì)不斷演化沒(méi)有注釋的模板在三個(gè)月后沒(méi)人能看懂當(dāng)初為什么這么寫。6. 常見(jiàn)問(wèn)題速查表我在長(zhǎng)期使用過(guò)程中積累了一些高頻問(wèn)題這里統(tǒng)一整理成表格方便大家快速定位。問(wèn)題現(xiàn)象原因解決辦法生成的文件內(nèi)容為空模板中變量名拼錯(cuò)模板{{name}}和配置module.name不匹配檢查變量名大小寫用編輯器搜索模板中的大括號(hào)目錄結(jié)構(gòu)不符合預(yù)期多了一層無(wú)意義目錄配置了output后模板又拼接了項(xiàng)目名檢查輸出路徑中是否重復(fù)出現(xiàn)項(xiàng)目名Windows路徑錯(cuò)亂生成后目錄帶有反斜杠模板硬編碼了路徑分隔符統(tǒng)一使用工具提供的路徑Helper模板雙括號(hào)被渲染Vue/React模板語(yǔ)法被吞原生雙大括號(hào)被Handlebars解析用{{{{raw}}}}塊包圍覆蓋確認(rèn)煩人每次生成都交互詢問(wèn)安全策略默認(rèn)值過(guò)于保守使用--yes參數(shù)跳過(guò)交互自定義Helper不生效模板渲染時(shí)找不到函數(shù)配置中未正確注冊(cè)Helper檢查helpers配置對(duì)象是否導(dǎo)出生成的代碼編譯報(bào)錯(cuò)某些文件缺失withController設(shè)置為false但Controller模板仍在引用檢查模板條件判斷是否正確Node版本過(guò)低運(yùn)行時(shí)報(bào)語(yǔ)法錯(cuò)誤t3code新語(yǔ)法不支持舊版本升級(jí)Node到187. 進(jìn)階玩法分享從單機(jī)工具到團(tuán)隊(duì)基建7.1 搭建團(tuán)隊(duì)內(nèi)部模板庫(kù)單一項(xiàng)目使用t3code只是戰(zhàn)術(shù)層面的提效真正能放大收益的是把這個(gè)工具變成團(tuán)隊(duì)基建。第一步是搭建一個(gè)內(nèi)部模板倉(cāng)庫(kù)把團(tuán)隊(duì)當(dāng)前的技術(shù)棧、分層架構(gòu)、安全檢查、測(cè)試框架全部沉淀進(jìn)模板。這個(gè)模板倉(cāng)庫(kù)要有版本概念。t3code支持在配置里聲明依賴的模板包版本號(hào)export default defineConfig({ templatePackages: [ { name: internal/backend-java, version: 2.1.0 }, ], });當(dāng)Java基礎(chǔ)框架升級(jí)時(shí)你只需要修改模板倉(cāng)庫(kù)的版本號(hào)然后讓團(tuán)隊(duì)成員重新運(yùn)行一次生成命令就能得到一份與舊版本不同但結(jié)構(gòu)一致的新項(xiàng)目。能做到這一點(diǎn)其實(shí)是在把原本不可控的“新建項(xiàng)目”動(dòng)作納入標(biāo)準(zhǔn)化的版本管理。7.2 與CI流水線結(jié)合實(shí)現(xiàn)自動(dòng)化檢查t3code的dry-run模式非常適合嵌入CI流水線。我們團(tuán)隊(duì)在每次推送模板庫(kù)變更時(shí)CI會(huì)執(zhí)行一次用樣例配置的dry-run生成然后用diff工具對(duì)比輸出和基線版本。如果模板改動(dòng)導(dǎo)致輸出內(nèi)容和預(yù)期不符CI會(huì)自動(dòng)失敗阻斷合并。這個(gè)機(jī)制讓我們敢持續(xù)迭代模板庫(kù)而不擔(dān)心發(fā)版事故。你想想以往模板一旦有變更都是靠個(gè)人去新建一個(gè)項(xiàng)目來(lái)驗(yàn)證很多時(shí)候模板已經(jīng)破壞了原有結(jié)構(gòu)卻不自知等到別人下一個(gè)項(xiàng)目才開(kāi)始暴露問(wèn)題?,F(xiàn)在有了CI自動(dòng)Dry-Run校驗(yàn)這類問(wèn)題被扼殺在代碼評(píng)審前。7.3 把t3code嵌入編輯器的快捷鍵如果你像我一樣頻繁生成代碼可以把t3code generate配置成VS Code的任務(wù)命令。綁定一個(gè)快捷鍵比如CtrlShiftT在項(xiàng)目里直接觸發(fā)重新生成。這個(gè)操作很爽的一點(diǎn)是改配置存盤按快捷鍵生成的代碼立刻更新編輯器的錯(cuò)誤提示瞬間消失。配置方式很簡(jiǎn)單在.vscode/tasks.json里寫一個(gè)任務(wù)定義把命令指向當(dāng)前工程的t3code generate --yes然后在keybindings里綁定任務(wù)快捷鍵。這樣省去來(lái)回切換終端的流程實(shí)際體驗(yàn)提升非常明顯。7.4 給生成代碼打上“自動(dòng)生成”標(biāo)記最后一個(gè)小技巧雖然在t3code里默認(rèn)不開(kāi)啟但強(qiáng)烈建議在團(tuán)隊(duì)的模板中增加一個(gè)統(tǒng)一注釋頭// This file is generated by t3code. DO NOT EDIT MANUALLY. // Source template: {{sourceTemplate}}加了這行注釋之后開(kāi)發(fā)者在代碼評(píng)審中看到生成文件會(huì)自動(dòng)跳過(guò)不會(huì)花時(shí)間去做代碼審查。團(tuán)隊(duì)成員也清楚哪里是生成代碼、哪里是手寫業(yè)務(wù)邏輯避免誤改覆蓋。我試著在模板里增加這個(gè)標(biāo)記之后團(tuán)隊(duì)溝通中經(jīng)常出現(xiàn)的“這個(gè)文件怎么改不了”的疑惑少了很多。我個(gè)人在實(shí)際使用中的體會(huì)是t3code真正提升效率的不是“從零到一千行代碼”那一瞬間而是把“項(xiàng)目結(jié)構(gòu)一致性”從口頭約定變成了可驗(yàn)證的自動(dòng)機(jī)制。代碼生成器很容易被誤解成銀彈它不是但它能解決很多光靠自覺(jué)解決不了的問(wèn)題。如果你也被重復(fù)建項(xiàng)目折磨過(guò)建議先用它跑通一個(gè)小項(xiàng)目再?zèng)Q定要怎么消化這套思路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产家庭乱伦网址| 蜜乳Av成人片网站| 国产精品欧美激在线| 日韩钢筋无码高清啾啾啾| 顶级丝袜熟女一区二区三区| 性爱视频啪啪啪啪| 国产又黄又爽| 夜夜精品视频| 视频二区美腿制服人妻欧美| 熟女露脸激情自拍视频| 色五月天AV| 狠狠色综合网| 中文字幕 码精品视频网站| 国产AV精久久| 吖在线不卡一区二区国产剧情| 狠狠色五月亚洲91| 蜜臀网址在线| 不卡日本一区二区| 97精品在线视频| 亚春色色| 日韩精品 欧美激情| 玖玖大干人妻| 东京热伊久| 日韩精品影视| 日韩射图| 久久午夜色播影院免费高清| 欧美97超碰| 91热热色| 九热中文字幕| 国产强奸乱伦第1页| 99蜜月精品久久| 久久久久久久久九九久孕交| 777AV电影| 亚洲激情综合另类| 亚洲中文字幕在现观看| 久久久久久亚洲中文| 操逼日批| 日韩性爱再线视频| 超碰性爱97| 超碰人妻久久人妻中文97| 台湾肥佬网一区二区三区| 国产精品2020| 日本高清加勒比| 精品国产乱码久久久久久日本公司| 久久精品电影| 少妇三p| 最新亚洲黄色免费电影| 亚洲欧洲中文日韩女优乱码| 黑人精品成人一区二区三区| 看日韩美女二区三区免费操逼视频 | 久久久少妇诱惑精品视频| 欲女人妻性色av| 久久噜噜噜精品国产亚洲综合| 亚洲日韩少妇一道本视频| 欧美综合传媒| 看全色黄大色大片免费视频| 少妇3P性爱自拍| 亚洲成?V人片在线观看福利| 超碰亚洲97| 偷拍超碰| 日本一线产区和二线产区伦理片| 日韩簧片免费看| 嫩草影院在线观看精品| 91 手机在线播放 绯色| 91精品久久久久久久久久| 欧美图片校园春色| 国产精品点击进入在线影院| 强免费黄色网址| 国产av尤物| 情色av电影| 97精品97久久| 99少妇精品视频| 97色诱| 久久久天美| а√天堂资源官网在线资源| 唐山老熟妇露脸啪啪叫| 青娱乐导航AV| 97日韩欧美亚洲| 日韩熟女无码| 九九Av| 诱惑人妻欧美一区在线播放| 人妻精品一区二区三区| 18禁中文字幕| 一区二区三区四区五区高清无码永久视频 | 欧美第一页| 爱妃国产亚洲视频中文字幕| 五月婷婷六月丁香| 另类欧美色| 国产一区二区三区导航| 成人久久精品| 精品三级在线专区| 人妻嗯啊啊在线播放| 一区二区三区成人| 国产视频一区二区三区在线免费观看| 爽爽淫人网| 2017天天透天天通天天擦| 麻豆久久精品亚洲精品88| 蜜桃无码AV一区二区| 天天综合香 ld视频| 91精品国产一区三一| 午夜黄色免费在线观看| 国产午夜精品一区二区三区牛牛| 91天天c| 天天干18禁| 在线观看亚洲专区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 超碰性爱97| 天天综合-91入口| 色五月大香蕉| 欧美色综合网| 日韩一级二级| 国产99999| 夜夜肏2021| 干B网| 国产精品一二三免费网站| 亚洲综合嫩| 色噜噜人妻丝袜a∨先锋影| 欧美 亚洲 另类 综合| 黄页av| 五月天开心网| a男人的天堂久久一级A毛片| 九九九久久久久| 乱伦熟女论坛| 国产男女无套97| 自怕偷自怕亚洲精品| 欧美 亚洲 91| 婷婷精品| 无码久久亚洲高清,| 亚洲综合99999| 一区二区三区免费视频入口| 欧美精品丝袜久久久中文字幕| 九九九久久久| 啊啊啊啊啊啊啊在线| av日韩在线观看电影| 欧美人妖内射| 久久最新免费视频23| 99e久久国产精品| 骚熟女吞| 婷婷久久综合| 人人玩人人添人人澡免费| 久久99精品国产| 能直接看AV的网站| 91香蕉国产尤物视频| 久久做97| 狠狠色综合网| 亚洲综合中文字幕有码| 香蕉精品二区二区| 啊啊啊好疼| 五月丁香婷婷综合| 人妻献身系列第54部| 加勒比伊人综合| 色五月综合网| 精品中文字幕第一页| 91黄射| 国产精品经典一卡久久久 | 欧美激色| 天美av在线观看| 免费在线黄片视频| 欧美Ⅴ性爱| 九九热在线精品视频| 欧美成人黄网色网站| 久久免费9| 在线亚洲丝袜视频网站| 欧美亚综合色图| 国产无马视频| 日本操逼无码| 青青草中文字幕| 欧美久久久| 亚洲天堂东京热| 日韩av一级黄片| 国产超碰AV在线精品| 欧美97网| 91少妇通奸网站| 骚乳在线| 伊人97色天使| 五月色综合| 两性色网| 亚洲日韩视频二区| 国产高清视频无码在线| 性91| 96国产精品| 亚洲黄色网址| 久久女同性恋一二区| 欧美综合站| 在线观看黄色电话| 狠狠色噜噜狠狠狠狠狠色综合久久 | av2014 日韩在线中文字幕| 国产久久日韩网站导航| 97玖玖人妻| 男人的天堂啪啪啪啪啪蜜桃不卡| 久久久久久久久久8888| 欧美黄色大香蕉一区二区| 亚洲欧美自拍偷拍| 欧美一区二区三区另类精品| 中文字幕日韩精品久久| 一级日本牲交大片好爽在线看| 91综合色| 天天看天天干| 日本色色视频网站| 国产成人超碰在线| 天天激情干| av天堂精品久久| 黄片国产精品一区二区| 亚洲 日韩 丝袜 熟女 变态| 欧美日韩国内不卡| 9999久久久久| 久久婷婷一区二| 丁香五月天婷婷姐| 久久欧洲| 操少妞在线视频| AV色五月天| 十八禁电影伊人网| 国产999精品久久久| 九九热精品视频六| 草草草草视频| 久久精品国产亚洲妲己影视| 操婷婷逼| 亚洲18禁| 性性欧美| 丰满熟女一区二区三区在线播放| 欧美视频一| 天天激情综合站| 色婷婷视频| 俺去俺来也在线www| 97最新在线播放视频| av九九| 少妇无码太爽| 中文字幕AV片| 啊啊啊啊免费视频| 囯戸精品高潮呻吟旡码| 97久久久| 日韩情色视频| 99在线精品观看视频中文| 成人情色一区二区| 久久一级无码精品毛片6| 丁香六月啪| 欧美久久九九| 国产午夜视频| 欧美性色欧美| 亚洲国产综合图区中文字幕| 亚欧性爱ab| 亚洲1区| 欧美色图天堂在线| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 久草婷婷| 久久青娱乐| 亚洲麻豆av一区二区| 亚洲国产91精品一区二区久久| 久久美女国产| 骚货| 国产sv美女内射| 国产无码高清操逼视频| 日韩欧美麻豆大片| 久九九九九九九九热| 精品人妻视频入口| 五月丁香综合| 国产精品3| 日本人妻伦在线中文字幕| 欧美成va视频网站| 国产亚洲精品美女| 日本黄大片在线观看视频| 亚洲成人在线播放| 好爽要喷了| 一级人妻性爱视频| 啊啊啊啊啊啊在线看| 自拍第一页| 一区不卡在线观看av| 久久久久9999| 久久久久久久| 婷婷亚洲综合| 中文字幕av片| 九九热九九| 综合天天。| 免费的很黄很污的全部视频| 欧美 亚洲 综合 制服 另类| 黑人嘿嘿嘿超爽免费视频| 中文字幕丝袜美腿| 久久9久| 色色色综合网| 日本不卡一二区| 色优久久| 蜜臀久久99精品久久久久久婷婷| 天天操夜夜操| 七月婷婷综合| 国产精品网站免费| 99re热有精品视频国产| 东京热不卡视频| 可能人人看人人摸| 久久中久文96| 狠狠爱综合网| 夜夜爽夜夜高潮夜夜爽| 欧美日韩高潮喷水91| 天天看片青娱乐| 男人天堂一区二区| 久久久中文| 99久久com免费视频′| 在线日韩日本亚洲国产| 欧美日韩免费专区在线| 国产高清吃奶免费视频网站| 91日产欧美| 日本免费专区| 久男人久久| 女人被添高潮免费视频| 超碰吊日色| 超碰在线国产| 久久久精品91八戒| 久久久精| 夜夜一区二区| 久久成人国产| 91精品婷婷国产综合久久| 一区二区三区视频在线观看免费| 久久香蕉国产线看观看亚洲女人 | 日韩精品亚洲专区在线影视| 久草色在线观看| 午夜人妻精品综合在线| 国产二区三区免费视频| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 亚洲视频精选| 内射黑人| 在线观看AV片| 久久久久久综合久久伊人蜜月| 一本一道vs波多野结衣| 九九九九一区| 在线只有精品| 欧美AB在线| 欧美亚洲一区二区久久久婷精品大包诱| 一本色道综合久久欧美| 香蕉大久久久| 久视频在线观看| 99re国产精品视频| 97国产超碰| 国产十八禁视频| 99热只有| 中文字幕91页| 99久久久无码国产精品性啊聊| 玖玖爱一区在线| 99久久综合| 国产一区自拍欧美日韩| 久久天堂| 亚欧美综合网| 国产精品不卡一区二区三区| 色99在线| 日韩中文字幕二区| 日本精品不卡一二三区| 亚洲综合另类小说色区亚洲成av人片在www | 夜夜草天天| 国产女主播视频在线观看| 国产馆极品诱惑| 国产伦乱91| 亚洲啪AⅤ永久无码| 亚洲成成熟女人综合一区二区| 午夜精品久久久99| 亚洲国产精品久久久久久久久久| 手机看片1024你懂的国产| 人人干人人操人人爱| 97伊人超碰| 老司机久久| 男人下部插入女人下部| 亚洲第一页色| 日日狠狠久久偷偷色综合免费| 亚洲AV无线| 亚洲A曰本VA欧美VA视频| 色色九区| 色97干| 欧美性色欧美| 久久久涩| 96国产精品| 91女优在线观看 | 在线不欧美| 黑人性欧美| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 丁香五月激情综合| 激情综合色| 熟女突然公开看18禁影片| 亚洲无码免费看| 宅男影院久久久,99| 成人午夜高潮av猛片| 国产老太乱伦一区| 国产成年女黄特黄| 澳门黄片一香蕉视频| 97这里只有精品| 东北熟女91| 亚洲熟妇A V黑人| 成人性生活高清视频在线播放| 2020天天色综合| 9997se| nuu12国产麻豆精品| 色777999综合| 精品日日人妻| 不卡中文字幕aⅴ在线| 少妇一级婬片免费放一级a性色.| 中文字幕国产| www.婷婷| 中文字幕91综合| 欧美少妇一区二区三区| 99久久综合| 九九自拍伦理| 国语精品av| 国产日韩久久| www.黄色在线| 婷婷尹人大香蕉免费| 亚洲 欧美都市激情| 久9久| 性性欧美| 九九九九九九九九九国产精品| 欧在线一二区| 久久riav中文精品| 99亚洲精品| 久久天天躁日日躁狠狠躁| 免费亚洲国产精品久久一区| 99re这里只有精品9| 日韩免费在线观看不卡| 亚洲制服欧美另类内射| 国产馆极品诱惑| 操逼999| 五月天婷婷社区| 一级黄色性爱裸体视频| 亚洲精品啪视频| 日韩三级久久久| 天天日天天操VV| 伊人网在线点播| 91人妻人人澡人人爽人人精品| 手机在线A片| 天天日夜夜爽| 男人精品天堂一区| 91综合在线| 欧美专区日本专区| 欧美综合制服在线| 国产老女人久久毛| www久久久| 热热热热日日漂亮永久永久国产日| 欧洲站一级二级三级h| 成 人 A V免费视频在线观看| 浪人综合网| 女人天堂AV五区在线| 四虎影视永久在线观看精品免费网站 | 综合久久2017| 久久久精品视频免费观看| 久久一二三四五六七八九区区区 | 伊人精品久久网站| 九九玖玖精品| 久久日本熟妇熟色一区| 免费看日产一区二区三区| 亚洲视频一二区| 大色综合| 大香蕉亚洲中文| 精品无码一区二区三区| av绯色| 日日夜夜噜| 自拍偷拍 日韩欧美| 午夜免费视频1000| 96超碰网| 欧美色五月| 九热超碰| 色综合色欲色综合色综合色综合| 啊啊啊不要嗯嗯在线观看| 性爱视频啪啪啪啪| 好看的久久不射无码影视影院| 天天躁日日躁狠狠躁| 太久视频| 啊啊啊好舒服好爽啊啊啊视频| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产成年精品高清在线观看91| 天天干一区二区| 日本精品五区| 久都青青视频| 国产强奸AV在线| 青青草视频爽一爽| 熟女激情综合网| 欧美色997| 亚洲国产精品成人综合| 亚洲色香| 蜜乳AV一区二区三区四| www男人天堂| 天天综合网站| 青娱乐淫乱1314| 偷拍亚洲高清图片| 欧美日产国产在线成人第一区| 国产丰满熟夫69mpp| 国产精品国产自产高清AV| 97超碰超欧美。| 五月天婷精品激情| 国产馆| 亚州一区二区| 性欧美天天| 一类av片在线看| 加勒比久久av| 亚洲人成网www| 日韩性爱啪啪视频| 久久熟女久| 激情久久av一区av二区av| 欧美日韩狠狠爱| 97亚洲一区| 久草免费福利在线播放| 久久久极品| 九九精品美女高溯喷水| 99精品欧美一区二区三区桃色| 亚洲加勒比色图| 久久久 国产精品| 天堂精品| 超碰97爽| 免费啪啪一级视频| 日本一级真人黄色性爱视频| 999综合色| 久久综合婷婷| 超碰在线香蕉| 久艹日日日| 青青草成人视频在线观看二区| 亚洲性爱无码乱伦av| 超碰地址久久| 久久精品中文字幕女同| 青青网三级视频| 久操凹凸视频| 日韩一级二级三级免费看完整版| 97丝袜亚洲在线播放| 日本一级一级一级一级| 国产av又色又爽又黄| 亚洲97在线| 欧美一区二区三区成人性生活| 欧美日韩丝袜 | 中文字幕福利视频一区二区三区在线观看| 厕所偷拍在线| 青青草天天亲夜夜操网| 国产人妖的免费的视频| 淫荡网址| 男人的天堂com| 色臀aV| 密臀AV在线| 亚洲自拍97| 国产AB视频| 久久综合超碰| 日韩人妻无码精品系列| 99re6国产精品99re在线| 免费观看啪视频| 377p欧洲日本亚洲大胆| 一本色道综合久久欧美| 欧美日韩97| 久久东京热成人| 天天日熟妇| 美女诱惑在线一区| 天天摸夜夜摸| 99久久com免费视频′| 91丨九色丨东北熟女| 日本操BAV| 伊人一区二区在线播放| 欧美呦呦性爱| 精品无码久久久久久久杏吧| 亚洲欧美不卡线| 色香欲综合| 色臀AV| www.男人的天堂| 午夜美女诱惑电源网| 久久精品综合| 国产精品久久久午夜夜伦鲁鲁| 91处女在线视频| 美女网站黄页| 亚洲97网站| 亚洲欧美啪啪| 蜜桃臀AV在线| 国产白丝在线| 嗯嗯嗯,草死我| 欧美亚洲第1页| 色爱欲亚洲| 中文字幕久久精品一区| 天天激色| 欧美亚洲天天| 中文字幕99999| 乱伦熟女论坛| 日韩图区 偷拍| 乱伦日本色图AⅤ| 女人高潮大叫一级毛片| 3571色综合一区二区二区| 青青草密桃在线播放| 色综合中文字幕不卡| 青青草国产亚洲精品久久| 欧洲亚洲人妻无码中字久久三区四区 | 青青草日本中文字幕| 久草在| 日韩射图| 日本操逼视频在线| 99re公开精品免费视频| 欧美在线干| 伊人影院在线理论播放| 国桃视频产巨乳精品一区二区在线| 亚洲精品无码久久AV| www色日本| 日韩欧美麻豆大片| 天天摸天天舔天天操| 日本精品加勒比海一区| 2023天天操夜夜操| 亚洲福利中文字幕在线| 精品91摸| yazhouzaixian| 97色97干| 被体育老师抱着c到高潮| 天天影视综合网欧美精品| 操操操操网黑人| 久九九九九九九九热| 亚洲高清无毛一区二区| 色婷婷九月| 欧美色图成人网一区二区| 丝袜美腿丝袜| 日韩精品国产一区二区| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 日韩三A大片在线观看| 欧美性爱另类综合| 9 7超碰在线免费观看| 美女十八禁| 国产成人精品必看 | 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 亚洲成人一区二区精品| 超碰久久中文| yazhououmeizongya| 婷婷av在线中文字幕| 国产精品一区二区黄片| 成人片视频| 91这里只有精品| 色99视频| 天天综合站| 日韩乱伦AⅤ| 日日夜夜骚| 9999久久久| 色五月婷婷久久| 加勒比综合a∨| 翔田千里一区二区三区奶水| 日本天堂网| 亚洲影视综合| 亚洲综合伊人无码久久| www国产天美久久久| 粉嫩AV一区夜夜嗨| 精品久久无码午夜福利| 青青欧美在线| 蜜桃狠狠色伊人亚洲综合网站| 色噜噜狠狠色综合日日| 国产精品一区二区麻豆| 亚洲成人性爱在线观看| 99热日| 午夜福利免费福利视频| 亚洲熟女一区| 熟女精品va中文字幕| 亚州 综合 色图| AV天堂国产| 9精品在线| 天天色天天干天天爱| 白丝jkav| 天天视频黄网站| 另类专区加勒比| 国产无码一二三区| 97操碰| 日本三级中国三级99人妇网站| 黄页网站成人免费| 99热思思| 国产精品人妻无码久久久互動交流| 91久久精品蜜臀| 欧美色网| 欧美日韩亚洲高清不卡一区二区三区| 免费看片黄| 中国小夫妻勾搭露脸淫荡对白| 91午夜无码| 97久久天天综合色天天综合色电影| 欧美日韩国产色图在线| 亚洲av资源| 日日干日日操五月天伦理视频| 国产真乱mangent| A男人的天堂| 粉嫩在线一区二区懂色| 久久内射| 日本精品国产视频| AV免费在线播放一区| 3P丝袜熟女 色综合| 欧美日韩夜夜| 日韩欧美aⅴ综合网站发布| 视频在线97| 小少妇| 八戒无码国产午夜福利| 日韩有码回春沙龙第一页| 婷婷99狠狠| 思思视频免费看网站| 视频在线观看青青99国产| 超碰美国| 五月婷丁香| 97视频在线视频| 国产精点久久久成人| 青青草在线视频美女| 精品妇女一区二区三区| 亚洲另类小说卡通动漫| 欧美淫乱视频| 国产视频三区四区| 夜间福利片1000无码| 清纯唯美第一页| 大香蕉欧美伊| 久久婷婷亚洲| 欧美gv在线观看| 激情啪啪视频| 久久国产精品一级二级三级| 国产9 9在线 | 亚洲| 97国产综合欧美| 在现视频女上位好爽| 性久久| 吉田爱美AV在线| 黄aaaaaaaaaaaaaaaaaa色网站| 午夜一区| 97精品国产精品免费观看| 日本国产成人亚洲精品无码| 懂色Av| 久久精品男人的天堂| 亚洲色图久久成人| 丝袜剧情| 强奸抽插av| 在线观看啊啊啊啊啊| 嗯阿好爽好紧| 久操精品网| 内射老妇BBWX0C0CK| 综合少妇网| 东京热熟女亚洲视频网站| 日本 欧美 亚中文字幕| 艹比视频国产精品| 成人免费视瓶| 91久久婷婷| 黄色十八禁| 口爆欧美91| 五月婷视频| 国产色呦呦| 久久精品福利影院| 91人妻在线视频| 偷拍99| 久久草视频污视频| 亚洲美欧999| 人妻天堂综合网| 抽插无码高清一区| 国产AV毛片| 自拍偷拍国产欧美日韩韩| 男人天堂东京热| 综合网亚洲1| 色天堂在线观看| 超碰人妻中文在线| 日本一二三高清| 蜜色网色哟哟| 男人的天堂2018东京热啪啪啪| 成人国产精品三级A片| 婷婷丁香五月天亚洲天堂网| 熟女性视频| 99操视频| 狠狠狠狠狠狠| 欧美激情综合| 欧美精品四区| 色色色色色色色色色色色色色色综合| 国产精品成人无码av| 免费看欧美美女黄色大片| 唐山老熟妇露脸啪啪叫| 亚洲第一无码播放立川理惠| 蜜桃视频成a人v在线| 色黄色美女大长腿午夜视频| 国产精品成人无码a v毛片| 日韩无码视频黄色| 操逼日批| 在线国产福利网址导航| 污污汅18禁网站在线永久免费观看| 伊人丁香五月婷婷| 国产高清26uuu| 亚州AV无码国产精品| 日韩中文字幕二区| 天天影视网综合少妇| 日日干夜夜操视频h| 欧亚第一综合网| 伊人色综合欧美| 欧美丝袜91| 91精品国产91久久青草| 中文字幕一区二区免费在线| 日本色色的视频| 蜜臀少妇一区二区| 美女91在线观看| 啊啊啊啊啊舒服| 十八禁黄色| 欧美性生活男人的天堂| 大伊香蕉在线视频免费| 日韩精品99999| 色情亚洲日本成人| 欧美综合综合| 三级日韩一区二区三区| 国产综合网站在线播放 | 午夜福利合集| 亚洲欧美另类激情小说| 草草影院最新网址| 920日本午夜免费| 日韩天天本| 99re这里只有精品9| av在线不卡一区二区三区| 东京热亚洲一区二区| 91挑色欧美| 久久久久久综合久久伊人蜜月| 乱伦a片视频| 久久日韩毛| 久久久性少妇| 日韩欧美成人综合在线| 伊人亚洲国产一成人久久精品,久久| 色天堂综合| 男人在线天堂| 欧美99热| 97频视在线| 另类图片欧美激情综合| 五月婷婷激情| 日本国产二线女色| 自拍偷拍亚洲熟女妇人精品 | 91爱| 日韩精品一区的| 亚热日本熟女| 国产一区二区免费福利片| 另类在线| 97超碰公开| 日韩欧美亚洲一区二区三区影院| 欧美72网页| 老熟女乱伦片| 91九久| 美女久久久久久久久久久| 欧美性爱视频免费一区一A| 欧美日韩少妇色情| 蜜乳AV免费观看| www老逼91| 蜜臀在线视频| 91精品电影18| 国产成人久久精品蜜臀| 蜜桃臀av在线观看| 色妺妺AⅤ| 99这里有精品| 欧美 亚洲精品首页| 精品成人av一区二区三区在线| 在线观看视频91| 不卡av在线中文字幕| 国产嫩草精品A88AV在线| 国产免费一区2区3区| 亚洲av夫妻操穴网| 久久久久国产精品久久久| 偷拍 精品另类 凸凹了四区| 欧美日韩亚洲天堂| 夜夜中出国产| 97超碰站| 少妇诱惑视频| 欧美爱三级日韩久久| 久久一二三四不卡| 亚洲精品人妻在线| 色香91| 亚欧高清v| 91欧美情色| 婷婷色婷婷| 极品销魂美女一区二区| 很黄很污的免费网站| a片 xxxx受爽视频| 日日黄色三级网站| 在线综合色| 久久久涩| 久久久精久久久| 日本1区2区不卡视频| 欧美久久人妻少妇一区二区| 黄片aaaaa一区| 中文字幕视频二区| 日本一区二区三区精品| 久久国产免费激情视频| 亚洲AV色图一区| 日本免费中文一区二区三区四区| 老熟妇乱轮| 九一综合网| 91久久婷婷| 日韩无码一级黄色av片| 国产亚洲日本| 热久久这里只有精品| 日韩三级在线观看网站| 日韩精品电影| 丁香五月av| 亚洲日韩视频二区| 丝袜美腿91| 亚洲综合码| HEYZO高无码国产精品227| 成人性生活高清视频在线播放| 97爱欧美| 欧美在线干| 中文字幕日韩精品久久| 插插综合网天天影视网| 久久精品免费| 无遮挡猛进视频免费无限观看| 另类天堂| 国产精品一二三| AV天堂电影网| 色噜噜综合网| 国产网红精品| 国产激情视频一区区三区| 69久久久久久久久久久久久| 亚洲国产第一页综合视频| 欧美综合娱乐久久| 亚洲国产精品无码AV久久| 亚洲清纯唯美| 国产精品亚洲四五区在线观看| 最近的最新的中文字幕视频| 四虎国产精品永久入口| 午夜经典| 综合激情一一91| 欧美香蕉视xxx| 日本欧美成人片AAAA| 青娱乐国产精品| 日韩欧美操逼xxx| 亚洲加勒比| 婷婷丁香人妻 | 婷婷丁香激情| 亚洲少妇视频| 91亚洲狠狠色| 亚州男人的天堂| 天天日天天舔东京热| 日本特黄f c2| 亚洲夜夜欢无码一区二区| 思思热国产在线视频| 亚洲成人精品在线一区| 久久97超碰| 天美传媒麻豆一区二区三区国产精| 超碰综合色| 九九热超碰97亚洲最新香蕉| 狠狠狠一区二区三区| 婷婷五月天成人网| 日韩不卡av一二三| 女人喷水视频在线观看| 蜜乳Av成人片网站| 久久性生大片免费观看性| 亚洲视频精选| 亚洲人妻爽爽爽| 少妇色欲综合网2| 91精品婷婷国产综合久久| 综合九九| 女上位精品在线| 超碰一区二区| 男人天堂网手机版婷婷| 亚洲精品97中文字幕| 亚洲综合性网址| 欧美影音在线| 99re热| 成人精品水蜜桃久久久久久久| 999 久久久| 日日日大屁股骚女人精品| 欧洲精品网| 粉嫩av一区二区三区四季| 嗯嗯啊啊的视频| 久久久91福利姬| 另类图片五月天| 天天干夜夜鈤| 超碰免费人妻在线| 亚洲无码偷拍| www.yeyecao| 两性色网| 日韩精品一区二区三区色欲| 狠狠色综合网| 亚洲情色电影网| 日韩AV色图| 高潮综合网| 国产人人干| 亚洲无码一区成人免费午夜| 久夜视频| 日韩高清黄片| 久久精视频美日韩在线视频| 五月丁香综合啪啪| 天天爽爽爽爽| 美女大乳久久久久久久女人18| 伊人青青草久久| 亚洲色图第一页| 日日骚一区二区三区| 97超碰色色| 波多野结衣一级视频| 探花一区在线| 91久青| 91老熟女老女人国产老太| 色噜噜人妻av中文字幕| 精品少妇999| 人人潮人人摸| 色婷婷在线视频| 久久久穴999| 91蜜臀人妻中文字幕在线| 亚洲 暴爽 AV人人爽日日碰| 日本三级一区二区 在线| 免費黃色視頻觀看一| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 精品福利| 顶级丝袜熟女一区二区三区| 激情丁香五月| av东京热男人的天堂| 国产激情在线| 国产日韩区| 91粉芽高清在线一区二区| 无码视频一区二区| 美女9118禁| 干干干天天| 成人精品电影| 四虎精品亚洲| 免费观看性欧美一级| 91九色首页| 性爱AV天堂| 丰满人妻区一区二区三| 免费看欧美美女黄色大片| 日韩欧亚太美不卡| 91无码人妻精品一区二区三区蜜桃| 日韩成人私密一级精品av| 国产无套粉嫩白浆在| 精品十三区| 啊啊啊啊网站| 色婷久久| 一区二区亚州激情久婷婷欧美| w w w.久久精品| 亚洲免费看片| 亚洲高清在线se| 在线岛国新天堂8| 天美传媒av 在线| 懂色av中文字幕| 淫荡少妇免费| 亚州色图狠狠干| 91青青草| www.狠狠| 天堂亚洲精品| 日本高清一区二区在线| 九九九九九九九九九五码| 欧美欧美啪啪视频| 蜜桃色色网站视频三区| 精品夜夜澡人妻无码AV| 久久精视频美日韩在线视频| 亚洲综合九| 1级午夜影院费免区| 情色av电影| 91免费看一区二区三区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 久久久久9久久久久| 亚洲在线91| 少妇超碰在线| 伊人网高清| 国产女人高潮视频| 中文字幕在线免费观看 | 内射黑人| 麻豆视频国产一区二区| 91在线综合网| 无码精品久久久久久亚洲| 日韩在线视频1234| 懂色Av| 久久久久久久少妇| 99精品国产户外露出| 96AV久久久| 少妇一区二区三区精选| 乱老熟女一区二区三区| 欧美1区二区三区公司| 亚洲区限制级| 国产乱人伦AVA麻豆软件.| 久久↗↗| 亚洲另类电影| 久9九综合在线| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 欧美精品四区| yw尤物av无码点击进入麻豆| 女同性恋一区二区三区精品视频| 91久久久亚洲| 天天干天天中出av| 秋霞无码av鲁丝片一区| 日韩欧美中文字亚洲慕| 久热这里| 亚洲欧美国产中文视频| 精品然女一区二区| 黄色av片三级三级三级免费看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场| 91动漫操逼视频| 91精品丝袜久久久久久| 素人美腿视频网站| 嫩呦国产一区二区三区AV| 欧美激情黑人| 美女超碰978| 色操逼网| 色与欲影视天天看综合网| 欧美淫穴| A 在线网址| 清纯唯美综合| 麻豆性爱视频在线播放| 黄色av片三级三级三级免费看| 熟女熟妇一区二区三四区| 69AV女优男人的天堂| 综合久久久久久久综合网| 综合亚洲网| 麻豆影音天美视频| 欧美一级黄片免费播放| 天天看天天日天天操| 国产免费久久精品99re韩国| 中文激情网| 亚洲?V无码专区在线电影| 国产尤物在线三区| 久久111| 亚洲精品亚洲人成人网| 午夜福利一区二区影院| 中日韩久久久免费看| 草b在线| 国产欧美亚洲精品a第2页| J?P?NESEHD熟女熟妇伦| 曰本特级特黄特色黄色A级网站高清在线免费看 | 精品美女久久一二三| 极品色社| 精品国产久热在线观看| 另类亚洲一区二区三区| 98超碰欧美| 加勒比伊人综合| 麻豆AV一区二区| 婷婷色综合| 亚洲av无线观看| 豆花视频操逼网址| 青青草好吊色| 九久久精品| 三上制服丝AV| 国产999精品久久久久久| 国产成人手机视频激情| 国产高清午夜成人在线观看| 欧美综合亚洲| 97超碰中文| 天天看人人操屄犊摸阴| 人妻熟女字幕一区二区| 亚洲欧美国产成人综合不卡| 国产三级资源在线观看| 国产久久久久久| 亚洲资源吧| 天天热精品| 国产精品不卡一区二区三区| 干B视频伊人网| 五月天激情网图片| 久久婷婷综合国际产色怕| 国产成人精品必看| 26uuu最新| 黑人猛交| 中文字幕在线免费观看 | 久久久久96| 加勒比综合a∨| 亚洲成人妻日韩在线| 中文字幕版| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚洲无码电影久久久| 综合色好色| 久九九九| 97在线免费观看视频| 97欧美日韩| 欧美亚洲图片| 亚洲欧美首页| 亚洲情色综合| 99色网| 2023天天操夜夜操| 中英熟女操女| se吧提供91精品国产91久久久久久| 91色交| 98人妻精品一区二区色欲| 在线a亚洲视频播放在线| 亚洲一区二区在线观看91| 久久六六| 伊人网青青| 国内精品久久人妻性色av| 无码免费在线观看黄色片| 蜜乳视频网站| 久久无码成人| 亚洲av淫乱| 十八禁视频网站| www.狠狠| 九九九久千久久激情蜜桃在线看 | 人人操人人爽人人操人人| 毛片一区二区| 成人无码在线视频网站| 欧美1区二区三区公司|