中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

怎樣注冊(cè)個(gè)人網(wǎng)站互聯(lián)網(wǎng)十大企業(yè)

怎樣注冊(cè)個(gè)人網(wǎng)站,互聯(lián)網(wǎng)十大企業(yè),美橙域名查詢網(wǎng)站,安徽省青年企業(yè)家協(xié)會(huì)通報(bào)優(yōu)缺點(diǎn) 優(yōu)點(diǎn):提高開發(fā)效率,防止SQL注入、對(duì)不熟悉SQL語句的人友好、代碼統(tǒng)一缺點(diǎn):犧牲執(zhí)行能力、犧牲靈活性、弱化SQL能力 在一些小型項(xiàng)目上使用ORM可以大大提高開發(fā)效率,但是在一些對(duì)性能要求高得場景下,ORM可能沒有…

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):提高開發(fā)效率,防止SQL注入、對(duì)不熟悉SQL語句的人友好、代碼統(tǒng)一
  • 缺點(diǎn):犧牲執(zhí)行能力、犧牲靈活性、弱化SQL能力

在一些小型項(xiàng)目上使用ORM可以大大提高開發(fā)效率,但是在一些對(duì)性能要求高得場景下,ORM可能沒有那么合適。

環(huán)境配置

  • GORM:在命令行中輸入如下命令go get -u github.com/jinzhu/gorm即可安裝GORM。

  • MySQL:請(qǐng)參考MySQL安裝教程。

連接數(shù)據(jù)庫

  • GROM官方支持的數(shù)據(jù)庫類型有:MySQL、PostgreSQL, SQLite, SQL Server 和 TiDB。

  • 以連接MySQL為例,GORM連接MySQL非常簡單,其代碼如下:

    import ("gorm.io/driver/mysql""gorm.io/gorm"
    )func main() {dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    }
    
  • MySQL驅(qū)動(dòng)程序也提供了一些高級(jí)配置供程序員在初始化的過程中使用。

    db, err := gorm.Open(mysql.New(mysql.Config{DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source nameDefaultStringSize: 256, // string 類型字段的默認(rèn)長度DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的數(shù)據(jù)庫不支持DontSupportRenameIndex: true, // 重命名索引時(shí)采用刪除并新建的方式,MySQL 5.7 之前的數(shù)據(jù)庫和 MariaDB 不支持重命名索引DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的數(shù)據(jù)庫和 MariaDB 不支持重命名列SkipInitializeWithVersion: false, // 根據(jù)當(dāng)前 MySQL 版本自動(dòng)配置
    }), &gorm.Config{})
    

模型默認(rèn)相關(guān)

  • GORM提供了一個(gè)預(yù)定義的結(jié)構(gòu)體,名為gorm.Model,其中包含常用字段:ID為默認(rèn)的主鍵;CreatedAt記錄了該記錄被創(chuàng)建的時(shí)間;UpdatedAt記錄該記錄被更新的時(shí)間;DeletedAt記錄了該記錄被刪除的時(shí)間,因?yàn)镚ORM中的Delete是軟刪除。

    // gorm.Model 的定義
    type Model struct {ID        uint           `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`
    }
    
  • 將其嵌入結(jié)構(gòu)體中: 可以直接在結(jié)構(gòu)體中嵌入 gorm.Model ,以便自動(dòng)包含這些字段。 這對(duì)于在不同模型之間保持一致性并利用GORM內(nèi)置的約定非常有用。當(dāng)然,我們也可以手動(dòng)創(chuàng)建。

  • 包含的字段

    • ID :每個(gè)記錄的唯一標(biāo)識(shí)符(主鍵)。
    • CreatedAt :在創(chuàng)建記錄時(shí)自動(dòng)設(shè)置為當(dāng)前時(shí)間。
    • UpdatedAt:每當(dāng)記錄更新時(shí),自動(dòng)更新為當(dāng)前時(shí)間。
    • DeletedAt:用于軟刪除(將記錄標(biāo)記為已刪除,而實(shí)際上并未從數(shù)據(jù)庫中刪除)
  • GORM中常見的結(jié)構(gòu)體tag:

    標(biāo)簽名說明
    column指定 db 列名
    type列數(shù)據(jù)類型,推薦使用兼容性好的通用類型,例如:所有數(shù)據(jù)庫都支持 bool、int、uint、float、string、time、bytes 并且可以和其他標(biāo)簽一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 這樣指定數(shù)據(jù)庫數(shù)據(jù)類型也是支持的。在使用指定數(shù)據(jù)庫數(shù)據(jù)類型時(shí),它需要是完整的數(shù)據(jù)庫數(shù)據(jù)類型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
    serializer指定將數(shù)據(jù)序列化或反序列化到數(shù)據(jù)庫中的序列化器, 例如: serializer:json/gob/unixtime
    size定義列數(shù)據(jù)類型的大小或長度,例如 size: 256
    primaryKey將列定義為主鍵
    unique將列定義為唯一鍵
    default定義列的默認(rèn)值
    precision指定列的精度
    scale指定列大小
    not null指定列為 NOT NULL
    autoIncrement指定列為自動(dòng)增長
    autoIncrementIncrement自動(dòng)步長,控制連續(xù)記錄之間的間隔
    embedded嵌套字段
    embeddedPrefix嵌入字段的列名前綴
    autoCreateTime創(chuàng)建時(shí)追蹤當(dāng)前時(shí)間,對(duì)于 int 字段,它會(huì)追蹤時(shí)間戳秒數(shù),您可以使用 nano/milli 來追蹤納秒、毫秒時(shí)間戳,例如:autoCreateTime:nano
    autoUpdateTime創(chuàng)建/更新時(shí)追蹤當(dāng)前時(shí)間,對(duì)于 int 字段,它會(huì)追蹤時(shí)間戳秒數(shù),您可以使用 nano/milli 來追蹤納秒、毫秒時(shí)間戳,例如:autoUpdateTime:milli
    index根據(jù)參數(shù)創(chuàng)建索引,多個(gè)字段使用相同的名稱則創(chuàng)建復(fù)合索引,查看 索引 獲取詳情
    uniqueIndexindex 相同,但創(chuàng)建的是唯一索引
    check創(chuàng)建檢查約束,例如 check:age > 13,查看 約束 獲取詳情
    <-設(shè)置字段寫入的權(quán)限, <-:create 只創(chuàng)建、<-:update 只更新、<-:false 無寫入權(quán)限、<- 創(chuàng)建和更新權(quán)限
    ->設(shè)置字段讀的權(quán)限,->:false 無讀權(quán)限
    -忽略該字段,- 表示無讀寫,-:migration 表示無遷移權(quán)限,-:all 表示無讀寫遷移權(quán)限
    comment遷移時(shí)為字段添加注釋
    • 使用方法如下:

      type User struct {gorm.ModelUserName string `gorm:"column:user_name;type:varchar(20);not null"`Age string `gorm:"column:age;type:int"`Email string `gorm:"column:email;type:varchar(20);unique"`
      }
      

創(chuàng)建記錄

  • 我們可以通過gorm.Create()方法創(chuàng)建記錄,需要注意的是傳遞的參數(shù)是結(jié)構(gòu)體指針,而非結(jié)構(gòu)體本身。此外,gorm.Create()方法也可以創(chuàng)建多條記錄。返回值Result有兩個(gè)屬性,分別為創(chuàng)建記錄錯(cuò)誤Error和創(chuàng)建記錄的條數(shù)RowAffected

    // 創(chuàng)建一條記錄
    user := User{Name: "xiaoming", Age: 21, Email: "XXX@qq.com"}
    result := db.Create(&user) // 通過數(shù)據(jù)的指針來創(chuàng)建// 創(chuàng)建多條記錄
    users := []*User{{Name: "xiaoming", Age: 21, Email: "XXX@qq.com"},{Name: "ming", Age: 21, Email: "YYY@qq.com"},
    }
    result := db.Create(users) // 傳遞切片
    
  • 創(chuàng)建記錄并為指定字段賦值。

    db.Select("Name", "Age", "CreatedAt").Create(&user)
    
  • 創(chuàng)建記錄并忽略傳遞給 ‘Omit’ 的字段值

    db.Omit("Name", "Age", "CreatedAt").Create(&user)
  • 使用鉤子函數(shù):GORM允許用戶通過實(shí)現(xiàn)這些接口 BeforeSave, BeforeCreate, AfterSave, AfterCreate來自定義鉤子。 這些鉤子方法會(huì)在創(chuàng)建一條記錄時(shí)被調(diào)用。

    func (u *User) BeforeCreate(tx *gorm.DB) (err error) {u.UUID = uuid.New()if u.Role == "admin" {return errors.New("invalid role")}return
    }
    

    如果你想跳過Hooks方法,可以使用SkipHooks會(huì)話模式,例子如下

    DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)DB.Session(&gorm.Session{SkipHooks: true}).Create(&users)DB.Session(&gorm.Session{SkipHooks: true}).CreateInBatches(users, 100)
    

查詢記錄

  • GORM提供了First、TakeLast方法從數(shù)據(jù)庫中檢索單個(gè)對(duì)象。

  • First and Last 方法會(huì)按主鍵排序找到第一條記錄和最后一條記錄 (分別)。 只有在目標(biāo)struct是指針或者通過db.Model()指定 model 時(shí),該方法才有效。 此外,如果相關(guān)model沒有定義主鍵,那么將按model的第一個(gè)字段進(jìn)行排序。 例如:

    var user User
    var users []User// works because destination struct is passed in
    db.First(&user)
    // SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1// works because model is specified using `db.Model()`
    result := map[string]interface{}{}
    db.Model(&User{}).First(&result)
    // SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1// doesn't work
    result := map[string]interface{}{}
    db.Table("users").First(&result)// works with Take
    result := map[string]interface{}{}
    db.Table("users").Take(&result)// no primary key defined, results will be ordered by first field (i.e., `Code`)
    type Language struct {Code stringName string
    }
    db.First(&Language{})
    // SELECT * FROM `languages` ORDER BY `languages`.`code` LIMIT 1
    
  • 如果主鍵是數(shù)字類型,可以使用來檢索對(duì)象。 當(dāng)使用字符串時(shí),需要額外的注意來避免SQL注入。

    db.First(&user, 10)
    // SELECT * FROM users WHERE id = 10;db.First(&user, "10")
    // SELECT * FROM users WHERE id = 10;db.Find(&users, []int{1,2,3})
    // SELECT * FROM users WHERE id IN (1,2,3);
    

    如果主鍵是字符串(例如像uuid),查詢將被寫成如下:

    db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
    // SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";
    

    當(dāng)目標(biāo)對(duì)象有一個(gè)主鍵值時(shí),將使用主鍵構(gòu)建查詢條件,例如:

    var user = User{ID: 10}
    db.First(&user)
    // SELECT * FROM users WHERE id = 10;var result User
    db.Model(User{ID: 10}).First(&result)
    // SELECT * FROM users WHERE id = 10;
    

    如果對(duì)象設(shè)置了主鍵,條件查詢將不會(huì)覆蓋主鍵的值,而是用And連接條件。 例如:

    var user = User{ID: 10}
    db.Where("id = ?", 20).First(&user)
    // SELECT * FROM users WHERE id = 10 and id = 20 ORDER BY id ASC LIMIT 1
    

    這個(gè)查詢將會(huì)給出record not found錯(cuò)誤 所以,在你想要使用例如 user 這樣的變量從數(shù)據(jù)庫中獲取新值前,需要將例如 id 這樣的主鍵設(shè)置為nil。

  • 檢索全部對(duì)象

    result := db.Find(&users)
    // SELECT * FROM users;
    
  • 我們可以使用Limit方法限制查詢結(jié)果的條數(shù)

    result := db.Limit(1).Find(&users)
    // SELECT * FROM users LIMIT 1;
    
  • 使用struct和map作為條件進(jìn)行查詢

    // Struct
    db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
    // SELECT * FROM users WHERE name = "jinzhu" AND age = 20 ORDER BY id LIMIT 1;// Map
    db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
    // SELECT * FROM users WHERE name = "jinzhu" AND age = 20;// Slice of primary keys
    db.Where([]int64{20, 21, 22}).Find(&users)
    // SELECT * FROM users WHERE id IN (20, 21, 22);
    
  • 個(gè)人覺得這一部分和原生的MySQL查詢非常地像,只是將一些條件變成了函數(shù),另外一些條件寫在Where方法中作為內(nèi)聯(lián)條件,當(dāng)然,內(nèi)聯(lián)條件也可以寫在FirstFind中。

更新記錄

  • Save會(huì)更新所有的字段,即使字段是零值。

    db.First(&user)user.Name = "jinzhu 2"
    user.Age = 100
    db.Save(&user)
    // UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;
    
  • Update可以更新單個(gè)列,Updates可以更新多列,Updates方法支持structmap[string]interface{}參數(shù)。使用struct更新時(shí),Updates將只更新非零字段。

    // 更新單列
    // User 的 ID 是 `111`
    db.Model(&user).Update("name", "hello")
    // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;// 更新多列
    // 根據(jù) `struct` 更新屬性,只會(huì)更新非零值的字段
    db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
    // UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;// 根據(jù) `map` 更新屬性
    db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
    // UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
    
  • 在更新時(shí)可以選擇或者忽略某些字段,如果需要選擇某些字段,可以使用Select;如果需要忽略某些字段,則可以使用Omit

    // 選擇 Map 的字段
    // User 的 ID 是 `111`:
    db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
    // UPDATE users SET name='hello' WHERE id=111;db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
    // UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;// 選擇 Struct 的字段(會(huì)選中零值的字段)
    db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
    // UPDATE users SET name='new_name', age=0 WHERE id=111;// 選擇所有字段(選擇包括零值字段的所有字段)
    db.Model(&user).Select("*").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})// 選擇除 Role 外的所有字段(包括零值字段的所有字段)
    db.Model(&user).Select("*").Omit("Role").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})
    
  • GORM 支持的 hook 包括:BeforeSave, BeforeUpdate, AfterSave, AfterUpdate. 更新記錄時(shí)將調(diào)用這些方法。

    func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {if u.Role == "admin" {return errors.New("admin user not allowed to update")}return
    }
    
  • 上述提到的方法均會(huì)調(diào)用鉤子函數(shù),如果想不調(diào)用鉤子函數(shù),則可以使用UpdateColumnUpdateCoulmns方法,使用方式類似UpdateUpdates

  • 阻止全局更新

    如果你執(zhí)行一個(gè)沒有任何條件的批量更新,GORM 默認(rèn)不會(huì)運(yùn)行,并且會(huì)返回 ErrMissingWhereClause 錯(cuò)誤

    你可以用一些條件,使用原生 SQL 或者啟用 AllowGlobalUpdate 模式,例如:

    db.Model(&User{}).Update("name", "jinzhu").Error // gorm.ErrMissingWhereClausedb.Model(&User{}).Where("1 = 1").Update("name", "jinzhu")
    // UPDATE users SET `name` = "jinzhu" WHERE 1=1db.Exec("UPDATE users SET name = ?", "jinzhu")
    // UPDATE users SET name = "jinzhu"db.Session(&gorm.Session{AllowGlobalUpdate: true}).Model(&User{}).Update("name", "jinzhu")
    // UPDATE users SET `name` = "jinzhu"
    

刪除記錄

  • 刪除記錄時(shí)需要指定主鍵,否則會(huì)觸發(fā)批量刪除

    // User的ID是1
    db.Delete(&user)
    // DELETE from users where id = 10;// User沒有ID
    db.Delete(&user)
    // DELETE from users;
    
  • 當(dāng)然,我們可以使用帶額外條件的刪除避免批量刪除

    db.Where("name = ?", "xiaoming").Delete(&user)
    // DELETE from users where name = "xiaoming";
    
  • 使用鉤子函數(shù)

    對(duì)于刪除操作,GORM 支持 BeforeDelete、AfterDelete 等鉤子函數(shù),在刪除記錄時(shí)會(huì)調(diào)用這些方法。

    func (u *User) BeforeDelete(tx *gorm.DB) (err error) {    if u.Role == "admin" {        return errors.New("admin user not allowed to delete")    }    return
    }
    
  • 阻止全局刪除

    當(dāng)你試圖執(zhí)行不帶任何條件的批量刪除時(shí),GORM將不會(huì)運(yùn)行并返回ErrMissingWhereClause 錯(cuò)誤

    如果一定要這么做,你必須添加一些條件,或者使用原生SQL,或者開啟AllowGlobalUpdate 模式,如下例:

    db.Delete(&User{}).Error // gorm.ErrMissingWhereClausedb.Delete(&[]User{{Name: "jinzhu1"}, {Name: "jinzhu2"}}).Error // gorm.ErrMissingWhereClausedb.Where("1 = 1").Delete(&User{})
    // DELETE FROM `users` WHERE 1=1db.Exec("DELETE FROM users")
    // DELETE FROM usersdb.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&User{})
    // DELETE FROM users
    
  • 軟刪除

    如果模型中包含了gorm.DeleteAt字段,則模型會(huì)自動(dòng)獲得軟刪除的能力,反之則沒有軟刪除的能力。

    在有軟刪除能力的情況下調(diào)用Delete函數(shù),GORM并不會(huì)從數(shù)據(jù)庫中刪除該記錄,而是將該記錄的DeleteAt設(shè)置為當(dāng)前時(shí)間,而后的一般查詢方法將無法查找到此條記錄。

  • 查找被軟刪除的記錄:可以使用gorm.Unscoped()方法實(shí)現(xiàn)。

    db.Unscoped().Where("age = 21").Find(&users)
    
  • 永久刪除:可以使用 Unscoped來永久刪除匹配的記錄

    // User的ID是1
    db.Unscoped().Delete(&user)
    // DELETE FROM order WHERE id=1;
    
  • 刪除標(biāo)志

    默認(rèn)情況下,gorm.Model使用*time.Time作為DeletedAt 的字段類型,不過軟刪除插件gorm.io/plugin/soft_delete同時(shí)也提供其他的數(shù)據(jù)格式支持

    提示 當(dāng)使用DeletedAt創(chuàng)建唯一復(fù)合索引時(shí),你必須使用其他的數(shù)據(jù)類型,例如通過gorm.io/plugin/soft_delete插件將字段類型定義為unix時(shí)間戳等等

    import "gorm.io/plugin/soft_delete"type User struct {ID        uintName      string                `gorm:"uniqueIndex:udx_name"`DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:udx_name"`
    }
    
    • Unix 時(shí)間戳:使用unix時(shí)間戳作為刪除標(biāo)志
    import "gorm.io/plugin/soft_delete"type User struct {ID        uintName      stringDeletedAt soft_delete.DeletedAt
    }// 查詢
    SELECT * FROM users WHERE deleted_at = 0;// 軟刪除
    UPDATE users SET deleted_at = /* current unix second */ WHERE ID = 1;
    
    • 使用 1 / 0 作為 刪除標(biāo)志
    import "gorm.io/plugin/soft_delete"type User struct {ID    uintName  stringIsDel soft_delete.DeletedAt `gorm:"softDelete:flag"`
    }// 查詢
    SELECT * FROM users WHERE is_del = 0;// 軟刪除
    UPDATE users SET is_del = 1 WHERE ID = 1;
    
    • 混合模式:混合模式可以使用 01或者unix時(shí)間戳來標(biāo)記數(shù)據(jù)是否被軟刪除,并同時(shí)可以保存被刪除時(shí)間
    type User struct {ID        uintName      stringDeletedAt time.TimeIsDel     soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` // use `1` `0`// IsDel     soft_delete.DeletedAt `gorm:"softDelete:,DeletedAtField:DeletedAt"` // use `unix second`// IsDel     soft_delete.DeletedAt `gorm:"softDelete:nano,DeletedAtField:DeletedAt"` // use `unix nano second`
    }// 查詢
    SELECT * FROM users WHERE is_del = 0;// 軟刪除
    UPDATE users SET is_del = 1, deleted_at = /* current unix second */ WHERE ID = 1;
    

參考文章

  • [【官方文檔】GORM指南](GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.)
http://www.risenshineclean.com/news/54423.html

相關(guān)文章:

  • 網(wǎng)站簡介模板在線培訓(xùn)平臺(tái)有哪些
  • seo對(duì)網(wǎng)絡(luò)推廣的作用是站長工具seo綜合查詢?nèi)娼馕?/a>
  • 安徽國貿(mào)集團(tuán)網(wǎng)站建設(shè)企業(yè)文化的重要性
  • 網(wǎng)站建設(shè)好處東莞網(wǎng)站推廣優(yōu)化公司
  • 如何做網(wǎng)站推廣網(wǎng)址服務(wù)器查詢
  • 網(wǎng)站建設(shè)實(shí)訓(xùn)日志想做網(wǎng)絡(luò)推廣如何去做
  • 網(wǎng)站正在建設(shè)代碼seo專員是做什么的
  • 為了進(jìn)一步完善網(wǎng)站建設(shè)seo搜索方法
  • 廣州php網(wǎng)站建設(shè)中國國家培訓(xùn)網(wǎng)是真的嗎
  • 大連手機(jī)自適應(yīng)網(wǎng)站建設(shè)公司優(yōu)化大師官網(wǎng)下載
  • 物聯(lián)網(wǎng)系統(tǒng)開發(fā)正版seo搜索引擎
  • wordpress崩了網(wǎng)站優(yōu)化什么意思
  • wordpress 設(shè)計(jì)沈陽seo代理計(jì)費(fèi)
  • 做網(wǎng)站后臺(tái)的時(shí)候誤刪了數(shù)據(jù)庫的表免費(fèi)大數(shù)據(jù)查詢
  • 做網(wǎng)站怎么優(yōu)化seo搜索引擎優(yōu)化方案
  • 簡潔大氣的網(wǎng)站模板seo為什么要進(jìn)行外部優(yōu)化
  • 做充氣氣模產(chǎn)品一般去哪些網(wǎng)站免費(fèi)關(guān)鍵詞搜索工具
  • 做網(wǎng)站第一步要干啥營銷推廣公司
  • 做NBA網(wǎng)站目的今天的新聞 最新消息摘抄
  • 如何用電腦主機(jī)做網(wǎng)站網(wǎng)頁自動(dòng)點(diǎn)擊軟件
  • 網(wǎng)站建設(shè)與搜索西安網(wǎng)站制作費(fèi)用
  • 網(wǎng)站建設(shè)華企網(wǎng)絡(luò)推廣的主要內(nèi)容
  • 好看的單頁面網(wǎng)站模板一站式營銷推廣
  • app網(wǎng)站開發(fā)書籍下載企業(yè)網(wǎng)絡(luò)營銷策略分析案例
  • gateface能用來做網(wǎng)站嗎google登錄入口
  • 西安網(wǎng)站建設(shè)云李百度知道合伙人官網(wǎng)登錄入口
  • 美工網(wǎng)站做兼職企業(yè)網(wǎng)絡(luò)推廣網(wǎng)站
  • 網(wǎng)站更改機(jī)房備案個(gè)人網(wǎng)站制作
  • 福建企業(yè)網(wǎng)站開發(fā)純手工seo公司
  • 貴陽雙龍區(qū)建設(shè)局網(wǎng)站谷歌搜索引擎香港免費(fèi)入口