前端实现俄罗斯方块游戏(内含源码)

简介: 前端实现俄罗斯方块游戏(内含源码)

一、前言

       今天带领大家完成俄罗斯方块游戏,功能也比较简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 后续也会带领大家用前端一些有趣的小游戏,纯前端语言实现,都会陆续带给大家。

二、功能介绍

       游戏开始时,会出现一个空的游戏区域,以及一个正在下落的方块(俄罗斯方块)。使用方向键控制方块的移动和旋转,目标是将方块填满游戏区域的水平行,使其消除。消除水平行的方式是将一整行填满方块,当一行被填满时,该行将被清除并获得得分。游戏结束条件是当方块堆叠到游戏区域的顶部时无法继续移动。(为大家尝试了一波,嗯。。。请不要嘲笑我😝,哈哈大家可以尝试下,我在这方面实在是。。。。)

游戏区域是一个矩形,由一系列格子组成。初始状态下,游戏区域是空的。方块由四个小方块组成,可以是不同的形状,每个小方块可以向下、向左、向右移动,以及顺时针旋转。方块从游戏区域的顶部开始下落,玩家可以控制方块的移动和旋转,直到方块无法继续下落或旋转。当方块下落到游戏区域的底部或着陆在其他方块上时,它将固定在该位置,成为游戏区域的一部分。当方块固定在游戏区域中时,检查是否有任何水平行被完全填满。如果有,这些行将被清除,并玩家将得分。游戏继续进行,新的方块会不断从顶部生成,玩家需要不断操作方块,尽可能消除更多的水平行。游戏难度可能会逐渐增加,例如方块下落的速度加快或出现更复杂的方块形状。游戏的目标是获得尽可能高的得分,通过消除更多的行来实现。这是一个简化版的俄罗斯方块,玩家可以通过操作方块的移动和旋转,尽可能地消除水平行并获得高分。随着游戏的进行,速度可能会逐渐增加挑战玩家的反应和策略能力。祝您玩得开心!

三、页面搭建

创建文件

       首先呢我们创建我们的HTML文件,这里我就直接命名为 俄罗斯方块.html 了,大家可以随意命名, 文件创建生成后我们通过编辑器打开,这里我用的是HbuilderX, 然后初始化我们的代码结构。

文档声明和编码设置: 在HTML文档的头部,使用<!DOCTYPE>声明HTML文档类型,确保浏览器以正确的方式渲染网页内容。同时,设置UTF-8编码,以确保浏览器能够正确地解析和显示中文字符。下面我就开始搭建我们的DOM结构了!

DOM结构搭建

下面这段 HTML 代码定义了一个俄罗斯方块游戏的基本布局。

1.<h2>俄罗斯方块</h2>:这是一个 <h2> 标题标签,用于显示游戏的标题,即“俄罗斯方块”。

2.<div id="tetris">:这是一个 <div> 容器,用于包裹整个游戏区域。

3.<div id="game-board"></div>:这是一个空的 <div> 容器,它具有 id 属性为 “game-board”。这个容器将用于显示俄罗斯方块游戏的主要游戏区域。

4.<div id="score">Score: <span id="score-value">0</span></div>:这是一个用于显示得分的 <div> 容器,它具有 id 属性为 “score”。其中包含文本 "Score: ",以及一个 <span> 元素用于显示实际的得分值。初始得分为 0,它被包含在具有 id 属性为 “score-value” 的 <span> 元素中。

 

这段 HTML 代码定义了一个基本的俄罗斯方块游戏界面,包含游戏标题、游戏区域和得分显示。通过 JavaScript 代码的结合,将实现游戏逻辑和交互功能。

<body>
    <h2>俄罗斯方块</h2>
    <div id="tetris">
        <div id="game-board"></div>
        <div id="score">Score: <span id="score-value">0</span></div>
    </div>
</body>

四、样式设置

我们看到了上面的的DOM已经搭建好了,但是页面什么都看不出来,下面我们简单的来配置一下样式吧,其实我们本专栏也是想带领大家掌握一些逻辑所以样式方面我们就一切从简;下面这段 CSS 代码为俄罗斯方块游戏提供了样式和布局:

<style>
    h2 {
        font-size: 19px;
        text-align: center;
    }
    #tetris {
        width: 240px;
        margin: 0 auto;
        background-color: #d5d5d5;
        border-radius: 10px;
        padding: 25px;
    }
    #game-board {
        width: 200px;
        height: 400px;
        border: 4px solid #4b6014;
        position: relative;
        border-radius: 10px;
        background-color: #f4f126;
        margin: 0 auto;
    }
    #score {
        text-align: center;
        margin-top: 10px;
    }
    .block {
        width: 20px;
        height: 20px;
        position: absolute;
        background-color: #000;
        border: 1px solid #3a3a3a;
        box-sizing: border-box;
    }
</style>

这些样式规则的含义如下:

  • h2:设置 <h2> 标签的字体大小为 19 像素,居中对齐。
  • #tetris:设置俄罗斯方块游戏容器的宽度为 240 像素,水平居中对齐,背景色为 #d5d5d5,边框半径为 10 像素,内边距为 25 像素。
  • #game-board:设置游戏面板容器的宽度为 200 像素,高度为 400 像素,添加 4 像素宽度、颜色为 #4b6014 的实线边框,相对定位,边框半径为 10 像素,背景色为 #f4f126,水平居中对齐。
  • #score:设置分数容器的文本居中对齐,上外边距为 10 像素。
  • .block:设置方块元素的宽度和高度为 20 像素,绝对定位,背景色为 #000,边框为 1 像素宽度、颜色为 #3a3a3a 的实线边框,使用盒模型的 “border-box” 进行盒子尺寸计算。

这些样式规则使得俄罗斯方块游戏界面具有一致的外观和布局。我们看下效果;

五、逻辑部分

上面我们搭建了基本的样式,下面呢我们就通过js代码,实现我们游戏的功能吧,下面是对代码的简化解释:以下是每个变量和方法的含义:

let board = document.getElementById('game-board');
let scoreValue = document.getElementById('score-value');
let blockSize = 20;
let rows = 20;
let cols = 10;
let score = 0;
let boardGrid = Array.from(Array(rows), () => new Array(cols).fill(0));
let currentShape;
let currentRow;
let currentCol;
  1. board: 表示游戏区域的 DOM 元素,用于显示方块的容器。
  2. scoreValue: 显示当前分数的 DOM 元素,用于更新分数显示。
  3. blockSize: 方块的大小,即每个小方块的宽度和高度。
  4. rows: 游戏区域的行数,表示游戏区域的垂直方向上方块的数量。
  5. cols: 游戏区域的列数,表示游戏区域的水平方向上方块的数量。
  6. score: 当前的分数,表示玩家在游戏中获得的得分。
  7. boardGrid: 表示游戏区域的二维数组,用于记录方块的位置和状态。
  8. currentShape: 当前正在移动的方块的形状,以二维数组的形式表示。
  9. currentRow: 当前正在移动的方块的所在行数。
  10. currentCol: 当前正在移动的方块的所在列数。

这些变量在游戏过程中被用于存储和追踪游戏的状态和数据。例如,board 和 scoreValue 用于更新游戏界面上的分数显示;boardGrid 用于记录方块的位置和状态;currentShape 用于存储当前正在移动的方块的形状等等。通过这些变量,游戏能够实时更新和管理游戏状态,从而提供正常的游戏体验。

 

<script>
    document.addEventListener('DOMContentLoaded', () => {
  let board = document.getElementById('game-board');
  let scoreValue = document.getElementById('score-value');
  let blockSize = 20;
  let rows = 20;
  let cols = 10;
  let score = 0;
  let boardGrid = Array.from(Array(rows), () => new Array(cols).fill(0));
  let currentShape;
  let currentRow;
  let currentCol;
        function createShape() {
            let shapes = [
                [[1, 1, 1, 1]],
                [[1, 1], [1, 1]],
                [[1, 1, 0], [0, 1, 1]],
                [[0, 1, 1], [1, 1, 0]],
                [[1, 1, 1], [0, 1, 0]],
                [[1, 1, 1], [1, 0, 0]],
                [[1, 1, 1], [0, 0, 1]]
            ];
            let randomIndex = Math.floor(Math.random() * shapes.length);
            let shape = shapes[randomIndex];
            currentShape = shape;
            currentRow = 0;
            currentCol = Math.floor(cols / 2) - Math.floor(shape[0].length / 2);
        }
        function drawBoard() {
            board.innerHTML = '';
            for (let row = 0; row < rows; row++) {
                for (let col = 0; col < cols; col++) {
                    if (boardGrid[row][col]) {
                        let block = document.createElement('div');
                        block.className = 'block';
                        block.style.top = row * blockSize + 'px';
                        block.style.left = col * blockSize + 'px';
                        board.appendChild(block);
                    }
                }
            }
        }
        function drawCurrentShape() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let block = document.createElement('div');
                        block.className = 'block';
                        block.style.top = (currentRow + row) * blockSize + 'px';
                        block.style.left = (currentCol + col) * blockSize + 'px';
                        board.appendChild(block);
                    }
                }
            }
        }
        function checkCollision() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let newRow = currentRow + row;
                        let newCol = currentCol + col;
                        if (
                            newRow >= rows ||
                            newCol < 0 ||
                            newCol >= cols ||
                            boardGrid[newRow][newCol]
                        ) {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        function mergeShape() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let newRow = currentRow + row;
                        let newCol = currentCol + col;
                        boardGrid[newRow][newCol] = 1;
                    }
                }
            }
        }
        function clearRows() {
            for (let row = rows - 1; row >= 0; row--) {
                if (boardGrid[row].every((cell) => cell)) {
                    boardGrid.splice(row, 1);
                    boardGrid.unshift(new Array(cols).fill(0));
                    score++;
                }
            }
        }
        function updateScore() {
            scoreValue.textContent = score;
        }
        function moveDown() {
            currentRow++;
            if (checkCollision()) {
                currentRow--;
                mergeShape();
                clearRows();
                updateScore();
                createShape();
                if (checkCollision()) {
                    gameOver();
                }
            }
        }
        function moveLeft() {
            currentCol--;
            if (checkCollision()) {
                currentCol++;
            }
        }
        function moveRight() {
            currentCol++;
            if (checkCollision()) {
                currentCol--;
            }
        }
        function rotateShape() {
            let rotatedShape = currentShape[0].map((_, colIndex) =>
                currentShape.map((row) => row[colIndex]).reverse()
            );
            let prevShape = currentShape;
            currentShape = rotatedShape;
            if (checkCollision()) {
                currentShape = prevShape;
            }
        }
        function gameOver() {
            alert('游戏结束啦😊!!!');
            resetGame();
        }
        function resetGame() {
            score = 0;
            boardGrid = Array.from(Array(rows), () => new Array(cols).fill(0));
            updateScore();
            createShape();
        }
        function handleKeyPress(event) {
            switch (event.key) {
                case 'ArrowDown':
                    moveDown();
                    break;
                case 'ArrowLeft':
                    moveLeft();
                    break;
                case 'ArrowRight':
                    moveRight();
                    break;
                case 'ArrowUp':
                    rotateShape();
                    break;
            }
            drawBoard();
            drawCurrentShape();
        }
        function startGame() {
            createShape();
            setInterval(() => {
                moveDown();
                drawBoard();
                drawCurrentShape();
            }, 500);
            document.addEventListener('keydown', handleKeyPress);
        }
        startGame();
    });
</script>
  1. createShape(): 创建一个随机的俄罗斯方块形状,并将其设置为当前形状。还会初始化当前形状的行和列。
  2. drawBoard(): 在游戏面板上绘制当前的方块状态和已放置的方块。通过遍历游戏面板的二维数组 boardGrid,根据数组中的值来确定是否绘制方块。
  3. drawCurrentShape(): 在游戏面板上绘制当前的方块形状。遍历当前形状的二维数组,根据数组中的值来确定绘制方块的位置。
  4. checkCollision(): 检查当前的方块是否与已放置的方块或游戏边界发生碰撞。遍历当前形状的二维数组,检查当前方块的每个单元格是否与已放置的方块或边界发生碰撞。
  5. mergeShape(): 将当前方块合并到已放置方块的游戏面板中。遍历当前形状的二维数组,将当前方块的每个单元格的值设置为1,表示已放置方块。
  6. clearRows(): 检查游戏面板的每一行是否已满。如果某一行已满,则将该行删除,并在顶部添加新的空行。同时,增加玩家的分数。
  7. updateScore(): 更新分数显示。将分数的值更新到分数元素中。
  8. moveDown(): 将当前方块向下移动一行。如果发生碰撞,则将当前方块合并到游戏面板中,并检查是否有已满的行需要清除。如果当前方块无法再向下移动,则生成一个新的随机方块。
  9. moveLeft(): 将当前方块向左移动一列。如果发生碰撞,则撤销移动操作。
  10. moveRight(): 将当前方块向右移动一列。如果发生碰撞,则撤销移动操作。
  11. rotateShape(): 旋转当前方块的形状。通过交换二维数组的行和列来实现方块的旋转。如果旋转后发生碰撞,则撤销旋转操作。
  12. gameOver(): 游戏结束。显示游戏结束的提示框,并重置游戏。
  13. resetGame(): 重置游戏状态。将分数、游戏面板和已放置方块的二维数组重置为初始状态,然后创建一个新的随机方块。
  14. handleKeyPress(event): 处理按键事件。根据按下的按键来调用相应的移动或旋转方法,并重新绘制游戏面板和当前形状。
  15. startGame(): 启动游戏。在游戏开始时,创建一个新的随机方块,并以一定的时间间隔不断向下移动方块。同时,监听键盘按键事件。
  16. DOMContentLoaded 事件监听器:在 HTML 文档加载完成后执行代码。这是游戏逻辑的入口点。

以上就是这段 JavaScript 代码的主要方法和功能的解释。通过这些方法,实现了俄罗斯方块游戏的核心逻辑,包括生成随机方块、移动方块、检测碰撞、合并方块、清除满行等。同时,它还提供了游戏的初始化、分数计算、游戏结束和重置等功能。

完整代码

<!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>
    <style>
        h2 {
            font-size: 19px;
            text-align: center;
        }
        #tetris {
            width: 240px;
            margin: 0 auto;
            background-color: #d5d5d5;
            border-radius: 10px;
            padding: 25px;
        }
        #game-board {
            width: 200px;
            height: 400px;
            border: 4px solid #4b6014;
            position: relative;
            border-radius: 10px;
            background-color: #f4f126;
            margin: 0 auto;
        }
        #score {
            text-align: center;
            margin-top: 10px;
        }
        .block {
            width: 20px;
            height: 20px;
            position: absolute;
            background-color: #000;
            border: 1px solid #3a3a3a;
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <h2>俄罗斯方块</h2>
    <div id="tetris">
        <div id="game-board"></div>
        <div id="score">Score: <span id="score-value">0</span></div>
    </div>
</body>
<script>
    document.addEventListener('DOMContentLoaded', () => {
  let board = document.getElementById('game-board');
  let scoreValue = document.getElementById('score-value');
  let blockSize = 20;
  let rows = 20;
  let cols = 10;
  let score = 0;
  let boardGrid = Array.from(Array(rows), () => new Array(cols).fill(0));
  let currentShape;
  let currentRow;
  let currentCol;
        function createShape() {
            let shapes = [
                [[1, 1, 1, 1]],
                [[1, 1], [1, 1]],
                [[1, 1, 0], [0, 1, 1]],
                [[0, 1, 1], [1, 1, 0]],
                [[1, 1, 1], [0, 1, 0]],
                [[1, 1, 1], [1, 0, 0]],
                [[1, 1, 1], [0, 0, 1]]
            ];
            let randomIndex = Math.floor(Math.random() * shapes.length);
            let shape = shapes[randomIndex];
            currentShape = shape;
            currentRow = 0;
            currentCol = Math.floor(cols / 2) - Math.floor(shape[0].length / 2);
        }
        function drawBoard() {
            board.innerHTML = '';
            for (let row = 0; row < rows; row++) {
                for (let col = 0; col < cols; col++) {
                    if (boardGrid[row][col]) {
                        let block = document.createElement('div');
                        block.className = 'block';
                        block.style.top = row * blockSize + 'px';
                        block.style.left = col * blockSize + 'px';
                        board.appendChild(block);
                    }
                }
            }
        }
        function drawCurrentShape() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let block = document.createElement('div');
                        block.className = 'block';
                        block.style.top = (currentRow + row) * blockSize + 'px';
                        block.style.left = (currentCol + col) * blockSize + 'px';
                        board.appendChild(block);
                    }
                }
            }
        }
        function checkCollision() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let newRow = currentRow + row;
                        let newCol = currentCol + col;
                        if (
                            newRow >= rows ||
                            newCol < 0 ||
                            newCol >= cols ||
                            boardGrid[newRow][newCol]
                        ) {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        function mergeShape() {
            for (let row = 0; row < currentShape.length; row++) {
                for (let col = 0; col < currentShape[row].length; col++) {
                    if (currentShape[row][col]) {
                        let newRow = currentRow + row;
                        let newCol = currentCol + col;
                        boardGrid[newRow][newCol] = 1;
                    }
                }
            }
        }
        function clearRows() {
            for (let row = rows - 1; row >= 0; row--) {
                if (boardGrid[row].every((cell) => cell)) {
                    boardGrid.splice(row, 1);
                    boardGrid.unshift(new Array(cols).fill(0));
                    score++;
                }
            }
        }
        function updateScore() {
            scoreValue.textContent = score;
        }
        function moveDown() {
            currentRow++;
            if (checkCollision()) {
                currentRow--;
                mergeShape();
                clearRows();
                updateScore();
                createShape();
                if (checkCollision()) {
                    gameOver();
                }
            }
        }
        function moveLeft() {
            currentCol--;
            if (checkCollision()) {
                currentCol++;
            }
        }
        function moveRight() {
            currentCol++;
            if (checkCollision()) {
                currentCol--;
            }
        }
        function rotateShape() {
            let rotatedShape = currentShape[0].map((_, colIndex) =>
                currentShape.map((row) => row[colIndex]).reverse()
            );
            let prevShape = currentShape;
            currentShape = rotatedShape;
            if (checkCollision()) {
                currentShape = prevShape;
            }
        }
        function gameOver() {
            alert('游戏结束啦😊!!!');
            resetGame();
        }
        function resetGame() {
            score = 0;
            boardGrid = Array.from(Array(rows), () => new Array(cols).fill(0));
            updateScore();
            createShape();
        }
        function handleKeyPress(event) {
            switch (event.key) {
                case 'ArrowDown':
                    moveDown();
                    break;
                case 'ArrowLeft':
                    moveLeft();
                    break;
                case 'ArrowRight':
                    moveRight();
                    break;
                case 'ArrowUp':
                    rotateShape();
                    break;
            }
            drawBoard();
            drawCurrentShape();
        }
        function startGame() {
            createShape();
            setInterval(() => {
                moveDown();
                drawBoard();
                drawCurrentShape();
            }, 500);
            document.addEventListener('keydown', handleKeyPress);
        }
        startGame();
    });
</script>
</html>

✨原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

 


相关文章
|
10月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
992 1
|
11月前
|
人工智能 自然语言处理 前端开发
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
DeepSite是基于DeepSeek-V3模型的在线开发工具,无需配置环境即可通过自然语言描述快速生成游戏、网页和应用代码,并支持实时预览效果,显著降低开发门槛。
1833 93
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
|
11月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
640 70
|
10月前
|
存储 前端开发 JavaScript
|
12月前
|
前端开发 算法 NoSQL
前端uin后端php社交软件源码,快速构建属于你的交友平台
这是一款功能全面的社交软件解决方案,覆盖多种场景需求。支持即时通讯(一对一聊天、群聊、文件传输、语音/视频通话)、内容动态(发布、点赞、评论)以及红包模块(接入支付宝、微信等第三方支付)。系统采用前后端分离架构,前端基于 UniApp,后端使用 PHP 框架(如 Laravel/Symfony),配合 MySQL/Redis 和自建 Socket 服务实现高效实时通信。提供用户认证(JWT 集成)、智能匹配算法等功能,助力快速上线,显著节约开发成本。
443 2
前端uin后端php社交软件源码,快速构建属于你的交友平台
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
1136 4
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
778 2
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
3260 1
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
1635 1
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
前端开发 JavaScript 应用服务中间件
【uniapp】谷歌授权登录,前端uniapp直调(含源码)
本文介绍如何在uniapp项目中实现谷歌授权登录,无需后端参与。文章分为三部分:1)谷歌授权登录流程,详细说明从用户点击登录到获取用户信息的整个过程;2)谷歌开发者控制台配置,包括创建项目、配置同意屏幕及OAuth客户端ID等步骤;3)uniapp前端实操,提供具体代码示例,展示如何获取授权码并用其交换访问令牌,最终获取用户信息
1664 2
【uniapp】谷歌授权登录,前端uniapp直调(含源码)

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    929
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    411
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    316
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    294
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    409
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    605
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    718
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    203
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    590
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    355