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

當前位置: 首頁 > news >正文

超級簡歷模板官網(wǎng)北京seo公司公司

超級簡歷模板官網(wǎng),北京seo公司公司,網(wǎng)站設計是后臺做的還是前臺做的,章丘哪里做網(wǎng)站概述 Express是基于Node.js平臺(建立在Node.js內(nèi)置的http模塊上),快速、開放、極簡的Web開發(fā)框架。 中文官網(wǎng) http://www.expressjs.com.cn/。 Github地址:https://github.com/orgs/expressjs。 Express核心特性: 可設置中間件來響應 HTTP…

概述

Express是基于Node.js平臺(建立在Node.js內(nèi)置的http模塊上),快速、開放、極簡的Web開發(fā)框架
中文官網(wǎng) http://www.expressjs.com.cn/。
Github地址:https://github.com/orgs/expressjs。

Express核心特性:

  • 可設置中間件來響應 HTTP 請求
  • 定義了路由表用于執(zhí)行不同的 HTTP 請求
  • 可通過向模板傳遞參數(shù)來動態(tài)渲染 HTML 頁面

安裝

npm i express

以上命令會將express安裝在當前目錄下的node_modules文件夾下,并且將其依賴的包也一并下載下來
以下幾個和express搭配使用的包:

  • body-parser 用于處理 JSON、RawTextURL中的請求數(shù)據(jù)
  • cookie-parser 用于處理Cookie
  • multer 用于處理**enctyoe=“multipart/form-data””**的表單數(shù)據(jù)

基本使用

基本使用步驟:

  1. 導入 express 模塊
  2. 創(chuàng)建 express 實例
  3. 創(chuàng)建并啟動HTTP服務
  4. 綁定請求事件
// 1. 導入 express 包
const express = require('express')// 2. 創(chuàng)建 express 實例
const app = express()// 3. 啟動服務
app.listen(80, () => {console.log("Express server is starting ...")
})// 4. 綁定請求事件
app.get("/", (req, res) => {console.log("請求進來了 >>> " + req.url)res.end("Hello Node.js")
})

set 方法

set方法用于指定變量的值

// 設置 端口
app.set("port", process.env.PORT)// 設定views變量,意為視圖存放的目錄
app.set('views', path.join(__dirname, 'views'));// 設定view engine變量,意為網(wǎng)頁模板引擎
app.set('view engine', 'jade');

請求和響應

Express處理請求中回調(diào)函數(shù)的參數(shù):requestresponse對象來處理請求和響應。

request 對象

request對象表示 HTTP請求,包含了請求查詢的字符串參數(shù)內(nèi)容、HTTP頭部等屬性。常見屬性:

  • request.appcallback為外部文件時,用其訪問express實例
  • request.baseUrl 獲取當前的 URL 路徑
  • request.method 獲取請求方法
  • request.body 獲取請求體內(nèi)容
  • request.cookie 獲取 Cookie 內(nèi)容
  • request.hostname 獲取主機名
  • request.ip 獲取IP
  • request.originalUrl 獲取原始請求 URL
  • request.params 獲取請求參數(shù)(動態(tài)匹配的參數(shù))
  • request.path 獲取請求路徑
  • request.protocol 獲取請求協(xié)議
  • request.query 獲取URL的查詢參數(shù)
  • request.route 獲取請求匹配的路由
  • request.get() 獲取指定的請求頭
  • request.is() 判斷請求頭Content-TypeMIME類型
// http://domain:port/x1/x2/wz?age=18
request.path  // /x1/x2/wz
request.params  // wz
request.query  // age
// 引入express 模塊
const express = require('express')// 創(chuàng)建 實例
const app = express()// 啟動服務
app.listen(80, () => {console.log("Server is starting ...")
})// 綁定 get 請求事件
app.get('/user', (req, res) => {// req.protocol 獲取請求協(xié)議console.log("protocol >>> ", req.protocol)// req.method 獲取請求方法console.log("method >>> ", req.method)// req.hostname 獲取主機名console.log("hostname >>> ", req.hostname)// req.ip 獲取請求 IPconsole.log("ip >>> ", req.ip)// req.originalUrl 獲取請求原始路徑console.log("originalUrl >>> ", req.originalUrl)// req.path 獲取請求路徑console.log("path >>> ", req.path)// req.route 獲取請求路由console.log("route >>> ", req.route)// req.params 獲取請求參數(shù)console.log("params >>> ", req.params)// req.query 獲取請求查詢參數(shù)console.log("query >>> ", req.query)// req.body 獲取請求體console.log("body >>> ", req.body)res.end("GET")
})// 綁定 post 請求事件
app.post('/user', (req, res) => {// req.protocol 獲取請求協(xié)議console.log("protocol >>> ", req.protocol)// req.method 獲取請求方法console.log("method >>> ", req.method)// req.hostname 獲取主機名console.log("hostname >>> ", req.hostname)// req.ip 獲取請求 IPconsole.log("ip >>> ", req.ip)// req.originalUrl 獲取請求原始路徑console.log("originalUrl >>> ", req.originalUrl)// req.path 獲取請求路徑console.log("path >>> ", req.path)// req.route 獲取請求路由console.log("route >>> ", req.route)// req.params 獲取請求參數(shù)console.log("params >>> ", req.params)// req.query 獲取請求查詢參數(shù)console.log("query >>> ", req.query)// req.body 獲取請求體console.log("body >>> ", req.body)res.end("POST")
})

response 對象

response 對象表示 HTTP響應,即在接受到請求時向客戶端發(fā)送的數(shù)據(jù)。常見屬性:

  • response.appcallback為外部文件時,用其訪問express實例
  • response.cookie(name, value[, options]) 設置Cookie信息
  • response.clearCookie() 清空Cookie
  • response.download() 傳送指定的文件
  • response.get() 獲取指定的HTTP頭信息
  • response.set(name, value) 設置響應頭(Header)
  • response.json() 響應JSON格式的數(shù)據(jù)
  • response.render(view[, locals], callback) 渲染網(wǎng)頁模版
  • response.send() 發(fā)送響應
  • response.sendFile(path[, options][, fn]) 傳送文件
  • response.status() 設置 HTTP 狀態(tài)碼
  • response.type() 設置 Content-TypeMIME類型
  • response.redirect() 設置重定向

路由

路由即路徑映射。在Express中,路由指客戶端的請求與服務器處理函數(shù)的映射。
Express中路由是一個單獨的組件Express.Router
Express中路由由三部分組成,分別為請求類型、請求URL處理函數(shù)。其格式如下:

app.method(path, handler())

路由匹配過程

  • 請求到達服務器時,先經(jīng)過路由的匹配,匹配成功了,才會調(diào)用對應的處理函數(shù)
  • 在匹配時,按照定義的順序依次匹配,僅當請求類型和請求URL同時匹配成功了,才會調(diào)用對應的處理函數(shù)

在這里插入圖片描述

// 導入 express 模塊
const express = require('express')// 創(chuàng)建 express 實例
const app = express()// 創(chuàng)建路由實例
const router = express.Router()// 掛載路由
router.get('/user', (req, res) => {res.send("express router")
})// 注冊路由
app.use('/api', router)// 啟動服務
app.listen(80, () => {console.log("Server is starting ...")
})// 訪問路徑 http://domain:port/api/user

中間件

中間件(Middleware)指業(yè)務流程的中間處理環(huán)節(jié)。其是一個函數(shù),包含了request、respoonse、next三個參數(shù),其中 next() 把流轉(zhuǎn)交給下一個中間件或路由。

Express 中間件調(diào)用流程
在這里插入圖片描述
注意:

  1. 在注冊路由之前注冊中間件(錯誤中間件除外)
  2. 多個中間件共享requestresponse對象
  3. next() 函數(shù)后不能再寫邏輯代碼

全局中間件

通過app.use()注冊的中間件為全局中間件

const express = require('express')const app = express()// 注冊全局中間件
app.use((req, res, next) => {console.log("中間件A")
})// 注冊全局中間件
app.use((req, res, next) => {console.log("中間件B")
})app.get('/user', (req, res) => {res.send("ok")
})app.listen(8888)

局部中間件

const express = require('express')const app = express()// 定義中間件
const mw1 = (req, res, next) => {console.log("中間件A")
}// 注冊全局中間件
const mw2 = (req, res, next) => {console.log("中間件B")
}app.get('/user', mw1, mw2, (req, res) => {res.send("ok")
})app.post('/user', [mw1, mw2], (req, res) => {res.send("ok")
})app.listen(8888)

中間件分類

中間件按照作用可劃分為三類:應用級別中間件、路由級別中間件、錯誤級別中間件。

應用級別中間件

通過app.use()app.method()注冊,即綁定到app實例上的中間件即為應用級別中間件。(其中methodget、post、put、delete等請求方法)

const express = require('express')const app = express()// 注冊路由
app.use('/', (req, res, next) => {next()
})
路由級別中間件

通過router.use()注冊,即綁定到router實例上的中間件即為路由級別中間件

const express = require('express')const app = express()
const router = express.Router()// 路由上注冊中間件
router.use((req, res, next) => {next()
})// 注冊路由
app.use('/', router)
錯誤級別中間件

錯誤級別中間件用來捕獲整個項目中發(fā)生的異常,從而防止項目異常崩潰。
錯誤級別中間件的處理函數(shù)中必須有4個形參,即(error, request, response, next)
錯誤級別中間件必須注冊在所有路由之后

const express = require('express')const app = express()// 請求處理 ...// 注冊錯誤中間件
app.use((err, req, res, next) => {next()
})

內(nèi)置中間件

Express中內(nèi)置了多個中間件,極大的提高了 Express 項目的開發(fā)效率。常見內(nèi)置中間件:

  • express.static 快速托管靜態(tài)資源

    express.static(root[, options])

  • express.json 解析JSON格式的請求體數(shù)據(jù)

  • express.urlencoded 解析 url-encoded 格式的請求體數(shù)據(jù)

// 快速托管靜態(tài)資源
app.use(express.static(path))// 通過 express.json() 這個中間件,解析表單中的 JSON 格式的數(shù)據(jù)
app.use(express.json())// 通過 express.urlencoded() 這個中間件,來解析表單中的 url-encoded 格式的數(shù)據(jù)
app.use(express.urlencoded({ extended: false }))

第三方中間件

cookie-parser

cookie-parser 用于處理請求中的Cookie。
https://github.com/expressjs/cookie-parser

設置Cookie

res.cookie(name, value[, options])

參數(shù)說明

  • name cookie名稱
  • value cookie值
  • options 配置參數(shù)
    • domain 域名。默認為當前域名
    • expires 失效時間。未設置或0,表示瀏覽器關(guān)閉后即失效
    • maxAge 最大失效時間(指從當前時間開始多久后失效),單位毫秒
    • securetrue時,cookie 在 http 失效,https 生效
    • path cookie在什么路徑下有效。默認為**/**
    • httpOnly 只能被訪問,防止 XSS攻擊
    • signed 是否簽名。默認指為false

不簽名實例

const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParse())app.get('/setCookie', (req, res) => {res.cookie('name', '張三', {maxAge: 10000})res.send('cookie set success!')
})app.listen(8888)

簽名實例

const express = require('express')
const cookieParser = require('cookie-parser')const app = express()app.use(cookieParser('^123$'))  // ^123$ 為簽名秘鑰app.get('setCookie', (req, res) => {// 將cookie的name 進行簽名res.cookie("name", "張三", {maxAge: 100000, signed: true})
})
獲取Cookie

注意:Cookie簽名與不簽名獲取的方式不一樣。req.cookies獲取不簽名cookiereq.signedCookies獲取簽名cookie
不簽名實例

const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParser())  //app.get('/getCookie', (req, res) => {console.log(req.cookies)res.send("cookie got")
})app.listen(8888)

簽名實例

const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParser('^123$'))  // ^123$ 為簽名秘鑰app.get('/getCookie', (req, res) => {console.log(req.signedCookies)res.send("cookie got")
})app.listen(8888)
刪除Cookie

res.clearCookie(name[, options])

express-session

express-session用于處理請求中的會話。
https://github.com/expressjs/session

配置 session

session(options)

參數(shù)說明:

  • options 配置參數(shù)
    • cookie cookie設置
    • genid sessionid算法。默認為uid-safe庫自動生成id
    • name 會話名稱。默認為 connect.sid
    • secret 會話簽名秘鑰
    • store 會話存儲方式。默認為內(nèi)存
    • resave 是否強制保存會話,及時未被修改也被保存。默認為true
    • saveUninitialized 強制將未初始化的會話保存至存儲中。(會話是新的且未被修改即為未初始化)
    • unset 是否保存會話。默認為keep,不保存可設置為destory
const express = require('express')
const session = require('express-session')const app = express()app.use(session({name: "session-cookie",secret: "^123456$",  // 會話簽名秘鑰cookie: {maxAge: 2 * 60 * 60 * 1000}
}))
req.session

req.session可用于存儲或訪問會話數(shù)據(jù),以JSON的形式序列化。

const express = require('express')
const session = require('express-session')// 創(chuàng)建服務實例
const app = express()// 配置session,并注冊session中間件
app.use(session({name: "express",secret: "^123456$",resave: false,saveUninitialized: true
}))app.get('/setSession', (req, res) => {// 存儲會話req.session.name = "李四"res.send("set session success")
})app.get('/getSession', (req, res) => {// 獲取會話console.log(req.session)res.send("session got")
})// 啟動服務
app.listen(8888)
屬性
屬性說明
req.session.id會話ID
req.session.sessionID會話ID
req.session.cookie獲取會話中的 cookie 對象, 而后可對其修改
req.session.cookie.maxAge會話有效剩余時長
req.session.cookie.originalMaxAge返回會話 cookie 的原始 maxAge, 以毫秒為單位
方法
方法說明
req.session.regenerate(callback)重新生成會話
req.session.destroy(callback)銷毀會話并取消設置 req.session 屬性
req.session.reload(callback)從存儲重新加載會話數(shù)據(jù)并重新填充 req.session 對象
req.session.save(callback)講會話保存至 store,用內(nèi)存中的內(nèi)容替換 store上的內(nèi)容
req.session.touch()更新 .maxAge屬性
JWT

JWT(JSON Web Token)是由三部分組成:Header、Payload(真正的用戶信息,加密后的字符串)、Signature。
JWT工作原理:用戶的信息以Token的字符串的形式,保存在客戶端中。用戶每次請求,將Token存放在請求頭Authorization上,服務器拿到該值后進行解析處理。
在這里插入圖片描述
Expressjsonwebtoken模塊用于生成JWT字符串,express-jwt用于將JWT字符串還原成JSON對象。

使用
  1. 安裝模塊
    npm install jsonwebtoken express-jwt
    
  2. 引入模塊
    const jwt = requre('jsonwebtoken')
    const expressJWT = require('express-jwt')
    
  3. 生成 JWT 字符串

    jwt.sign(payload, secret[, options[, callback]])

    payload 存儲的對象
    secret 簽名秘鑰
    options 配置參數(shù)。常見有 expiresIn(過期時間)、algorithm(簽名算法)
    callback 回調(diào)函數(shù)

    app.post('/api/login', (req, res) => {let token = jwt.sign({username: username}, '^123456$', {expireIn: '2h'})
    })
    
  4. 還原 JWT 字符串
    // 此處的 secret 值必須和jwt 生成時所使用的秘鑰相同
    // unless 指定了哪些接口無須攜帶Token訪問
    app.use(expressJWT({secret: '^123456$'}).unless({path:[/^\/api\//]}))
    
  5. 獲取 JWT 信息

    在訪問權(quán)限的接口中,可通過req.user對象即可訪問 JWT 字符串中解析的內(nèi)容

  6. 捕獲 JWT 異常
    // 通過異常中間件來處理JWT解析失敗
    app.use((err, req, res, next) => {if(err.name === 'UnauthorizedError') {// TODO}next()
    })
    
multer

multer是用于處理multipart/form-data類型的表單數(shù)據(jù),主要用于上傳文件。(不會處理任何非 multipart/form-data 的數(shù)據(jù) )
multer在解析完請求體后,會向request對象上添加一個body對象和一個filefiles對象。body對應表單中提交的文本字段,filefiles包含了表單上傳的文件。
https://github.com/expressjs/multer

multer(options)

參數(shù)說明:

  • options 參數(shù)配置
    • dest / storage 上傳文件存放目錄。
    • fileFilter 文件過濾器
    • limits 限制上傳文件 (可有效防止Dos攻擊)
      • fieldNameSize field名字最大長度。默認為 100 bytes
      • fieldSize field指最大長度。默認為1MB
      • fields 非文件field的最大數(shù)量。默認為無限
      • fileSize 文件最大長度,單位字節(jié)。默認為無限
      • files 文件最大數(shù)量。默認為無限
      • parts part傳輸?shù)淖畲髷?shù)量(field + file)。默認為無限
      • headerPairs 鍵值對最大組數(shù)。默認為2000
    • preservePath 保存包含文件名的完整路徑
storage

storage為存儲引擎,multer中具有DiskStorage、MemoryStorage和第三方等引擎。

DiskStorage

DiskStorage為磁盤存儲引擎,其有兩個選項可用:destinationfilename。
destination 用來確定上傳的文件存放的位置。可提供一個 stringfunction。若沒有設置則使用操作系統(tǒng)默認的臨時文件夾。
注意:destination 是一個function,則需用手動創(chuàng)建文件夾;若destination 是一個string,multer 會自動創(chuàng)建。
filename用來確定文件夾中文件名。若未設置該參數(shù),則文件將設置一個隨機文件名且沒有后綴名。

const storage = multer.DiskStorage({distination: function(req, file, cb) {cb(null, '/xxx/xxx')}filename: function(req, file, cb) {cb(null, file.fieldname + "_" + Date.now())}
})const upload = multer({storage: storage})
MemoryStorage

MemoryStorage 為內(nèi)層存儲引擎(將內(nèi)容存儲在Buffer中)

const storage = multer.memoryStorage()
const upload = multer({storage: storage})

注意:當使用內(nèi)層存儲,上傳文件非常大,或上傳文件非常多時,可能會導致內(nèi)層溢出。

方法

multer.single(fieldname)
multer.signle()接受一個以filename命名的文件,文件保存至request.file
multer.array(fieldname[, maxCount])
multer.array() 接受一個以fieldname命名的文件數(shù)組,可配置maxCount來限制上傳文件數(shù)量,文件保存至request.files
multer.fields(fields)
multer.fields()接受fileds的混合文件,文件保存至request.files
multer.none()
multer.none() 只接受文本域,和multer.fields([])效果一樣。若該模式有文件上傳,則拋出LIMIT_UNEXPECTED_FILE
multer.any()
multer.any() 接受一切上傳的文件。文件保存至request.files

const multer = require('multer')// 存儲設置
const storage = multer.DiskStorage({distination: function(req, file, cp) {cp(null, '/xxx/xx')}filename: function(req, file, cp)
})const upload = multer({storage:storage})app.post('/upload/photo', upload.single('avatar'), function (req, res) {// req.file 是 `avatar` 文件的信息// req.body 將具有文本域數(shù)據(jù),如果存在的話
})app.post('/upload/file', upload.array('file', 3), function (req, res) {// req.files 是 `file` 文件組的信息// req.body 將具有文本域數(shù)據(jù),如果存在的話
})app.post('/upload', upload.fields([{name: 'avatar', maxCount: 1},{name: 'file', maxCount: 3}]), function (req, res) {// req.files 是一個對象 (String -> Array) 鍵是文件名,值是文件數(shù)組// 	req.files['avatar'][0] -> File//    req.files['file'] -> Array// req.body 將具有文本域數(shù)據(jù),如果存在的話
})
文件屬性
屬性說明
fieldname表單定義的名稱
originalname文件原始名稱
encoding文件編碼
mimetype文件的 MIME 類型
size文件大小
distination文件保存路徑
filename保存至 distination 中的文件名
path已上傳文件的完整路徑
buffer存放整個文件的 Buffer

自定義中間件

自定義中間件流程:

  1. 定義中間件
  2. 監(jiān)聽request對象的 data 事件
  3. 監(jiān)聽 request 對象的 end 事件
  4. 解析請求參數(shù)
  5. 封裝模塊

自定義中間件解析POST提交的數(shù)據(jù)

// querything 是 Node.js的內(nèi)置模塊
const qs = require('querything')// 定義中間件
const bodyParser = (req, res, next) => {let str = ''// 監(jiān)聽 req 的 data 事件req.on('data', (chunk) => {str += chunk})req.on('end', () => {// 解析數(shù)據(jù),并將數(shù)據(jù)放在 req 的 body 中,供下游訪問req.body = qs.parse(str)next()})
}module.exports = bodyParser

模板

Express模板是用于渲染視圖的文件,可以包含HTML、CSS、JavaScript等內(nèi)容,用于構(gòu)建 Web應用程序的圖形界面。
使用Express模板可以快速、方便地創(chuàng)建Web應用程序,并可輕松地將動態(tài)數(shù)據(jù)注入到模板中,以便呈現(xiàn)動態(tài)效果。常見的模版引擎有:EJS、Pug、Handlebars 等。

分類

Express模板可分靜態(tài)模板動態(tài)模板兩類:

  1. 靜態(tài)模板 預先定義好的 HTML 文件,可通過路由直接呈現(xiàn)
  2. 動態(tài)模板 通過模版引擎加載動態(tài)數(shù)據(jù)來生成動態(tài)內(nèi)容

Express中常用的模板引擎:

  • 基于HTML的模版引擎:Mustache、Handlebars
  • 基于JavaScript的模版引擎:EJSUnderscore.js
  • 基于CSS的模版引擎:LESS、SASS

使用

模版使用步驟

  1. 下載模板包
  2. 配置模版引擎 app.set("view engine", "xxx")
  3. 配置模板路徑 app.set("views", path.resolve(__dirname, "views")) (表示模板存放在當前目錄下views文件夾中)
  4. 在請求響應中設置渲染 res.render('xx',renderDataObj)

express-generator

express-generator 是 快速創(chuàng)建 express 項目生成器工具。

使用

## 1. 全局安裝 express-generator
npm i -g express-generator## 2. 創(chuàng)建項目
#### 快速創(chuàng)建 [project_name[ 的項目,并且使用默認的 jade 模板引擎
express [project_name]  #### 快速創(chuàng)建 [project_name[ 的項目,并且使用指定的 ejs 模板引擎
express [project_name] --view=ejs## 3.進入到項目根目錄下執(zhí)行 npm install
npm install## 4. 啟動項目
#### npm 命令
npm run start   或   npm start#### node 命令
node ./bin/www## 5.訪問 express-generator生成的項目服務默認端口為 3000 

項目結(jié)構(gòu)

在這里插入圖片描述

http://www.risenshineclean.com/news/58243.html

相關(guān)文章:

  • 做餐飲網(wǎng)站建設下載谷歌瀏覽器并安裝
  • 網(wǎng)站營銷外包如何做網(wǎng)推技巧
  • 網(wǎng)站開發(fā)的小結(jié)騰訊營銷平臺
  • 邢臺網(wǎng)站建設免費做網(wǎng)站排名seo關(guān)鍵詞布局案例
  • 網(wǎng)站平臺是怎么做財務的贛州網(wǎng)站seo
  • 網(wǎng)站建設屬政府采購項目嗎濟寧百度推廣公司
  • 肅寧縣做網(wǎng)站網(wǎng)推渠道
  • 白河網(wǎng)站制作網(wǎng)站模板之家官網(wǎng)
  • 類似豬八戒的網(wǎng)站建設網(wǎng)店運營公司
  • 網(wǎng)站被k的怎么辦泰安網(wǎng)站seo
  • 做平面什么網(wǎng)站好用百度文庫官網(wǎng)登錄入口
  • 合肥做網(wǎng)站好的公司今天剛剛發(fā)生的新聞
  • 最大的網(wǎng)站開發(fā)公司市場營銷案例
  • wordpress登入修改seo顧問服務 樂云踐新專家
  • 良品鋪子網(wǎng)站建設百度推廣優(yōu)化是什么?
  • wordpress的favicon網(wǎng)站優(yōu)化排名操作
  • 丹陽網(wǎng)站設計網(wǎng)站市場推廣
  • seo短視頻網(wǎng)頁入口引流網(wǎng)站有哪些國家職業(yè)技能培訓官網(wǎng)
  • 中文版網(wǎng)站建設費用百度一下百度
  • 網(wǎng)站備案教程海外推廣代理商
  • 坊網(wǎng)站建設seo推廣公司有哪些
  • 創(chuàng)辦一個網(wǎng)站要多少錢營業(yè)推廣方式
  • 快速做網(wǎng)站的軟件網(wǎng)站規(guī)劃與設計
  • 青島市城鄉(xiāng)建設局網(wǎng)站西安網(wǎng)絡推廣公司網(wǎng)絡推廣
  • 企業(yè)網(wǎng)站優(yōu)化案例論壇優(yōu)化seo
  • 網(wǎng)站 建設運行情況報告a5站長網(wǎng)
  • 可以上傳自己做的視頻的網(wǎng)站嗎公司怎么做網(wǎng)絡營銷
  • 自己給網(wǎng)站做優(yōu)化怎么做百度seo高級優(yōu)化
  • 網(wǎng)站建設比較好西安seo霸屏
  • 影樓網(wǎng)站源碼php免費個人網(wǎng)站注冊