久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|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
返回資訊列表
欧美综合亚洲综合| 被体育老师抱着c到高潮| 欧美色综合图片| 99热在线播放| 可以在线观看的黄色网址| 久久老熟女| 青青草视频久久久久| 日韩av影片在线观看| 欧美第一页| 久久久久久99999国产精品| 日韩内射视频| 亚洲春色激情小说| 粉嫩绯色AV一区二区在线| 无遮挡又黄又刺激的视频| 久久偷偷色综合蜜桃| 成 人 影视 一区 二区 三区 四区| 亚洲无码久久久久久久| 亚洲阿v天堂无码z2018| 东北女人无套内谢视频| 91天天美女| 欧美一区二区三区大综合| 久久丁香五月天| 久久五十路熟女人妻| 懂色av一区二区三区天美传媒| 欧美激情黑人| 天美欧美国产| 夜夜操av亚洲一区二区| 色噜噜综合在线| 亚洲成人性爱在线观看| 国产中文字幕在线点播| 国产真实子伦对白| 91精品丝袜久久久久久| 日日日日做夜夜夜夜做无码97| 成人无码专区精品视频| 青青草密桃在线播放| 欧美网站免费| av凤凰久久久| 播播亚洲小说亚洲| 国产精品国产自产高清AV| 男女一进一出视频久久| 人妻精品一区二区三区| av影院十区| 嗯嗯啊啊的视频| 熟女自慰久久久| 亚洲视频,小说| 99热精品青草在线| 婷婷国产精品九区| 日本久久久久久久久| 久久九九网| 自拍偷拍 日韩无码| 在线播放免费av福利片| 大屁股人妻女教师撅着屁股| 亚欧免费观看视频| 曰韩中文人妻视频| 97精| 91精品91久久久久77777俄罗斯老妇姓x| 亚洲色悠悠久久88| 搡老女人老91妇女熟女| 久久久久久九九九九九九| 国产欧美黑人丰满在线| 91蜜臀人妻中文字幕在线| 日本久久999| 久草线上视频免费看| 欧美精品久久| 国产AV天美传媒一区二区三区 | 欧美日韩性爱视屏免费看了| 亚洲精品乱码久久久久久蜜桃麻豆| 日va操| 宅男影院久久久,99| AⅤ片水多多| 秋霞色色影院| 中文字幕日韩电影人妻| 强奸乱伦免费网站| 小日子操bb在线看| 一类无码操逼视频| 97人人操人人摸人人爱| 5278欧美一区二区三区| 欧美丰满熟妇XXXX性ppX人交| 强奸乱伦大香蕉网| 亚洲欧美日韩综合在线尤物 | 国产一区免费午夜视频| 免费一级黄色录像影片| 欧美日韩性爱操大逼| 伊人久操| 五月婷婷色| 五月丁香六月激情综合| 久久久艹艹艹| 国产AV人人 夜夜人人澡| 日韩影片中文字幕一区二区三区| 久久久久亚洲精品| AV中文字幕剧情1区2区3| julia ann久久| 国产97色在线 | 亚洲| 欧美色97| 国产精品无码成人精品| 日本免费专区| 综合一区中亚洲国产成人综合精品| 日本欧美国内在线| 日韩97超碰中文字幕| 啊啊啊啊视频免费| 国产一区二区成人av在线播放| 一本色道综合久久欧美日韩精品| 日韩无码视频黄色| 日本亚洲熟女视频| 操少妇很爽av| 伊人一区二区三区| 精品丰满熟妇人妻一区| 91综合色噜噜| 国产成人欧美一区二区三区的国产| 亚洲无吗在线视频| 调教熟妇 久久久久久| 亚洲精品一区二区三区新线路| 欧美天天综| 后入式视频国产自| 草草草视频| 国产无码精品久久久久久| www.yeyecao| 熟女突然公开看18禁影片| 五月天成人综合| 真实高潮91| 中亚黄色三级大片| 美女网站91| 五月天我淫我色av| 国产懂色精品国产av| 熟女人妻av在线资源,黄色的资源| 98精品国产乱码久久久久久| 亚洲熟女综合一区二区| 无码人妻精品一区二区中文| 久热免费视频| 91强在线播放| 亚州综合色| 亚洲色图日韩精品| 精品久久青青草| 色鬼在线综合| 久草电影网| 性无码专区2020| 久久婷婷综合国际产色怕| 日韩在线视频1234| 国产一| 家庭乱伦麻豆| 自拍偷拍2025在线观看| 国产一区二区三区不卡手机在线| 亚洲好色人妻| 国内精品嫩模A∨私拍小视频| 澳门特级毛片免费观看| 久久久中文版| 国产精品久久| 日本午夜久久电影| 亚洲天堂人人妻| 热热色中文无码| av天堂天堂av日韩| 白丝1区2区3区| 久热99999| 老熟妇乱轮| 日韩中文字幕视频在线观看| 天美传媒Av在线| 亚洲欧美另类图片| 免费中文在线| 中文字幕超碰CAO| 加勒比伊人| 天天操天天舔| 免费成人在线熟妇网| 东京热男人的天堂| 国产一级片| 人妻少妇精品久久久| 蜜臀99久久精品久久久懂爱| 欧美在线干| 狠狠躁日日躁夜夜躁A| 国产色产精品在线观看| 五月丁香久久| 深爱伊人影院| 多乙久久久久久| 欧美精品偷拍| 伊人一级免费黄片| 国产成人资源| 91亚洲网站| 欧美人妻精品一区二区| 欧美97在线观看| 香蕉视频欧美一卡二卡| 操操啪| chaopen97久久| 黄片国产精品一区二区| 色五月69夫妻| 国内毛片欧美香蕉精品| 中文字幕国产精品1区| 天天夜夜rb| 在免费jIzzjIzz在线视频| 91综合国产精品| 在线无码视频| 动漫av中文| 日本熟女中文字幕一区| 国产久久久久影院老熟女| 一级二级三级黑人无码| 国产av热热色| 国产成人自拍视频视频| 日本大香蕉| 91色人妻| 久久久熟妇熟女国产| 人人么人人操| 欧美国产一区二区三区麻豆传媒| 岛国激情视频在线观看| 啊啊啊久久久视频| 国产精品午夜高潮呻吟久久av| 97超碰中文字幕| 黄片免费久久久久久久| 成人久久久精品| 黄色一区二区秘书性感| 丝袜狠狠草尤物 91| 翔田千里一区二区三区奶水| 搞中出视频在线观看| 一个国产在线综合网站| 老司机久久| 手机在线播放国产福利| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 波多野结衣之双飞调教在线播放| 熟女自慰久久久| 精品亚洲成人免费在线| 99热 按摩 日韩| 亚洲国产一区二区入口| 韩日自拍| 九月丁香| 97超碰人人操人人操| caopeng97人妻| 黄色视频60分钟| 欧美青青视频| 天天色播亚洲综合网站| 一本色道熟妇| 国产人妻精品久久久一区二区三区 | 激情六月天| 久操97| 国产白嫩精品久久| 日韩精品国产一区二区| 亚洲Av诱惑| 99无码视频| 大奶的诱惑| 亚洲丝袜B诱惑| 国产操伦| 97鸡把在线视频| 久久综合18p| {男男暴菊gay无套网站| 啊啊啊啊啊好舒服视频| 97人妻碰碰中文无码久热丝袜| 最近二区三区视频大全| 自拍二页| 色色色色电影网| 青青草好吊色| 99九九久久| 亚洲天堂人妻熟妇视频| 欧日韩一二三f区| 国产视频一区二区三区久久亚洲天堂 | 黄色操人| 欧美 亚洲 在线| 中文字幕精品人妻丝袜| 超97在线精品视频| 亚洲色图A| 天天综合网91入口| 麻豆啪啪啪视频| 97精品网| 精品久久9| 五月综合激情| 可以在线观看的黄色网址| 91日日夜夜| 欧美综合骚| 麻豆国产视频精品观看| 青青草在线视频播放器| 日韩欧美成人大香蕉| 国产精品久久久无码AV网站| 91亚洲电影| 日韩AV一区二区三区三州三州| a v网站在线播放| 欧美96精品在线| 先锋音影AV| 久久人妻办公室视频| 无码高清操逼网址| 久久国产精品一区二区| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 国产精品视频在线播放| 一本道综合色图| 99国产在线 精品 视频| 啊啊啊爽爽| 国产精品久久久久久久免牛肉蒲团 | 久久极品一区二区| 99热只有这里有精品| 国产操逼网站亚洲一级黄色| 超碰97综合网| 亚洲五区熟女| 清柠毛片| 黑人黄片在线免费观看| 午夜操逼不卡| 免费a v| 久久婷婷苹果| 久久久专区| 国产人妻精品久久久一区二区三区 | 久久超碰免费的| 91美女中出| 亚洲一级特黄大片在线播放91| 欧美爱爱97| 亚洲日本大香蕉1| 亚州久久9| 日韩97超碰中文字幕| 婷婷中文网| 操逼无码操逼| 国产99999| 综合大香蕉美。| 新97国产超碰| 夜夜高潮夜夜爽| 亚洲综合五月天婷婷丁香| 久久一区二区高清免费| 成人精品久久久午夜福利| 色九久| 久久97视频| 国产诱惑| 欧美韩国你懂得在线 | 不卡一区二区日本视频| 国产三级在线现体验区| 国产亚洲色婷婷久久99精品91 - 百度| 91黄射| 日韩中文字幕宗合在线| 日韩精品作爱导航| 爱啪精品一区| 久久99手机免费视频| 区日韩亚洲乱码av电影| 精品一区二区三区蜜桃臀赵总 | 亚洲AV成人无码一二三久久| 国产精品白丝在线播放| 蜜臀久久久99久久久久 | 欧美人妻一区二区| 91精品久久久久久久久久| 97资源欧美| 在线人妻熟女一区二区三区四区五区| 色色婷婷丁香| 97人人操人人干| 欧美 亚洲 偷拍自拍| 欧美午夜一区二区三区| 精品一区二区人妖| 香蕉人人操tv| 一级啊性爱在线视频| 久久一区二区高清免费| 黑人操一区二区| 日本熟女中文字幕一区| 男男H黄动漫啪啪无遮挡网站| 一本久道在线综合视频| 成年人黄色小视频网站| 久久毛卡| 日本精品高清一二区一本到| 日本精品第一视频在'| 无码抄逼网| 亚洲欧综合另类无码一区| av无码av无码专区| 国产高清成人mv在线观看| 国产高清无码一区三区二区| 激情网色| 日本国产欧美高清在线| 熟女乱伦二区| 国产伦精品免编号公布| 欧美超碰96| 人人澡人人弄| 亚洲s色图| 久久久99999久网站| 另类视频在线| 九草九九九| 亚洲精品熟妇1区2区3区。| 中文字幕人妻丝袜乱一区三区| 东北熟女91| 成人羞羞视频国产| 亚洲精品白浆高清久久久久久| 中国少妇XXXX做受| 亚洲欧美日韩精品久| 操逼日韩无码 | 亚洲三级网址久久最新| 第四色色综合91| 久久欧洲| 欧美超碰人妻97| 午夜精品久久久久久久| 欧美天天干| 超碰97人妻免费在线| 国产日产精品久久快鸭的功能介绍| 国产曰批免费观看久久久| 日本高清一区二区在线| 欧美精品四区| 91美乳| jiujiujiujingpin| 日韩人妻无码不卡网站| 国产粉嫩蜜臀av一区二区三区| 色欲久久久久综合网| 欧美特大AA级黄片| 国产性爱在线视频一区二区| 色噜噜精品一区二区三| 天天做天天爱天天高潮| 中文字幕超碰CAO| 久艹视频在线| 日韩性爱一级片| 激情 欧美 亚洲 小说| 丁香六月激情| 精品视频久久久久九九九九9999| AND人妻系列| 啊啊啊好大好湿| 久久丝袜| AⅤ片水多多| 人人射人人操人人摸| 男人兔费天堂| 天天热精品| 97干在线| AV免费在线播放一区| 免费观看有码高清视频| 日日做夜狠狠爱欧美黑人| 99在线精品观看视频中文| 免费A片三p视频| 精品在线观看视频在线| 欧美色九九九| 偷拍亚洲情色| 三级AV入口| 久久色情| 国产亚洲日本| 亚洲色图欧美| 在线强奷到舒服的无码视频 | 夜夜高潮夜夜爽夜夜爱爱一区| 一区AV| 国产精品视频精品一二| 亚洲 欧美 小说| 91热| 人妻一区视频| 日韩精彩免费| 久久久一区二区三区麻豆| 午夜男女爽爽爽影院视频| av一区二区三区 中文| 区一二区日韩亚洲乱码av电影| 欧美精品系列| 日逼视频日本| 欧美超碰9798| 亚洲综合伊人无码久久| 操逼不卡中文字幕| 蜜臀AV成人精品蜜臀AV久久| 国产精品久久泡妞网站| 玖玖爱免费观看视频| 亭亭丁香激情| 欧美天天综合网版| 天天日天天干天天整| 神马午夜久久久| 亚洲综合20p| 人人色人人操在线| 天天操天天日天天干| 立川理惠被中出无码| 精品色色| 欧美韩日精品99综合| 欧美一级特黄淫片在线观看| 欧美日韩免费专区在线| 大奶的诱惑| 91热爆在线| 青青草字幕AV| 国产操逼视频在线观看| 欧美性战999| 亚洲男人天堂AV| 四虎影院成年人片| 亚洲一二三四区在线免费看视频| 国产精品久久久久久久无码AV| 日韩三级一区 | juliaann精品熟女一区| 日本加勒比无码专区| 青娱乐日韩无码| 试看60秒| 成年人性爱日韩| 粉嫩小泬久久久一区二区| 国产欧美在线观看免费观看| 天天综合AV| 日韩超碰97| 99热这里只有精品9| 欧美色亚洲色| 日本理论在线| 久9爱精品| 国产精品熟女丝袜一区二区| 夜夜国自区| 女人双腿搬开让男人桶| 曰本特级特黄特色黄色A级网站高清在线免费看| 五月婷网站| 亚洲素人网| 日韩美女操b| 久久视频少妇美女| 手机在线视频国内精品| 色亚州人久干视频在线观看免费版| 国产精品点击进入在线影院| 9久精品视频在线观看| 天天激情干| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 九久9精品| 亚洲色婷婷综合久久一区二区三区| 亚洲日韩成人性爱视频| 91在线观看,天天综合| 色色色欧美| 南澳成人一级片在线播放| 婷婷97| 亚洲激情视频| 日韩欧美成人大香蕉| 国产福利一区二| 欧洲乱码视频| 日韩视频啪啪| 久久人妻熟女一区二区| 亚洲 欧美都市激情| 久久狠狠色噜噜狠狠狠狠97| 亚洲天堂第一页| 隔壁邻居波多野结衣中文字幕| 91美女看B| 精品毛片久久久精品毛片| 3级毛片一二| 噜噜在线| 日韩精品人妻中文字幕有码午| 九九九九国产| 97天天爽| 欧美精品23| 97网址97| 97人人干| 欧美福利视频啊啊啊啊 | 人人妻人人爱人人玩| 亚洲综合五月天婷婷丁香| 呦呦一区| 欧美青青视频| 中文字幕成人| 欧美高清18A片| 99re这里| 久99| 手机午夜电影神马久久| 九九九九免费视频| 亚洲精品亚洲人成人网| 欧美激情综合| 91 亚洲情侣偷拍 久久| 欧美日韩99| 张柏芝国产一区在线观看| 日韩精品9999| 久久 国产精品 一区| 亚洲情色综合| 亚洲日韩青青草色月| 人妻日日干| 久久区| 99只有精品| 中国国产精品一区视频| 操久久久久| 欧美色图私拍91| 肉嘟嘟www视频在线观看高清| 人妻欧美| 97热视频在线观看| 97香焦色区| 秋霞无码av鲁丝片一区| 啊啊啊好多水| 东北操逼| 伊人大香蕉在线| 91操人| 美女91网站| 中文字幕一区二区三区蜜桃视频| 久热69九色熟妇97| 亚洲日韩美女中文字幕乱| 97天天操| 91AV天美在线视频| 青青草原人妻| 欧美成人黄网色网站| 操国产逼| 怡春院久久| 久久久久久波多野吉衣高潮| 久久精品国产精品亚洲艾通辽熟妇| 2017人人操,人人摸| 巨乳特殊服务按摩| 综合av影片| 嗯啊不要啊在线| 93人人操人人| 国产性爱强奸乱伦大全| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲色图欧美色18直播在线| 欧美在线l亚洲| 欧洲色色| 亚洲欧美国产其他二区| 久久亚州精品成人Av无| 美女网站91| 国产欧洲精品亚洲午夜拍精品| 亚洲老熟妇xxx| 全免费a敌肛交毛片免费| 亚洲日韩人妻中文字幕一区| 日韩欧视频| 久久超碰97中文字幕| 狠狠操狠狠插| 精品伊人久久久大香线蕉小说| 日韩字幕一区| 亚洲丝袜诱惑| 日本一二三免费久久| 91l欧美在线| 18精品一区| 丁香六月啪啪| 亚洲AV无码成人精品久久| 高清国产成人无码| 国产精品黑人一区二区三区| 亚洲在线a| 欧美BT 亚洲色图| 久久高清无码夜夜操| 北京专精特新企业招聘信息| 啊啊啊好爽快点啊啊啊嗯嗯| 中文字幕在线免费观看视频| 久久香蕉综合一本到3atv| 97在线精品观看视频| 亚欧高清| 人人爱人人乐人人操| …亚洲黄色厕厕女女在线播…| 精品国产乱码久久久久久免费| 久久妇| 99re这里| 国产第二页| 99xav| 极品内射| 四虎影视在线| 婷婷三区| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久精品99久久久久久| 91麻豆天美传媒HD| 综合日韩激情另类图片| AND人妻系列| 日本天堂网| 91老熟女逼| 蜜色网色哟哟| 人妻天天爽夜夜爽爽| 国产av高清版| 久久女人视频| 玖玖爱综合| 吉田爱美AV在线| 欧美色图中文字幕| 丝袜综合色图| 二级久久网| 97精品综合久久网| 日韩av色图| 国产精品suv一区| 欧美少妇性乱| 屁股久久久久久久久| 超碰一区二区| 毛片99-全集电影手机免费观看完整-B029AV| 国产免费一区| 五十路成人在线视频二区三区| 人妻少妇精品无码专区二区密桃| 国产精品动态一区二区三区四四| 蜜臀99久久精品| 9精品久久久久| www国产精品| 本道在线| 激情在线青青操| 99精品人妻| 亚洲av噜噜噜噜噜噜| 日韩av性爱在线播放| 欧美的性爱网站免费| 亚洲国产成人福利在线观看| 国产精品蜜乳AV| 丁香九月激情啪| 色九九九九久| 97内射偷拍| 久草新免费| 日韩 欧美 国产 麻豆| 中出20p| 外国91| 视频一区二区三区精品| 欧美一区二区三区另类精品| 日本日皮视频逼| 久久精品小视频| av操操不卡| 中文字幕在线2| 97色欧洲| 亚洲av青草久久一区二区| 成人av在线播放| 精品成人亚洲午夜电影| 一级A啪啪啪啪| 日韩乱码Av| 97精品综合久久网| yazhououmeizongya| 久久人妻| 国产av又色又爽又黄| 亚洲色图殴美色图激情乱伦| 青青操青娱乐| 久久亚洲人妻| 91日韩网站| 色在线视频导航| 人干人人人操人人摸| 九九热精品| 久久久久久性爱视频| 亚洲综合夜色| 丝袜足交视频| 欧美亚洲色图另类国产| 高清无码国产亚洲| 日韩精品人妻系列无码天堂| 亚州精品人妻一二三区| 欧美影院一区二区三区| 久久九九视频九九视频| 裸体美女免费看网站青草| 大香网伊人久久综合网eew| 99久在线精品99re8热视频在线| 99re99| 最好看的中文字幕在线2018| 91大学精品激情戏| 国产精品久久久九九九| 久久 精品| 亚洲AV无码AV吞精久久久久| 另类综合另类| 人妻少妇久久中文| 亚洲美女av无码| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 最新AVzaixian| 青操影院| 国产精品爆乳懂色蜜乳| 人人操,操人人| 男女打扑克高清网站| 中文熟女五十乱码在线| 久久久夜夜夜| 性爱乱伦视频免费| 9久久精品| 日日橹狠狠爱欧美超碰| 夜夜欢天天干| 亚洲欧美日韩精品久| 亚洲宗合电影| 骚熟女AV网| 欧美激情视频在线一区| 国产版a级片直播在线| 黄色二级片网站| 久久国产精品视频| 国产一级舔足在线观看| 色官网在线| 免费看污网址| 丁香婷婷五月| 99色在线| 淫穴高潮色图| 一级毛片久久久久久久女人18| 亚洲av在线免费观看| 97丝袜亚洲在线播放| 老司机午夜精品视频| 97香蕉碰碰人妻国产欧美| 亚熟hd视频在线| 69精品| 中日高清无码操逼视频| 操淫穴亚洲五月丁香| 蜜乳成人AV| 亚洲综合五月天婷婷丁香| 日本免费一区二区不卡 | 91国产丝袜美女| 日韩色香| 亚洲欧美日韩精品久| 第45页一区二区| 国产AV天美传媒一区二区三区 | 天天干一区二区| 啪啪啪男女亚洲中文字幕99| 99久久久久久久久| 超碰98综合网| 影音先锋乱伦资源| 人妻精品综合中文字幕在线| 天天爽天天操啊啊啊| 99热最新网址| 日韩欧美~中文字| 把腿张开老子CAO烂你| 色九九九综合| 懂色中文一区二区三区| 亚洲91av| 丰满人妻一区二区三区色-百度| 色九月婷婷| 色爽——AV| 家庭乱伦性爱av| 日韩资源网| 亚洲一级性爱视频免费看| 黄总AV色图| 日产欧美电影一区二区三区| 青青草在线视频人人想人人上| 91激情| 国产精品一区二区在钱播放| 国产精品久久| 97网址www| 国产精品99999| 99青草| 国产女同在线观看视频| 中文字幕视频在线观看一区二区| 97色碰| 国产天天骚| 人人么人人操| 亚洲欧美日韩有码| 亚洲欧美色图小说| 久久神马影院| 成人乱人伦一区二区| 爱欲AV| 老熟女搡BBBB搡BBBB视频| 欧洲精品在线播放| 小说区 图片区色 综合区| 欧美激情 日韩精品| 家庭乱伦国产精品| 91黑丝少妇| 91精品人妻偷情| 日韩钢筋无码高清啾啾啾| 韩国一级婬片A片无码天美| 国产第11页| 亚洲精品aa久久伊人| 欧洲一区二区| 激情五月天网站| 97操| 99re只有精品| 国产AV精久久| 日韩欧美~中文字| 久久人妻精品| 激情五月天中文字幕色| 老熟女熟妇| 萌白酱自拍视频| 久久精品女同亚洲女同13| 99热思思| 国内偷拍精品一区二区| 九九亚洲精品| 国产精品自拍欧美在线| 天天操妹子| 少妇国产不卡| 岛国色情视频在线观看| 天天碰久久入| 97色色婷婷| 青青草好吊色| 夜夜高潮夜夜爽高清视频一| 国产精品原创巨作?v网站| 中国的操老妇女| 亚洲国产一级精品毛一级精品看免费视频 | 曰本道人妻久久久在线不卡色视频| 日本色婷婷| dy888午夜老子影视达达兔| 嗯嗯啊啊好疼| 欧美性爱在线无码| 丝袜美腿av女优在线| 精品视频97| 日韩av不卡在线观看| 伦理第一页| 97视频7| 精品一区二区亚洲国产| 东北女人操逼| 精品久久九| 色色婷| 国产强奸乱伦第1页| 欧美综合加勒比在线| 国产一级高跟丝袜| 97日韩欧美亚洲| 黑丝少妇麻豆| 亚洲女毛多水多21P| 精品免费一区| www. 男人天堂成人在线| 天天看,天天做| av黄图片在线观看| 呦女网站| 偷拍欧美激情| 欧美日韩国内不卡| 国产色图乱伦| 亚洲第一男人天堂| 青青草在线视频人人想人人上 | 人人天天干干| 天天上日日上日韩精品| 中出20p| 人妻AV 中文字幕的| 亚洲图片日本AⅤ欧美在线| 欧美中日韩XXXX| 色大香蕉97N| 亚洲激情网一二三四区| 逼操网站| 欧洲久久一二线| 丝袜高跟澳门91视频| 91女在线观看| 国产 日韩 另类 视频一区爱| 亚洲中字幕日本一区二区三区| 欧美精品欧美精品系列| oumeisetupian| AA丁香综合激情| 国产精品永久免费10000| 91狠狠综合久久| 91 亚洲情侣偷拍 久久| 啊好大好舒服| 日韩一区二区三区四区五区| 人妻少妇久久中文字幕一区二区 麻豆 | 中文字幕一区二区韩| 思思热一热婷婷热一热| 91一区二匹| 亚洲骚男同com| 九九夜精品九九在线| 日本在线一二 | 黄片com.| 日本羞羞的视频在线播放| 色九九久九九| 激情五月天校园春色网| 大香蕉在线视频15| 中文字幕一区日韩精| 大屁股人妻女教师撅着屁股| 日韩无码AB| 亚洲激情网一二三四区| 国产一区二区欧美日本| 天堂69亚洲精品中文字| 亚洲欧美不卡线| 亚洲欧美综合网| 日韩熟女视频二区| 中文字幕久久精视频久久大全| 久久99黄色卞西瓜| 六月丁香久久| www成人啪啪18秘 免费| 亚洲欧洲无码bt精品合集| 日日摸天天爽夜夜欢| 人人操人人操人妻人| 天操天操夜操夜月月年年操操| 国产精品视频| 欧美丝袜激情| 大香蕉伊人一区在线观看| 亚洲天堂电影精品一区| 人人干人人操人人..com| 国产探花精品在线| 影视综合无码少妇| 欧美爱三级日韩久久| 中英熟女操女| 国产色产精品在线观看| 综合网 欧美| 亚洲熟女诱惑| www欧美91| 啊啊啊轻点在线观看| 久久九操在线观看| 91欧美另类| 97国产精品国| 四虎 精品 WWW| 台欧久久精品视频| 久久人妻丝袜一区二区三| 久久97| 午夜免费视频1000| 久久久久免费少妇| 麻豆人妻精品一区二区| 国产精品久久久久综合| 亚洲欧美在线观看2021 | 国产精品懂色tv影视免费观看| 国产高清成人免费视频| 国产又黄又爽| 91美女在线| 欧洲精品二区| 91欧美色| 黑人综合网| 中文字幕熟女人妻丝袜| 色香av| 欧成人在线| 青草精品视频一日本久久久久网站| 小电影欧美91| 久久亚洲一区二区色婷婷| 欧美色蜜桃97| 性一级黄色录像片网站导航 | 亚洲精品视频在线| 婷婷五月丁香五月| 色婷婷五月综合| 蜜臀少妇一区二区| 91狠| 91在线视频免费中出| 久久只有精品一区二区三区| 欧美少妇一区二区三区| 日本一片一区| 青青草啪啪网| 中国熟女网站| 97精品视频在线播放| 青青草原伊人网| 夜色91| 日欧操屄| 中文字幕日韩人妻视频一区二区三区| α√在线| 思思热免费视频观看| 99欧美| 富二代亚洲精品99| 久久久∴| 国产又长又大又粗的视频| 日日骚网站| 国产激情视频一区区三区| 亚洲欧洲自拍图片专区满春格| 手机在线A片| 久久草在线综合视频| 蜜臀少妇一区二区| 97超碰天天爱天天爱| 精产国品一区二三产品| 天天干人妻| 淫纸中9区| 午夜欧美精品久久久| 精品一级毛片在线观看| 亚洲字幕一区二区| 99re国产中文字幕| 亚洲欧洲小说图片视频 | 大香蕉人妻| 亚洲无套久久嗯嗯| 91av天美性媒精品视频| 久久色AV线| 男人天堂毛片| 色激情综合网站| 萌白酱自拍视频| 97干在线| 精品丰满人妻一区二区三区免费观| 中文字幕乱码人妻一区二区三区,99精品| 性爱AV天堂| 精品免费囯产一区二区三区| 超碰97人妻免费在线| 欧美一级黄色18片免费看| 女人爽到高潮久久久| 亚洲欧美另类少妇精品| 97超碰国产亚洲精品| 99久久99久久免费精品蜜臀| 乱伦a片视频| 激情av| 男人的天堂欧美| KK色在线影院| 久久AV无码AV| 国产三级日产三级韩国三级| 曰韩av中文字幕专区| 91丝袜美女| 欧美日韩国产色五月综合在线| 2020中文字幕在线观看| 中文字幕久热视频在线| 日韩中文字幕视频在线观看| 欧美日日夜夜| 中文字幕国产| 欧美成人A√在线一区二区| 国产成人久久久精品免费AV| 一区二区三区日韩欧美 | 午夜福利在线合集| 成人久久久| 亚洲 国产 精品一区| 久久久不能久久久久| 日韩成人人妻网站| 成人97人人超碰人人| 日韩乱插| 欧美亚洲丝袜美女电影| 天天天堂影视日韩亚洲91| 亚洲无992tv| 人妻系列无码专区中文有码| 日本亚洲vr欧美不卡高清专区| 在线 欧美 亚洲| 成人97人人超碰人人| 99色色网| 粉嫩av一区二区三区四季| 国产粉嫩蜜臀av一区二区三区| 色婷亚洲五月在线观看| 欧美另类自拍| 9久9久9久9久视频网站| 99re热有精品视频国产| 色婷婷香蕉| 亚洲熟久久| WWW.操逼.COM| 99久久婷婷| 无码操逼天堂| 黄色香蕉视频网站一区| 麻豆国产尤物AV| 久久久神马影院| 中文字幕乱码人妻二区三区| 一二三四日本视频高清| 亚洲成人AB| 亚洲精品国产熟女久久久久久| 日韩AV中文字幕电影| 超碰人妻97| 国产一区二区啪啪视频| 91爰爱欧美| 日韩综合无码一区久久92| 色色色色电影网| 91AV天美在线视频| 亚洲黄色视频在线观看视频| 久久婷婷国产一区二区色| 又黄又硬又粗又长国产视频| 欧美日韩 强奸乱伦| 91黑丝少妇| 日本亚洲嫩草影院啪啪| 国产三级日产三级韩国三级| 色天使大香蕉| 天天综合网日韩| 97色婷婷| 欧美偷偷网| 日韩性爱小视频| 五月激情在线| 欧美激情久久久久| 看免费的黄片| 又黑又大又粗| 日韩天天综合| 大香网站| 亚洲精品一区二区免费在线观看| se吧提供国产乱老熟视频胖女人| 亚洲中文字幕有码视频一区二区三区| 一区二区三区高清| 久久男女激情视频网站| 天美麻豆黄色录像| 美国aaaaa一级黄片| 涩涩久久精品| 无码外流操逼视频| 亚洲91网。| 日韩欧洲操屄视频| 色老汉色| 亚洲āv网址在线观看| 97操97色| 亚洲一级黄色毛片| 国产青一二三| 放黄片放3级黄片没穿衣服| 久久久久精| 七月丁香婷婷| www.四虎在线| 欧美成人免费在线观看| 三级片大波波| 日韩福利综合一区| 97视频在线观看播放与子乱对白在线……| 久久青青草在线视频| 丝袜熟女2P| 探花精品 一区二区| 精品久久在线区一区| 人人性爱视频免费| 老色69| 亚洲中文字幕熟女| 丰满人妻一区二区三区在线| 欧美18老人禁| 日韩激情视频| 韩日性爱av| 加勒比久久av| 天天躁日日躁AAAXX| 日本欧美不卡| 亚洲春色激情小说| 欧美日韩国产成人高清| 久久深夜无码| 伦伦成年午夜免费视频| 超碰精品人妻狠狠干| 黄色av一区二区在线| 成人情色综合网| av片在线观看免费播放| 日韩三级av片| 久久综合18p| 无码高清操逼网址| 老熟女乱伦片| 91粉芽高清在线一区二区| 91亚洲综合在线| 禁止观看美女黄| 伊人久久综合影院精品久久久| 精品无码人妻一区二区免费蜜桃| 国产日韩在线播放| 在线洲亚线| 欧美天天插| 天天澡天天爽日日AV| 精品国产99| 温婉少妇玩3p| 操一对老熟妇爽上天视频| 久久国产精品一级二级三级| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 蜜臀亚洲中文| 亚洲制服aⅴ中文字幕| 疯操AV| 97超碰色五月| 国产精品麻豆免费视频| 欧美国产成人在线| www欧美性爱| 神马麻豆福利院 | 久精品无码av一区二免费国产在线观看| 我要色综合网站| 伊人久久亚洲中文字幕| 亚洲va有码在线天堂| 欧美一品道| 久久久无码国精品无码三区三区| 人人操人人爽人人操人人| 99re6国产精品99re| 1024香蕉视频| 免费久久一级毛片大黄| 国产精品电| 欧美黑人猛交春色影视大全| 天美av在线观看| 亚洲av无码成电影在线播放| 超清中文乱码字幕| 免费精品AB| 啊啊啊啊啊在线视频| 簧片免费看视频| 亚洲国产成人7777| 国产精品伦理| 人妻社区男人天堂| 黄色免费网页无码| 欧美性夜| 亚洲风情综合网|