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

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
返回資訊列表
久99热| 国产成人精品网站| 无码人妻精品酒店| 日韩操人| 欧美精品宗合| 精品国产99| 国产精品高清2021在线| 夜夜操一区二区| 精品国产乱码久久久久久口爆网站| 精品一二三区女同| 欧美色五月| 日本影视久久免费| 强奸国产精品视频| 久久是精品| 无遮挡男女激烈动态图| 国产天天骚| 亚洲交性| 有码人妻系列| 日夜干射色啊| 熟女久久| 9l视频自拍9l九色成人| 粉嫩av一区二区三区四季| 国产成人www免费人成看片| 91丝袜美腿网站| 无码操逼视频一下| 秘书高跟黑色丝袜国产91在线| 妺妺跟我一起洗澡没忍住| 97chaopenrihan| 蜜臀久久99'精品久久久| 333kkkk·亚洲com久久| 久久精品高清AV| 67194无码不卡| 日韩伦理视频| 精产国品一区二三产品| 五月天久久婷婷亚洲| 久久国产精品一级二级三级| 亚码激情| 好屌色综合| 亚洲色综网| 91女色| 外站AV在线| 澳门黄片一香蕉视频| 自拍偷拍国产欧美日韩韩| 亚洲第一精品在线视频| 99热精品免费| 神马午夜久久| 国产午夜精品理论片a大结局| 日本伦乱九九九综合| 亚洲最新av无码成人精品区| 91狠狠综合久久久| 9长久久精品| 五月天日日操夜夜操| 天天噜| 殴美在线AⅤ| 日日干夜夜干| 久久久久女教师免费一区| 国产精品熟女一区二区三区| 国产欧美日韩精品中文| 精品网站99999| 精品人妻15区| 久久老子无码午夜伦不卡| 婷婷四五区| 色五月AV在线| 婷婷视频在线免费观看| 明星性猛交ⅹxxx乱大交| 欧美日韩黄片精品在线| 日韩97视频!在线| 日韩欧视频| 熟女突然公开看18禁影片| 十八禁黄色成人网站观看| 超碰97综合在线| 日韩精品在线观看网站| 97操综合| 色婷婷基地| 伊人96在线| 人人操人人插人www| 99日精品欧美国产| 亚洲交性| 黄色高清久久无码依人| 在线视频 亚洲精品| 激情综合五月| 嗯嗯嗯啊啊啊在线免费观看| 日韩内| 五月天婷婷久久| 久9爱精品| 日韩精品视频在线观看一卡二卡| 精品十八在线观看| 美女诱惑爱爱| 精品视频免费在线一区| 天堂精品一区| 粉嫩国产精品久久久| 国产成人91一区二区三区| 殴美日韩m| 亚洲在线欧美| 国产精品一区二区久久精品| 国产熟女精品区| 国产精品婬乱一级毛片彝族| 午夜福利一区二区三区四区五区色婷婷| 无码外流操逼视频| 97天天操| 怡红院亚洲怡春院av| 美女露胸露屁股| 日本色色的视频| 97天天搞在线| 台湾佬中文娱乐网久久久久久久久久com| 9997se| 亚洲欧美高清无码| 亚洲国产精品成人无码久久久 | 成全在线观看免费观看| 美国日韩黄色片| 色色热| 欧美亚洲成人在线一区二区三区| 国产精品区在线12p| 天堂俺去俺来也www久久婷婷| 舔人妻中文免费视频| 日本黄色精品专区网站| 91老熟女| 天天日天天舔东京热| 加勒比日本在线 | 99热婷婷一区二区三| 日韩国产十八禁| 亚码激情| 久久国色天香香蕉| 蜜桃成人1区2区3区| 午夜精品探花| 99在线观看| 亚洲AV无线| 午夜超爽| JIZZJIZZ国产精品喷水| 亚洲精品第一| 操操碰| 91人妻Pr| 精品超碰中文在线| 刺激性视频黄页| 九久9热| 久久婷婷在线观看视频| 91在线色| 一本色道久久综合狠狠操| 午夜综合在线| 欧美在线电影| 制度丝袜99| 欧美劲爆视频一区二区| 青青草操逼逼视频| 欧洲小说色图视频另类| 久久久久久免费电影| 精品无码少妇| 岛国片国产成人亚洲播放| 性爱边摸边日免费AV| 欧美性爱视频免费一区一A| 国产超碰| 国产午夜视频| 欧美综合网| 久久九九视频九九视频| 亚洲欲色9532548967一区| 欧美在线视频播放| 一起草高清无码| 亚洲欧美自拍偷拍| 91黑丝美女| 色爱天堂| www99热| 超碰性爱97| 大粗鳼巴久久久久| 婷婷精品视频| 国产三级中文字幕粉嫩| 国产女人高潮嗷嗷嗷叫小说| 女人天堂AV五区在线| 超碰69| 操日韩第| 久久中出在线| 国内偷自视频区视频综合 | 国产精品 午夜福利| 蜜臀久久99精品久久久久久成人小说| av强奸乱轮| 中文字幕精品人妻丝袜| 亚洲男人天堂av| 精品超碰中文在线| 日韩精品影视| 国产一区二区成人av在线播放| 国产18精品亚洲精品| 97高清啪啪| 伊人五月天婷婷| 九九综合九九综合| 国产传媒日韩欧美| 天天综合-91入口| 国产搭汕a级片| 欧中美三级一区二区三区| 亚洲人久久久网| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 午夜九九| 97 国产精品| 东京热91| 精品午夜福利| 日韩电影在线观看网址| 国产精品不卡一区二区三区av| 青青草中文字幕| 少妇厨房愉情理伦片bd在线观看| 综合亚洲欧美精品日韩?v| 麻豆国产97在线| 欧美视频一| 成全在线观看免费观看| 亚洲AV成人无码久久精品播放| 久久久久国产精品片区无码直播| 亚洲成av人片色午夜乱码| 欧美激情五月天| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 啊啊啊无码| 色拍偷亚洲| 久久这里只精品免费福利| 国色天香av| 精品亚洲天堂| 国产精品老熟女一区二区| 久久久久久九九九九九九| 99re国产精品视频| 91麻豆天美传媒HD| 国产aⅴ无码片毛片一级网站| AV天堂电影网| 蜜臀99久久精品久久久久久| 超碰97在线色男人??| 欧美午夜视频| 亚洲国产精品无码AV久久| 欧美传媒一区| 色汉综合| 人人妻人射| 99热99色| 青青草在线视频人人想人人上 | 超碰 国产熟女精品一区| 日韩综合色网| 97在线看| 国产精品制服丝袜清纯唯美| 99re视频在线观看这里只有精品| 国产极品999| 动漫区日韩区欧美区| 亚州男人的天堂| 精品国产91内射久久| 日韩精品资源专区二区| 日本污ww视频网站| 操学生天天| 中文字幕一区二区三区高清| 天天综和| 欧美亚洲| 欧美激情欧美精品| 久久东京热成人| 日韩美女操b| 狠狠操一区二区| 国产农村妇女精品| 黄色二级片网站| 国语人妻精彩刺激| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 人人操人人插 - 百度 - 百度| 日韩免费高清大片在线| 黄片aaaaa一区| julia高潮后不停追击中出| 日本久操视频| 国产树林里野战在线看| 国产精品爆乳懂色蜜乳| 老女人爆菊| 蜜臀在线视频| 久久综合激情| 97香蕉网| 久久久九九| 精品精品精品| 国产精品视频一区二区三区八戒| 欧美色自拍| 色欲无码人妻日韩欧美精品| 国产精品久久久久久久久AV大片| 91在线综合网| 天天色怡春院| 日韩精品 视频一区二区| 欧美伦乱| 天无日色综合| 免费看黄视频亚洲网站| 色图四区| 美女干逼2| 操婢日韩| 久久久天美| 久操网视频| 久久色网| 思思热在线| 亚洲乱色熟女一区| 欧美少妇色图| 欧美 亚洲 综合 制服| 大白逼三四级| 国产第25页在线观看| 97精彩视频网站| 性感美女91影视| 日本激情免费大片| 国产精品在线一区二区| 精品人妻中文字幕4399| 丝袜美女诱惑 91 视频| 乱伦Av网| 亚欧美综合| 天天操天天射天天日| 有码色中文字幕在线观看| 神马久久久久久| 国模一区二区三区| 囯产精品久久久久久久久久梁医生 | 第45页一区二区| 国产无马在线| 日夜干射色啊| 自拍偷拍2025在线观看| 中文字幕免费在线观看| 九九亚洲视频| 97干在线| 伊人久久大香蕉线AV五月天| 国产精品爱欲| 青操影院| 色色激情五月天| 一区二区三区麻豆| 99re不伦| 中文字幕在线观看视频www| 久久青娱乐| 欧美日韩成人在线| 精品国产Av无码久久久亚洲| 国产白丝在线| 操美女高潮抽搐白浆| 97在线免费公开视频| 天天干天天干天天干| 国产呦精品系列在线观看| 欧美图片色综合| 妇女性内射冈站HDWWWCOM| 富女玩鸭子一级毛片| 一区二区无码视频| 日日骚AV| 欧美天天弄| 日本不卡一二区| 97中文天堂| 青青青国产手线观看视频2| 青青草视频久久久久| 伊人网青青| 是还免费视频1727我| 天天爽夜夜操| 国产精品探花在线| 亚洲无码电影久久久| 日日日大屁股骚女人精品| 日韩av不卡在线观看| 亚洲有码视频二区| 玖玖超碰熟| 95精品在线| 国产 日韩 欧美高清| 18精品一二区| 天堂亚洲精品久久老牛| 亚洲午夜免费狠狠干| 日韩欧美大力操| 老熟乱一区二区三区四区| 亚洲情色一区综合| 六月婷婷色综合| 99性爱视频| 男人网站婷婷| 日韩一级二级三级免费看完整版 | 欧美有码亚洲中文字幕一区二区三区四区| 大色综合| 久久黄黄黄| 蜜桃不卡一区二区| 久久免费看高潮毛片韩国| 99热这里只有精品地址| www.大香| 午夜超爽| 国产一区二区成人av在线播放| 欧美日日人人天天| 大香蕉78| 999久久芭蕾| 丰满精品人妻少妇久久字幕| 黑丝少妇麻豆| 色呦呦、国产精品| 欧美综合骚| 日韩无码成人电影| 婷婷五月天成人网| 精品国产www久久| 亚洲欧美色图小说| 亚洲国产精品无码AV久久久| 91综合网| yw尤物av无码点击进入麻豆| 99999国产精品| 国产又粗又长又大的视频| 国产成人啪一区二区| 老鸭窝黄色视频网站| 啪啪视频mP4| 玖玖综合.com| 久久a久久| 久久九七| 国产精品九九| 四季av一区二区凹凸精品小说| 少妇第一页| 国色天香av| 欧美性色欧美| 日本一区二区不卡精品| 巨爆乳一区二区爆乳区| 黄色区免费观看中文字幕| 久久久久亚洲AV无码专区少妇| 国产精品内射婷婷一级二| 亚州综合| 韩国手机不卡无码三级视频| 亚洲成人福利电影免费 | 哈哈操电影AV| 91影视亚洲| 2019午夜福利视频| 综合亚州欧美| 超碰成人人人爽人人爽| 亚洲国产成人精品999| 国产家庭乱伦表演| 日本一区二区三区四区免费观看| 国产无码一二三区| 亚洲激情久久| 一区二区三区日韩欧美| 日韩淫色网| 中文字幕欧洲有码| 性无码专区2020| 91色综合激情| 午夜后入| 中文字幕一二三| 国产 亚洲 一二三四| 国产成年免费大片黄在线观看| 国内毛片国产专区二| www.色婷婷| 亚洲国产精品乱码在线观看| 人妻免费观看| 男人亚洲天堂| 日韩性爱高清免费视频| 久热久一区二区三区| 久久精品人妻一区二区| 久久色精品视频在线| 涩涩涩综合| 欧美性爱精品一区二区| 欧美97视频| 亚州综| 在线岛国新天堂8| 1024日韩| 视频二区熟女人妻| 久久久性| 婷婷伊人綜合中文字幕小说| 欧美成人综合| 91精品国产91久久福利| 91操碰| 久久国产精品熟女人妻| 欧美极品美女aaaaaa级黄片| 五月丁香啪啪| 91欧美丝袜| TS人妖另类精品视频系列| 少妇滛荡视频| 九99久久| 成人麻豆av电影网站| 国产精品女同| 熟妇色99| 97人人干| 91日韩网站| av网页一区二区三区| 欧美色图亚洲色图成人在在线| 国产精品伦理| 啊视频在线| 91碰碰| 九九热久久99精品re| 成人AV素股で擦久久| 日本大香蕉综合网| 欧美,日韩,中文,另类| 日本精品网站在线中文| n1038 一二三区| 国产女人视频三四五区| 无码99| 91人人| 亚洲激情网一二三四区| 精品人妻一区二区三区视频在线| 在线视频日韩欧美国产| 精品女同一区| 色牛牛AV| 亚洲欧美综合图片| 亚洲五月丁香花狠狠干一区二区三区 | 日本韩欧美在线播放a| 亚洲精品97中文字幕| 成人一级性爱| 久久人妻无码毛片A片麻豆| 亚洲精品xxx| 中国熟女网站| 亚洲少妇综合在线播放| 天天天做天天天爱天天天爽| 日韩成人大片在线观看| 中文字幕一区二区无码成人| 99热这里| 中文字幕第9页萱萱影音先锋| 久久这里精品国产99丫e6| 日本性感人妻91| 大香伊人在线一区| 中国一级特黄大片护士| 欧美天天综合站| 国产精品一区二区 尿失禁| 亚洲天堂久| 亚洲欧美日韩夜夜| 九九九九精| 日韩伦理久 久久 清纯| 看黄片视频免费| 色九久| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 日韩人人精品| 青青草在线成人视频| 久久透逼视频| 亚洲图片视频小说| 国产性感骚丝袜在线| 国产乱伦性爱区| 亚洲国产精品久久久久婷婷老年| 91色综| 国产日韩精品人妻久久久久色欲网站| 欧美第五页| 欧美亚洲激情小说| 日韩性爱免费视频在线网站| 特色a在线上| 欧美成人色| 色牛牛AV| 国产黄色小视频网站| 国产精品乱码久久久久久| 亚洲欧美精品一区天堂久久| 欧美一区二区三区另类精品| 亚洲在饯| 青青伊人这里只有精品| 国产最新AV| 九九九九免费视频| 国产丝袜美女诱惑| 欧亚免费视频| 亚州一区二区成人片免费| 人妻丝袜二区| nuu12国产麻豆精品| 久久精品免费| 日本三级中国三级99人妇网站| 免费少妇一区二区| 91春色| 熟妇女伦乱视频视频| A啊啊在线观看| 中文字幕五区| 美女自卫慰黄网站免费| 久久美女国产| 高清无码一区二区三区| 亚洲国产丝袜熟女av| 亚洲天堂电影网99999| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 熟妇人妻一区二区三区| 日韩成人免费电影| 综合欧美日韩在线观看| 黄色电影在线播放综合网站| 国产资源中文字幕在线| 精品78| 欧美少妇高潮| 欧美性第1页| 欧美大色交| 玖玖爱一区在线| 九一综合精品视品av| 久热这里| 六月婷婷色综合| 五月婷婷丁香中文字幕| 亚欧性爱ab| 亚洲 日韩 丝袜 熟女 变态| 丰满岳乱妇一区二区三区 | 青青草玖玖爱| 日韩中文9| 欧美性视频二区三区| 老女人老91妇女老热女| 粉嫩小泬久久久一区二区| 色爱综合网欧美| 久久夜色一区二区| 久插不卡| 九九国产热| 精品少妇人妻| 97中文字幕一区| 天天射天天色成人| 2017天天拍大香蕉| 最新日本中文字幕| 久久精品国产亚洲妲己影视| 亚洲图片日本AⅤ欧美在线| 国内精品a| 日韩欧美成人综合在线| 亚洲成人福利电影免费| 色婷婷狠狠| 精品久9| 女性91网站| 色屁屁影院www国产| 精品中文字幕第一页| h无码动漫在线观看| 欧美丰满熟妇XXXX性ppX人交| 中文久久爆乳| 精品99999久久久久久| 九九久久99| 九九九草| 97日韩| 91成人高清在线观看| 欧美日韩国产中文精品字幕自在自线| 亚洲色诱惑| 久草精品热视| 欧美与日韩97| 欧美大片91| 久久一区二区高清免费| 美日韩成人| 久久九九一区二区三区成人| 色综合 加勒比| 91美女视频| 国产精品一级特黄aaa大片在线观看| 日本在线视频导航| 成人精品视频一区二区| 后入式999| 精品久久久久久中文字幕视频免费| 日韩综合成人免费视频| 激情小说五月天| 亚洲综合小视频小说在线观看| 爱丝福利| 欧美亚洲一级在线观看| 久久久久免费少妇| 97免费视频在线观看视频| 美女久久久久久久久久久| 日韩熟女乱伦中出| 天天干天天拍| 青青草好吊| 岛国片在线播放| 麻豆天美国美国产AV| 欧美在线视频播放| 国产亚洲福利第一页丝袜| 国产又操| 中字一区| 欧美91视频| 日本天天人人狠狠在线日美女 | 国产无码精品无码| 日本福利社| 果冻传媒A片一二三区 | 日本天堂在线播放| 被男人添B超爽视频| 欧美三级不卡| 97爱亚洲| 五月天婷婷小说| 久久精品女同亚洲女同13| 国产AAAAAABBBBB| 国产精品乱人伊人网| 97超碰欧美手机| 91精品国产麻豆国产自产在| 天天爱综合网| 欧美久久人妻少妇一区二区| 内射小黄片| 97超碰色屌| 亚洲一级黄色毛片| 国产四虎在线| 亚洲本色精品一区二区久久| 夜夜操2028| 超碰美国| 中文字幕在线24| 麻豆精品.欧美精品.日韩精品.| 日韩黄色成人性爱| 色与欲影视天天看综合网| 8050午夜少妇无码| 中精品一区二区三区| 国产性爱乱伦AV| 精吧天堂| 国产一区二区三区精品观看啪| 无毛精品| 精品国产精品一区二区| 伊人国产AV| av九九| 亚洲色图欧美激情| 久操99| 97超碰磁| 国产精品电影推荐| 激情啪啪拍91| 91欧美色| 极品白嫩福利在线| 岛国激情视频在线观看| 国产精品熟妇一区二区三| 自拍偷拍 高清无码| 韩国嫰模上门援交视频| 久久激情综合| 国产成年女黄特黄| 国产免费久久精品99re韩国| 亚洲一卡2卡3卡4卡乱码网站 | 操逼视频国产无套| 91处女在线视频| 激情四射五月天| 欧美97| 超碰98综合网| 九九精品热| 国产精品内射婷婷一级二| 日日橹狠狠爱欧美超碰| 蜜桃av综合网发布| 久操97| 久久99草| 日韩精品区二区三区不卡| 强奸乱伦 亚洲一区| 激情四射五月天| 综合色播| 内射老妇BBWX0C0CK| 台湾佬中文娱乐网久久久久久久久久com | 欧美激情内射| 97超碰天天爱天天爱| 欧美性巨大╳╳╳╳╳高跟鞋| 日夜精品| 国产地址二三| 97香焦色区| 黄色大香焦1级‘′‘| 久久色精品视频在线| 亚洲乱色熟女一区| 97超级久久| 欧美白嫩女HD| 裸体美女免费看网站青草| 秋霞一级A片黄色视频| 亚洲欧美骚| 欧美亚州色的图| 91天天日| 人人色人人操在线| 亚洲天堂AV在线播放| 中文字幕三四区| 国产av色网| 精品免费国产二区三区| 中文字幕黑人大片| 一起草精品人妻| 人妻中文字幕精品无码| 超碰97久久| 亚洲交性| 四虎免费在线播放| 中国的操老妇女| 国产精品午夜成人福利| 久久国产三区| 久久综合婷婷| 极品色www影院| 精品国产无码中文| 亚洲中文字幕在线视频一区二区| 97色操| 日韩射图| 大干人妻| 91老熟女91老女人| 经典丝袜一区| 97爱b| 97色涩| 鸥美插入视频| 91日日| 午夜天堂精品久久| 超碰色中文| 曰本精品久久久| 神马视频久久久久久| 亚洲精品99| 99久re热视频精品98| 国产激情在线观看| 日本亚洲熟女视频| 探花精品视频| 亚洲超碰在线| 婷婷五月天丁香花| 色婷婷激情| 国产999精品久久久久久| 99久热| 久久久久久亚洲精品不卡人乳| 婷婷色在线| 天天操夜夜操| 蜜色网色哟哟| 性色国产东北露脸精品视频| 久久久久9999妇女| 国产亚洲精品美女| 综合色久欲| 青青草一区二区高清无码视频| 操一对老熟妇爽上天视频| 青草精品视频一日本久久久久网站| 国产尤物在线三区| 欧美 亚洲 在线| 男人的天堂 在线一区| 欧美Ⅴ性爱| 热久久国产| 老女人91| 欧美综合1性辶| 亚洲91网| 无码丰满熟妇一区二区浪潮AV| 精品久久久久av影院| 天天操天天舔| 九九热精品免费视频| 99热精品国产| 玖玖资源视频一区二区三区| 麻豆成人影音在线| 精品国产乱码| 国产精品午夜高潮呻吟久久av| 丁香五月综合| 青青草色情网站视频| 亚洲国产亚洲天堂| 蜜臀99久久精品久久久久| 欧美传媒| 日本国产成人亚洲精品无码| 天天欧美色| 美女黄码视频午夜| 黄页av| 强奸乱伦亚洲第一页| 六月婷婷综合| 免费久久9999| 97在线免费看视频| 亚洲欧洲精品视频发布| 午夜精品久久久久久久男人的天堂 | 欧美亚洲日韩人妻在线观看| 中文字幕88av在线| 亚洲 欧美 日本 国内 首页| 成人性爱免费播放| 国产精选三级在线观看| 5252色欧美在线| 久久成人东京热人妻| 无码精品久久| 久久久一区二区三区四曲免费听| 欧美成人综合| 性色亚洲| 色色色色综合网| #NAME?| 韩国免费播放一级毛片| 丰满的三级少妇欧美久久久| 青青草日本中文字幕| 91久| 一区二区三区精品视频| 爱爱动态试试看6 0秒| 97国产|免费| 国产99久久99热这里只有精品15| 欧美综合97www| 一级AAA片一区二区三区| 国产Aα| 欧美永久激情一区二区| 91亚洲欧美激情| 午夜久久无码1000合集| 嫩草伊人久久精品| 看日韩黄片| 嗯嗯啊中文字幕| 婷婷10月天青娱乐| 亚洲最新a在线观看| 久久大线蕉一区| 婷婷伊人五月| 日韩欧美麻豆大片| 99操| 日日骚一区二区三区| 欧美色性爱| 97国产色图| 中文色综合| 嗯嗯啊啊操死我| TS人妖另类精品视频系列 | 国产又粗又长视频| 中日高清无码操逼视频| 婷婷激情五月综合| 18禁美女裸体无遮挡啪啪| 自拍欧美| 在线无码视频| 欧美后入视频| 麻花豆传媒剧国产MV出差| 97超碰天天| 久热影视| 97在线青| 岛国视频免费在线观看| 亚洲宗合网| 99在线精品视频| 91久久久视| 2020中文字幕在线| 一本色道久久天天射天天干| 免费视频a级毛片免费视频| 91天堂| 伊人一级免费黄片| 理论久久婷婷网8| 天天内射| 视频在线观看一二三区| 精品区国产区一区二区三区| 香蕉欧美| 91性网| 久久精品日韩专区免费观看| 精品十三区| 91麻豆天美国产欧美日| 亚洲中文字母在线播放| 久久天天艹| 丁香色狠狠色综合久久小说| 97伊人超碰| 91精品国产乱码| 欧美另类自拍 | 国产女人和拘做爰视频 | 太久视频| 天天弄天天操| 97色伦97色伦国产欧美| 婷婷爽人人婷婷爽视频| 天美传媒精品久久视频| 大香蕉伊然在亚洲91| 极品内射| 嫩草 人人网精品| 狠狠躁AV| 97资源超碰| 人妻久久久久久久久久久久久久久| 亚洲成A∨人影院在线欢看| 男女性感激情网站| 99e久久国产精品| 女性喷水高潮在线观看| 69一区二区三区| 色约约一区=区三区| 草B在线| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | a级理论午夜日本| 欧美亚洲另类在线蜜桃| 91艹B视频| 国产中文精品一区二区在线观看| 中文字幕五月婷婷免费| 东京热一区二区三区四区五区六区| 九九九九九九九精品视频| 婷婷五月天AV| 国产刺激视频| 亚洲成人碰碰| 99国内精品| www.操| 九九热超碰97亚洲最新香蕉| 欧美色997| 久久爽爽精品| 丝袜美女诱惑 91 视频| 欧美激情精品| 性爱久久| 国产丝袜美女诱惑| 中文字幕少妇色| 91熟女综合| 久久人人爽av亚洲精品天堂桃色| 亚洲高清男人天堂| 91欧美情色| 五十路熟女人妻一区二区在线观看 | 久久综合女优| 小骚逼被操的爽不爽| 久久华人网| 高清视频一区| 福利视频香蕉免费一区二区在线| 日韩成人私密一级精品av| 99re热有精品视频国产| 伊人五月天激情| 丁香六月综合激情| 中日无幕一二三四区| 超碰97最新人妻| 国产AV线| 91美女在线观看| 天天干天天燥| 日韩国产中文字幕| 手机av天堂久久久久| 鸥美插入视频| 大香蕉手机在线| site:sinbotex.com| 狠狠操官网| 岛国成人av在线播放网址| 亚洲有码 欧美精品| 午夜精品久久久久| 国内毛片四区| 国产一区二区免费福利片| 久草视频在线视频在线视频在线观看| 91九色在线| 宗合情欲网| 日本在线15p| 国产精品懂色tv影视免费观看| 岛国视频一二三区| 志村玲子视频一区二区| 熟女欧美日韩综合婷婷| 国产国产亚洲一二三久久| a'v在线资源| 国产精品成人无码av无码免费| 久久久A∨| 五月开心久久AV官网| 久久系列| 综合欧美日韩在线观看| 欧美久久草熟女| 伊人久大| 国产精品一区二区亚洲人成毛片| 欧美性生活综合| 97 国产一区| 97干在线视频| 在线视频免费播放一区| 亚洲日本男人天堂网| 97网站在线观看| 日本三级A片网站com| 嗯嗯嗯好爽| 蜜桃臀一区二区三区久久| A级国产欧美激情在线| 在线另类| 亚洲国产中文字幕| AA级电影三区| 中文字幕av色| 91亚洲网站| 国产亚洲色婷婷久久99精品91葵花宝典| 九一综合精品视品av| 成人三级片一区二区三区视频| 丰满人妻无码一区二区三区| 精品人妻夜夜草| 久一区久久蜜桃| 中文字幕亚洲在线一区| 在线情色电影 91大 | 天久久久噜噜噜久久国产精品爽爽 | 欧美自拍网| 日本高清有码网址视频| 亚洲黄日韩无码专区| 97超碰久久| 色五月婷婷在线| 91狠狠狠| 久久精品三级影视| 亚洲有码第一页| 久久亚洲欧美中文字幕国语| 2025亚洲男人天堂| 99人妻| 日韩素人无码一区二区三区三州| 欧美97av| 国产女人成人精品视频| 综合网亚洲1| 国产粉嫩出水在线播放| 99热日| 久久久亚洲欧美综合| 日韩欧美资源| 亚洲日韩精品一区视频在线| 加勒比av中文| 国产绿奴视频在线观看| 91丝袜熟女| 亚洲成人av电影在线| 精品无码久久久久| 404操逼福利视频| 丰满人妻一区二区中文| 日本性爱少妇| 日本不卡免费二区| 日本黄 R色 成 人网站| 99热这里只有精品1| 丁香九月激情啪| 综合五月天| 欧美日韩性感| 日本久久女同性恋视频| 美女97超碰| 精品高清一区二区三区三州| 劲爆欧美人妖三区91| 国产一级黄色片在线观看 | 亚洲淫色网中文| 国产网站在线播放| 久热这里| 盗摄 精品 另类 一区| 久久AV无码AV| 久久999久| 黄色av片三级三级三级免费看| 国产黑白丝在线| www.夜夜操| 欧美v日韩v亚洲v最新在线| 欧美天堂日韩三级国产传媒| 午夜国产乱伦视频| 熟女露脸激情自拍视频| 成人短视频在线观看| 国产精品九九九| 精品网站99999| 粉嫩在线一区二区懂色| 欧美日韩在线小说 | 亚洲av热热色| 91成人在线免费视频| 不卡视频一区蜜桃视频 | 激情99| 波多野结衣AV无码一区| 久湿久久| 中文啪啪视频| 尤物黄色在线观看网站| 成人AV在线网站| 美女在线H91| 国产欧美一级在线观看| 亚洲无码日韩电影| 麻豆AV96熟妇人妻| 伊人色综合网电影| 亚洲熟妇一,二,三期| 国产乱子伦一区二区三区免看| 亚洲综合在线视频| 欧美性爱18观看| 婷婷8月天青娱乐| 爽爽爽免费视频| 成人午夜视频免费播放| 乱伦一二三| 欧洲一区二区| 神马久久久久久久久久久久| 免费A V在线| 超碰97人人cao| 亚洲另类色综合网站| 999久久久久久久精| 思思在线免费视频| 亚洲影院365| 国产中文字幕在线观看| 亚洲综合888| www.色婷婷| 乱伦图av| 999久久久免费精品国产牛牛| 亚洲图片偷拍欧美| 亚洲综合图文| 熟妇在线视频一区二区| 操我无码| 亚川综合视频| 97操| 99热婷婷一区二区三| 久9久精品视频| 人妻一区二区三区| 天天插天天射| 思思在线免费视频| 国产最新小视频在线播放下载| 深夜视频| 久热精品在线| 狠狠躁日日躁夜夜躁A| 67194无码不卡| 中文字幕日韩综合| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美偷拍区| 国产高清午夜成人在线观看| 91精品人妻一品二品三品| 日韩欧美水蜜桃人妻| 欧洲乱码一区二区| 殴美牲| 狠狠色婷婷777| 最新日产中文在线麻豆| 青娱乐欧美激情一区二区 | 精品久久97| 999久久芭蕾| 99re6国产精品99re| 日本蜜桃| 亚州综合AⅤ| 日韩三级在线观看mp4| 亚洲不卡不卡中文字幕不卡| 猛交交| 青青草视频久久| 色色热| 亚洲第一页色| 91国产精品在线看| 婷婷中文字幕| 丁香五月色| 99热只有| 午夜免费视频1000| 天天干一干| 婷婷久草一区二区三区| 一区二区激情国产熟女| www.夜夜操| 精品久久視頻在线| 偷拍伦理视频| 国产女上位好爽在线| 国产av白丝| 欧美日韩资源在线| 伊人成人情色综合| 二对二中文字幕。| 日本东京热大香蕉a片| 熟妇精品juliaannAV| 91美女视频在线免费观看| 91欧美性| 欧美亚洲韩国视频十五区| 欧美日韩亚洲少妇寂寞影院正在播放| 妇女乱色二区| 91亚洲人| 一区二区三区免费视频入口| 在线观看不卡一区二区三区| 草莓精品视频在线免费观看| 成人性爱av.com| 欧美激情中文字幕另类小说| 中字乱伦AV| 好吊色在线观看| 天天看人人操屄犊摸阴| 操死我了嗯嗯嗯| 人妻无码一区二区三区久久99| 丰满熟妇大乳做爰| 性色综合网| 在线观看不卡一区二区三区| 亚洲中文字幕久久人妻| 亚洲aV无码成人在线观看| 99精彩视频| 大香蕉十区| 97就爱干| 欧色网址| www.99色| 亚洲成A∨人影院在线欢看| 五月丁香六月激情综合| 精品一区二区三区最新| 999 久久久| 91bbbbbb| 国产精品一区av在线| 国产AV高清AV无码| 97久久资源| 91欧美丝袜| 男人久久天堂| av在线观看不卡网站| 伊人久久婷婷| 国产乱弄免费在线视频。| 熟妇无码视频三区| 99精品国产户外露出|