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

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

建設(shè)河南分行網(wǎng)站網(wǎng)站seo快速

建設(shè)河南分行網(wǎng)站,網(wǎng)站seo快速,不會編碼可以做網(wǎng)站優(yōu)化嗎,wordpress 5.2.1添加中文目錄 一、項目搭建 1.1 初始化項目 二、項目界面布局 三、完成Food類 四、完成記分牌類 五、初步完成snake類 六、創(chuàng)建游戲控制器類 - 鍵盤事件 七、GameControl - 使蛇移動 八、蛇撞墻和吃食檢測 一、項目搭建 1.1 初始化項目 1.使用init命令生成package.json文件 …

目錄

?一、項目搭建

1.1 初始化項目

二、項目界面布局

三、完成Food類

四、完成記分牌類

五、初步完成snake類

六、創(chuàng)建游戲控制器類 - 鍵盤事件

七、GameControl - 使蛇移動

八、蛇撞墻和吃食檢測


?一、項目搭建

1.1 初始化項目

1.使用init命令生成package.json文件

npm init -y

2.在根目錄創(chuàng)建src文件夾、tsconfig.json文件、weboack.config.js文件

3.在src文件夾下創(chuàng)建index.ts、index.html、style文件夾、module文件夾

4.在style文件夾內(nèi)創(chuàng)建index.less文件

5.運行以下命令,安裝所需的18個依賴

npm i webpack webpack-cli webpack-server typescript ts-loader style-loader less-loader less css-loader postcss postcss-loader postcss-preset-env core-js html-webpack-plugin clean-webpack-plugin babel-loader @babel/preset-env @babel/core -D

安裝完畢后,你的文件結(jié)構(gòu)應(yīng)該是這樣


?安裝依賴說明


?6.配置package.json

在"script"對象中,添加如下命令

"build": "webpack",
"start": "webpack server --open"

7.配置tsconfig.json

{"compilerOptions": {"module": "ES2015","target": "ES2015","strict": true,"noEmitOnError": true}
}

8.配置webpack.config.js

// 引入一個包
const path = require("path")
// 引入hmtl插件
const HtmlWebpackPlugin = require("html-webpack-plugin")
const { CleanWebpackPlugin } = require("clean-webpack-plugin")module.exports = {entry: "./src/index.ts",output: {path: path.resolve(__dirname, "dist"),filename: "bundle.js",// 告訴webpack不適用箭頭函數(shù)environment: {arrowFunction: false,const: false,},},mode: 'development' ,// 指定webpack打包時使用的模塊module: {// 指定要加載的規(guī)則rules: [{// test指定規(guī)則生效的文件test: /\.ts$/,use: [// 配置babel{// 指定加載器loader: "babel-loader",// 設(shè)置babeloptions: {// 設(shè)置定義的環(huán)境presets: [["@babel/preset-env",{// 要兼容的目標(biāo)瀏覽器targets: {browsers: ["last 2 versions"],ie: 11,},// 指定corejs的版本corejs: 3,// 使用corejs的方式,"usage"表示按需加載useBuiltIns: "usage",},],],},},"ts-loader",],exclude: /node_modules/,},{test: /\.less$/,use: ["style-loader","css-loader",// 引入postcss{loader: "postcss-loader",options: {postcssOptions: {plugins: [["postcss-preset-env",{browsers: ["last 2 versions"],},],]},},},"less-loader",],},],},// 配置webpack插件plugins: [new CleanWebpackPlugin(),new HtmlWebpackPlugin({template: "./src/index.html",filename: "index.html",}),],// 用來設(shè)置模塊resolve: {extensions: [".ts", ".js"],},
}

二、項目界面布局

1.打開src文件夾下index.html文件,設(shè)置游戲主容器、游戲舞臺、蛇、食物、記分牌等元素

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>貪吃蛇</title>
</head>
<body><!-- 創(chuàng)建游戲主容器 --><div id="main"><!-- 設(shè)置游戲的舞臺 --><div id="stage"><!-- 設(shè)置蛇 --><div id="snake"><!-- snake內(nèi)部的div  表示蛇的各部分 --><div></div></div><!-- 設(shè)置食物 --><div id="food"><!-- 添加4個div 設(shè)置food的樣式 --><div></div><div></div><div></div><div></div></div></div><!-- 設(shè)置游戲的記分牌 --><div id="score-panel"><div>SCORE: <span id="score">0</span></div><div>LEVEL: <span id="level">1</span></div></div></div>
</body>
</html>

2.在index.ts中引入index.less

三、完成Food類

1.在modules文件夾中創(chuàng)建Food.ts文件

2.定義獲取食物的x,y坐標(biāo)的方法,修改食物的位置方法等

// 定義食物類Food
class Food {// 定義一個屬性表示食物所對應(yīng)的元素element: HTMLElement;constructor() {// 獲取頁面中的food元素并將其復(fù)制給elementthis.element = document.getElementById("food")!;}// 定義一個獲取食物x軸坐標(biāo)的方法get x() {return this.element.offsetLeft;}// 定義一個獲取食物y軸坐標(biāo)的方法get y() {return this.element.offsetTop;}// 修改食物的位置change() {// 生成一個隨機(jī)的位置// 食物的位置最小是0,最大是290// 蛇移動一次就是一格,一格的大小就是10,所以就要求食物的位置必須是10的倍數(shù)let top = Math.round(Math.random() * 29) * 10;let left = Math.round(Math.random() * 29) * 10;this.element.style.left = left + "px";this.element.style.top = top + "px";}
}export default Food;

四、完成記分牌類

1.在modules文件夾下創(chuàng)建ScorePanel.ts文件

2.定義屬性:分?jǐn)?shù)、等級、最大等級以及升級所需分?jǐn)?shù)

3.定義方法:加分方法、提升等級方法

// 定義表示記分牌的類
class ScorePanel {// score和level用來記錄分?jǐn)?shù)和等級score: number = 0;level: number = 1;// 分?jǐn)?shù)和等級所在的元素,在構(gòu)造函數(shù)中進(jìn)行初始化scoreEle: HTMLElement;levelEle: HTMLElement;// 設(shè)置變量限制等級maxLevel: number;// 設(shè)置變量表示多少分升級upScore: number;constructor(maxLevel: number = 10, upScore: number = 10) {this.scoreEle = document.getElementById("score")!;this.levelEle = document.getElementById("level")!;this.maxLevel = maxLevel;this.upScore = upScore;}// 設(shè)置一個加分的方法addScore() {this.scoreEle.innerHTML = ++this.score + "";// 判斷分?jǐn)?shù)是多少if (this.score % this.upScore === 0) {this.levelUp();}}// 提升等級的方法levelUp() {if (this.level < this.maxLevel) this.levelEle.innerHTML = ++this.level + "";}
}export default ScorePanel;

五、初步完成snake類

1.在modules文件夾中創(chuàng)建Snake.ts文件

2.定義屬性:蛇頭、蛇的身體

3.定義方法:獲取蛇的x,y坐標(biāo)方法、設(shè)置x,y坐標(biāo)的方法,蛇的身體增加的方法

class Snake {// 表示蛇頭的元素hand: HTMLElement;// 蛇的身體(包括舌頭)bodies: HTMLCollection;// 獲取蛇的容器element: HTMLElement;constructor() {this.element = document.getElementById("snake")!;this.hand = document.querySelector("#snake > div")!;this.bodies = this.element.getElementsByTagName("div")!;}// 獲取蛇的x坐標(biāo)get X() {return this.hand.offsetLeft;}// 獲取蛇的y坐標(biāo)get Y() {return this.hand.offsetTop;}set X(value) {this.hand.style.left = `${value}px`;}set Y(value) {this.hand.style.top = `${value}px`;}// 蛇增加身體的方法addBody() {// 向element中添加一個divthis.element.insertAdjacentHTML("beforeend", "<div></div>");}}export default Snake;

六、創(chuàng)建游戲控制器類 - 鍵盤事件

1.在modules文件夾中創(chuàng)建GameControl.ts文件

2.引入其他3個文件

3.定義屬性:蛇、食物、記分牌、移動方向

4.定義方法:游戲初始化、鍵盤按下事件

// 引入其他類
import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";// 游戲控制器,控制其他的所有類
class GameControl {// 定義三個屬性// 蛇snake: Snake;food: Food;scorePanel: ScorePanel;// 創(chuàng)建一個屬性來存儲蛇的移動方向(也就是按鍵的方向)direction: string = "";constructor() {this.snake = new Snake();this.food = new Food();this.scorePanel = new ScorePanel();this.init();}// 游戲初始化方法,調(diào)用后游戲即開始init() {// 綁定鍵盤按下事件document.addEventListener("keydown", this.keydownHandle.bind(this));}/*Chrome           IEArrowUp          UpArrowDown       DownArrowLeft       LeftArrowRight      Right*/// 創(chuàng)建一個鍵盤按下的相應(yīng)函數(shù)keydownHandle(event: KeyboardEvent) {// 修改direction屬性this.direction = event.key;}
}export default GameControl;

七、GameControl - 使蛇移動

1.創(chuàng)建方法:使蛇移動

// 創(chuàng)建一個控制蛇移動的方法run() {/* 根據(jù)方向(this.direction)來使蛇的位置改變向上 top 減少向下 top 增加向左 left 減少向右 left 增加*/// 獲取蛇現(xiàn)在的坐標(biāo)let x: number = this.snake.X;let y: number = this.snake.Y;// 根據(jù)舍得方向計算坐標(biāo)值switch (this.direction) {case "ArrowUp":case "Up":case "w":case "W":// 向上移動  top 減少y -= 10;break;case "ArrowDown":case "Down":case "s":case "S":// 向下移動 top 增加y += 10;break;case "ArrowLeft":case "Left":case "a":case "A":// 向左移動 left 減少x -= 10;break;case "ArrowRight":case "Right":case "d":case "D":// 向右移動 right 增加x += 10;break;}// 修改蛇的位置this.snake.X = x;this.snake.Y = y;}

2.在index.ts中引入GameControl文件,并new GameControl()調(diào)用

// 引入樣式
import "./style/index.less";import GameControl from "./modules/GameControl";new GameControl();

3.此時我們的蛇已經(jīng)可以移動了,但是它不是實時移動的,接下來我們添加定時調(diào)用方法

setTimeout(this.run.bind(this), 300);

?4.接下來完成一些邏輯補充,創(chuàng)建一個變量用來檢測蛇是不是還活著

// 創(chuàng)建一個屬性用來記錄游戲是否結(jié)束isLive: boolean = true;

八、蛇撞墻和吃食檢測

1.修改Snake.ts中set x和 set y 的內(nèi)容

set X(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.X === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了");}this.hand.style.left = `${value}px`;}set Y(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.Y === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了!");}this.hand.style.top = `${value}px`;}

?2.在GameControl中添加異常捕獲

// 使用異常捕獲來處理所有的游戲結(jié)束事件,減少代碼try {// 修改蛇的位置this.snake.X = x;this.snake.Y = y;} catch (e: any) {// 進(jìn)入到catch,說明出現(xiàn)了異常,游戲結(jié)束,彈出一個提示信息alert(e.message + "GAME OVER,請刷新頁面后重新開始游戲");// 將isLive設(shè)置為falsethis.isLive = false;}

3. 此時我們控制蛇撞墻就會彈窗,但是我們的蛇還能掉頭,接下來我們處理這個問題

4.打開Snake文件,增加set x 和 set y 的邏輯

set X(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.X === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了");}// 修改x時,是在修改水平坐標(biāo),蛇在左右移動,蛇在向左移動時,不能向右掉頭,反之亦然if (this.bodies[1] &&(this.bodies[1] as HTMLElement).offsetLeft === value) {// 如果發(fā)生了掉頭,讓蛇向反方向繼續(xù)移動if (value > this.X) {// 如果新值value大于舊值x,則說明蛇在向右走,此時發(fā)生掉頭,應(yīng)該使蛇繼續(xù)向左走value = this.X - 10;} else {value = this.X + 10;}}this.hand.style.left = `${value}px`;}set Y(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.Y === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了!");}// 修改y時,是在修改垂直坐標(biāo),蛇在上下移動,蛇在向上移動時,不能向下掉頭,反之亦然if (this.bodies[1] &&(this.bodies[1] as HTMLElement).offsetLeft === value) {// 如果發(fā)生了掉頭,讓蛇向反方向繼續(xù)移動if (value < this.Y) {// 如果新值value大于舊值y,則說明蛇在向上走,此時發(fā)生掉頭,應(yīng)該使蛇繼續(xù)向下走value = this.Y - 10;} else {value = this.Y + 10;}}this.hand.style.top = `${value}px`;}

5.此時我們掉頭蛇就不會掉頭了,接下來我們處理我們的蛇的身體

// 添加一個蛇身體移動的方法moveBody() {/* 將后邊的身體設(shè)置為前邊身體的位置舉例子:第四節(jié) = 第三節(jié)的位置第三節(jié) = 第二節(jié)的位置第二節(jié) = 蛇頭的位置*///便利獲取所有的身體for (let i = this.bodies.length - 1; i > 0; i--) {// 獲取前邊身體的位置let x = (this.bodies[i - 1] as HTMLElement).offsetLeft;let y = (this.bodies[i - 1] as HTMLElement).offsetTop;// 將值設(shè)置到當(dāng)前的身體上(this.bodies[i] as HTMLElement).style.left = `${x}px`;(this.bodies[i] as HTMLElement).style.top = `${y}px`;}}

6.在set x,set y中調(diào)用moveBody方法

7.現(xiàn)在我們發(fā)現(xiàn)我么的蛇還能夠穿過自己的身體,接下來我們處理這個問題

// 檢查蛇頭是否撞到身體的方法checkHeadBody() {// 獲取所有的身體,檢查其是否和蛇頭的坐標(biāo)發(fā)生重疊for (let i = 1; i < this.bodies.length; i++) {let bd = this.bodies[i] as HTMLElement;console.log(this.X, bd.offsetLeft, this.Y, bd.offsetTop);if (this.X === bd.offsetLeft && this.Y === bd.offsetTop) {// 進(jìn)入判斷說明蛇頭撞到了身體,游戲結(jié)束throw new Error("撞到自己了!");}}}

8.在set x,set y中調(diào)用checkHeadBody方法

9.完整Snake文件

class Snake {// 表示蛇頭的元素hand: HTMLElement;// 蛇的身體(包括舌頭)bodies: HTMLCollection;// 獲取蛇的容器element: HTMLElement;constructor() {this.element = document.getElementById("snake")!;this.hand = document.querySelector("#snake > div")!;this.bodies = this.element.getElementsByTagName("div")!;}// 獲取蛇的x坐標(biāo)get X() {return this.hand.offsetLeft;}// 獲取蛇的y坐標(biāo)get Y() {return this.hand.offsetTop;}set X(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.X === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了");}// 修改x時,是在修改水平坐標(biāo),蛇在左右移動,蛇在向左移動時,不能向右掉頭,反之亦然if (this.bodies[1] &&(this.bodies[1] as HTMLElement).offsetLeft === value) {// 如果發(fā)生了掉頭,讓蛇向反方向繼續(xù)移動if (value > this.X) {// 如果新值value大于舊值x,則說明蛇在向右走,此時發(fā)生掉頭,應(yīng)該使蛇繼續(xù)向左走value = this.X - 10;} else {value = this.X + 10;}}// 移動的時候調(diào)用身體方法this.moveBody();this.hand.style.left = `${value}px`;// 檢查有沒有撞到自己this.checkHeadBody();}set Y(value) {// 如果新值和舊值相同,則直接返回不再修改if (this.Y === value) return;// x的值的合法范圍0-290之間if (value < 0 || value > 290) {// 進(jìn)入判斷說明蛇撞墻了,拋出一個異常throw new Error("蛇撞墻了!");}// 修改y時,是在修改垂直坐標(biāo),蛇在上下移動,蛇在向上移動時,不能向下掉頭,反之亦然if (this.bodies[1] &&(this.bodies[1] as HTMLElement).offsetLeft === value) {// 如果發(fā)生了掉頭,讓蛇向反方向繼續(xù)移動if (value < this.Y) {// 如果新值value大于舊值y,則說明蛇在向上走,此時發(fā)生掉頭,應(yīng)該使蛇繼續(xù)向左走value = this.Y - 10;} else {value = this.Y + 10;}}// 移動的時候調(diào)用身體方法this.moveBody();this.hand.style.top = `${value}px`;// 檢查有沒有撞到自己this.checkHeadBody();}// 蛇增加身體的方法addBody() {// 向element中添加一個divthis.element.insertAdjacentHTML("beforeend", "<div></div>");}// 添加一個蛇身體移動的方法moveBody() {/* 將后邊的身體設(shè)置為前邊身體的位置舉例子:第四節(jié) = 第三節(jié)的位置第三節(jié) = 第二節(jié)的位置第二節(jié) = 蛇頭的位置*///便利獲取所有的身體for (let i = this.bodies.length - 1; i > 0; i--) {// 獲取前邊身體的位置let x = (this.bodies[i - 1] as HTMLElement).offsetLeft;let y = (this.bodies[i - 1] as HTMLElement).offsetTop;// 將值設(shè)置到當(dāng)前的身體上(this.bodies[i] as HTMLElement).style.left = `${x}px`;(this.bodies[i] as HTMLElement).style.top = `${y}px`;}}// 檢查蛇頭是否撞到身體的方法checkHeadBody() {// 獲取所有的身體,檢查其是否和蛇頭的坐標(biāo)發(fā)生重疊for (let i = 1; i < this.bodies.length; i++) {let bd = this.bodies[i] as HTMLElement;console.log(this.X, bd.offsetLeft, this.Y, bd.offsetTop);if (this.X === bd.offsetLeft && this.Y === bd.offsetTop) {// 進(jìn)入判斷說明蛇頭撞到了身體,游戲結(jié)束throw new Error("撞到自己了!");}}}
}export default Snake;

10.完整GameControl文件

// 引入其他類
import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";// 游戲控制器,控制其他的所有類
class GameControl {// 定義三個屬性// 蛇snake: Snake;food: Food;scorePanel: ScorePanel;// 創(chuàng)建一個屬性來存儲蛇的移動方向(也就是按鍵的方向)direction: string = "";// 創(chuàng)建一個屬性用來記錄游戲是否結(jié)束isLive: boolean = true;constructor() {this.snake = new Snake();this.food = new Food();this.scorePanel = new ScorePanel();this.init();}// 游戲初始化方法,調(diào)用后游戲即開始init() {// 綁定鍵盤按下事件document.addEventListener("keydown", this.keydownHandle.bind(this));this.run();}/*Chrome           IEArrowUp          UpArrowDown       DownArrowLeft       LeftArrowRight      Right*/// 創(chuàng)建一個鍵盤按下的相應(yīng)函數(shù)keydownHandle(event: KeyboardEvent) {// 修改direction屬性this.direction = event.key;}// 創(chuàng)建一個控制蛇移動的方法run() {/* 根據(jù)方向(this.direction)來使蛇的位置改變向上 top 減少向下 top 增加向左 left 減少向右 left 增加*/// 獲取蛇現(xiàn)在的坐標(biāo)let x: number = this.snake.X;let y: number = this.snake.Y;// 根據(jù)舍得方向計算坐標(biāo)值switch (this.direction) {case "ArrowUp":case "Up":case "w":case "W":// 向上移動  top 減少y -= 10;break;case "ArrowDown":case "Down":case "s":case "S":// 向下移動 top 增加y += 10;break;case "ArrowLeft":case "Left":case "a":case "A":// 向左移動 left 減少x -= 10;break;case "ArrowRight":case "Right":case "d":case "D":// 向右移動 right 增加x += 10;break;}// 檢查蛇是否吃到了食物this.checkEat(x, y);// 使用異常捕獲來處理所有的游戲結(jié)束事件,減少代碼try {// 修改蛇的位置this.snake.X = x;this.snake.Y = y;} catch (e: any) {// 進(jìn)入到catch,說明出現(xiàn)了異常,游戲結(jié)束,彈出一個提示信息alert(e.message + "GAME OVER,請刷新頁面后重新開始游戲");// 將isLive設(shè)置為falsethis.isLive = false;}// 開啟一個定時調(diào)用this.isLive &&setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);}// 定義一個方法,用來檢查蛇是否吃到了食物checkEat(x: number, y: number) {if (x === this.food.x && y === this.food.y) {// 食物的位置要進(jìn)行重置this.food.change();// 分?jǐn)?shù)增加this.scorePanel.addScore();// 蛇增加一節(jié)this.snake.addBody();}}
}export default GameControl;

gitee地址:Snake_Game: 使用ts實現(xiàn)一個簡單的貪吃蛇小游戲

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

相關(guān)文章:

  • 網(wǎng)站制作主題如何檢測網(wǎng)站是否安全
  • 做網(wǎng)站要求高嗎百度手機(jī)版
  • wordpress縮略圖thumb貴州seo技術(shù)查詢
  • 貿(mào)易公司寮步網(wǎng)站建設(shè)哪家好友情鏈接出售平臺
  • 貴陽網(wǎng)站制作策劃無錫網(wǎng)站seo
  • easyui 做的網(wǎng)站關(guān)鍵詞優(yōu)化心得
  • 手機(jī)怎么免費建網(wǎng)站專業(yè)seo培訓(xùn)
  • 簡述營銷導(dǎo)向的企業(yè)網(wǎng)站建設(shè)的步驟seo的英文全稱是什么
  • 怎么做好網(wǎng)站開發(fā)_設(shè)計怎么做百度網(wǎng)頁推廣
  • 網(wǎng)站開發(fā)如何修改字體不限制內(nèi)容的搜索引擎
  • 制作app需要網(wǎng)站嗎品牌策略
  • 亦莊公司做網(wǎng)站做網(wǎng)站的軟件叫什么
  • 做網(wǎng)站的能賺多少錢shopify seo
  • 網(wǎng)站建設(shè)有名的公司自己怎么開發(fā)app軟件
  • 做網(wǎng)站銷售水果常用網(wǎng)站推廣方法及資源
  • 做電商網(wǎng)站一般需要什么流程可以免費推廣的網(wǎng)站
  • 菏澤做網(wǎng)站公司精準(zhǔn)客源引流平臺
  • 做網(wǎng)站使用什么語言寫簡述網(wǎng)站內(nèi)容如何優(yōu)化
  • 網(wǎng)站排名系統(tǒng)哪個好深圳防疫措施優(yōu)化
  • 寧鄉(xiāng)網(wǎng)站建設(shè)外貿(mào)營銷網(wǎng)站制作
  • 網(wǎng)站建設(shè)行業(yè)動態(tài)重慶森林電影完整版
  • 做網(wǎng)站前景怎么樣推廣賺錢的平臺有哪些
  • 網(wǎng)站和其他系統(tǒng)對接怎么做seo項目是什么
  • 網(wǎng)站開發(fā)技術(shù)發(fā)展史網(wǎng)絡(luò)營銷方案策劃論文
  • 廣宏建設(shè)集團(tuán)有限公司網(wǎng)站重慶網(wǎng)絡(luò)seo
  • 武漢網(wǎng)站設(shè)計的學(xué)校網(wǎng)絡(luò)營銷一般月薪多少
  • 四省網(wǎng)站建設(shè)如何設(shè)計網(wǎng)站步驟
  • 企業(yè)網(wǎng)站建立喬拓云智能建站
  • 手機(jī)asp網(wǎng)站開發(fā)工具拼多多關(guān)鍵詞排名在哪里看
  • 一站式服務(wù)平臺登錄網(wǎng)站策劃方案案例