微信小程序+PHP实现登录注册(手把手教程)

article/2025/9/28 16:24:05

1.环境说明

环境版本

  • PHP版本号:PHP7(!!!!注意本文基于PHP7环境开发,PHP5与PHP7有很多语法不兼容,如果您的本地环境为PHP5,则需修改PHP代码中不兼容语法部分
  • MySQL版本号:5.7.26

开发工具

  • PhPstudy 8.1.0.5
  • 微信开发者工具
  • Navicat12

2.创建 user 表

首先创建用户表,这里以 Navicat 工具为例

2.1 新建数据库

如果是第一次使用 Navicat,需要新建连接

  1. 点击左上角的 连接 -> 选择 MySQL…
    在这里插入图片描述
  2. 设置连接属性

在这里插入图片描述
这里需要注意的是:如果本机已安装了 MySQL,而安装 PhPstudy 时又安装了 PhPstudy 自带的 MySQL,这里如果想要连接 PHPstudy 安装时带的 MySQL,就需输入 PHPstudy 安装时带的 MySQL 的密码,参考链接:https://blog.csdn.net/weixin_46034990/article/details/104742459

2.1.1 选择连接右键 -> 新建数据库:
在这里插入图片描述
2.1.2 输入数据库信息:
在这里插入图片描述

2.2 导入 SQL 语句

在新建的数据库右键 -> 选择新建查询
在这里插入图片描述
将如下 SQL 复制粘贴到新建查询页面:

/*Navicat Premium Data TransferSource Server         : phpstudySource Server Type    : MySQLSource Server Version : 50726Source Host           : localhost:3306Source Schema         : tea_workTarget Server Type    : MySQLTarget Server Version : 50726File Encoding         : 65001Date: 07/06/2020 13:19:49
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`role` int(2) NULL DEFAULT 0,`RFID` int(8) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 36 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, 'bbb', '08f8e0260c64418510cefb2b06eee5cd', 'bbb@163.com', '12222222222', 0, NULL);

然后点击运行按钮,执行建表语句,创建 tb_user
在这里插入图片描述

3.小程序前台部分

3.1 登录部分

3.1.1 登录界面

在这里插入图片描述

3.1.2 登录代码

wxml——类似 HTML

注意:

  1. form 标签的 bindsubmit='login' 表示提交此表单后触发 login 方法。
  2. inputname="xxx" 属性要与 js 中的 e.detail.value.xxx 相对应。
  3. 一定要有一个 <button form-type='submit'> 按钮,点击此按钮后会提交表单,触发 login 方法。
  4. 所有标签的 class 属性均是为了调节样式使用,如不追求页面美观,可不添加 class="xxx"
<!--pages/login/login.wxml-->
<view><form bindsubmit='login'><view class="first"><input id="username" placeholder="请输入用户名" placeholder-class="plas" class="inputs" type="text" name="username"></input></view><view class="second"><input id="password" placeholder="请输入密码" placeholder-class="plas" class="inputs" type="password" name="password"></input></view><!--按钮--><view><button class="loginBtn" type="primary" form-type='submit'>登录</button></view><view class="cha" bindtap="enroll"><text class="no">没有账号,点我注册</text></view></form>
</view>
wxss——类似 CSS

为了调节前台显示样式使用的,为了美观效果,与功能实现无关

/* pages/login/login.wxss */
page{left:10rpx;right:10rpx;background-color: white;
}
.first{width: 90%;height: 100rpx;margin-top: 80rpx;margin-left: 5%;margin-right: 5%;/* 排列方式 */display: flex;/* 纵向排列 */flex-direction: row;align-items: center;background-color: #f2f2f2;border-radius: 8rpx;
}
.plas{font-size: 30rpx;color: #ccc;
}
.inputs{/* 行高 */line-height: 100rpx;font-size: 30rpx;color: #000;margin:auto;margin-left: 20rpx;width: 100%;
}
.second{width: 90%;height: 100rpx;margin-top: 30rpx;margin-left: 5%;margin-right: 5%;/* 排列方式 */display: flex;/* 纵向排列 */flex-direction: row;align-items: center;background-color: #f2f2f2;border-radius: 8rpx;
}
.cha{width: 90%;height: 50rpx;margin: auto;margin-top: 30rpx;margin-left: 5%;margin-right: 5%;
}
.no{color: black;font-size: 28rpx;margin-left: 15rpx;font-family: PingFangSC-regular;
}
json——公共配置

通用配置,比如用来调节小程序上栏标题及背景颜色,可以不写。

{"usingComponents": {},"navigationBarBackgroundColor":"#349e20","navigationBarTitleText": "用户登录","navigationBarTextStyle":"black"
}
js——重点部分

1. const app = getApp();:为了获取 app.js 声明的全局变量 globalData,如果无需获取全局变量,则可以不引入此条语句。
2. const util = require('../../utils/util.js');:为了获取 util.js 内声明的变量,比如我这里将 url 的公共前缀部分声明在了 util.js 里面,每次要发起请求访问后台时,都需获取这个公共前缀,然后进行拼接:url: util.basePath + '/app/user-list.php',。(也可以直接声明为:url:http://192.168.0.105:8888/tea_work/app/user-list.php,就无需引入此 util.js 了)
在这里插入图片描述
3. const { $Toast } = require('../../dist/base/index');为了其他额外功能,如不需要,则可以不引用。

login.js

具体看代码内的注释:

// pages/login/login.js
const app = getApp();
const util = require('../../utils/util.js');
const { $Toast } = require('../../dist/base/index');
Page({/*** 页面的初始数据*/data: {},// 点击“注册”后触发 enroll 方法,跳转到 enroll 模块enroll: function (e) {// 发起网络请求wx.navigateTo({// 开发者服务器接口地址url: '/pages/enroll/enroll',})},// 点击登录按钮后,触发此login方法login: function (e) {var me = this;// 获取前台form表单传递过来的信息,// e.detail.value.xxx:xxx为name属性的值var formObject = e.detail.value;console.log(e.detail);var username = formObject.username;var password = formObject.password;console.log("username..." + username);console.log("password....." + password);// 发起网络请求wx.request({url: util.basePath + '/app/login.php', // 声明请求方式为 POST 请求method: 'POST',// 向后台传递的数据:用户名、密码(通过e.detail.value.xxx获取input输入框输入的值)data: {'username': e.detail.value.username,'password': e.detail.value.password},// POST请求,则header声明为如下:// 若为 GET请求,则header内声明为'content-type': 'application/json'header: {'content-type': 'application/x-www-form-urlencoded'},// 接口请求成功的返回数据success(res) {console.log(res.data);// 如果后台返回的数据为 "普通用户登录成功",则跳转到用户首页if ("普通用户登录成功" == res.data) {wx.switchTab({url: '../index/index'})} else if ("管理员登录成功" == res.data) {// 如果后台返回的数据为 "普通用户登录成功",则跳转到管理员首页wx.switchTab({url: '../index/index'})} else if ("用户名或密码错误" == res.data) {// 如果后台返回的数据为 "用户名或密码错误",则模态弹框,然后跳转到登录界面wx.showModal({title: '提示',content: '用户名或密码错误',showCancel: "false",success: function (res) {if (res.confirm) {console.log('用户点击确定');wx.redirectTo({url: '../login/login'})}}})}}})},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {},/*** 生命周期函数--监听页面显示*/onShow: function () {},/*** 生命周期函数--监听页面隐藏*/onHide: function () {},/*** 生命周期函数--监听页面卸载*/onUnload: function () {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function () {},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {},/*** 用户点击右上角分享*/onShareAppMessage: function () {}
})
uitl.js

login.js 中引入的 utils/util.js:
主要使用的为 const basePath = 'http://localhost:8888/tea_work'; 这一行代码

const basePath = 'http://localhost:8888/tea_work';function formatTime(date) {var year = date.getFullYear()var month = date.getMonth() + 1var day = date.getDate()var hour = date.getHours()var minute = date.getMinutes()var second = date.getSeconds()return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}function formatNumber(n) {n = n.toString()return n[1] ? n : '0' + n
}/*** 封封微信的的request*/
function request(url, data = {}, method = "POST", header = "application/x-www-form-urlencoded") {wx.showLoading({title: '加载中...',});return new Promise(function (resolve, reject) {wx.request({url: url,data: data,method: method,header: {'Content-Type': header,'X-Nideshop-Token': wx.getStorageSync('token'),},success: function (res) {wx.hideLoading();if (res.statusCode == 200) {if (res.data.errno == 401) {wx.navigateTo({url: '/pages/auth/btnAuth/btnAuth',})} else {resolve(res.data);}} else {reject(res.errMsg);}},fail: function (err) {reject(err)}})});
}// 时间戳转换成刚刚、几分钟前、几小时前、几天前//刚刚
var just = new Date().getTime();//几分钟前
var afewminutesago = new Date("Nov 29, 2016 00:50:00").getTime();//几周前
var afewweekago = new Date("Nov 29, 2016 00:50:00").getTime();//几年前
var someday = new Date("Nov 21, 2012 01:15:00").getTime();var helloData = {time: afewweekago
}function getDateDiff(date) {date = date.substring(0, 19);date = date.replace(/-/g, '/');var dateTimeStamp = new Date(date).getTime();var result;var minute = 1000 * 60;var hour = minute * 60;var day = hour * 24;var halfamonth = day * 15;var month = day * 30;var now = new Date().getTime();var diffValue = now - dateTimeStamp;if (diffValue < 0) {return;}var monthC = diffValue / month;var weekC = diffValue / (7 * day);var dayC = diffValue / day;var hourC = diffValue / hour;var minC = diffValue / minute;if (monthC >= 1) {if (monthC <= 12)result = "" + parseInt(monthC) + "月前";else {result = "" + parseInt(monthC / 12) + "年前";}}else if (weekC >= 1) {result = "" + parseInt(weekC) + "周前";}else if (dayC >= 1) {result = "" + parseInt(dayC) + "天前";}else if (hourC >= 1) {result = "" + parseInt(hourC) + "小时前";}else if (minC >= 1) {result = "" + parseInt(minC) + "分钟前";} else {result = "刚刚";}return result;
};module.exports = {formatTime,basePath,getDateDiff
}
index.js

login.js 中引入的 dist/base/index.js:
(可以不添加)

function getCtx (selector) {const pages = getCurrentPages();const ctx = pages[pages.length - 1];const componentCtx = ctx.selectComponent(selector);if (!componentCtx) {console.error('无法找到对应的组件,请按文档说明使用组件');return null;}return componentCtx;
}function Toast(options) {const { selector = '#toast' } = options;const ctx = getCtx(selector);ctx.handleShow(options);
}Toast.hide = function (selector = '#toast') {const ctx = getCtx(selector);ctx.handleHide();
};function Message(options) {const { selector = '#message' } = options;const ctx = getCtx(selector);ctx.handleShow(options);
}module.exports = {$Toast: Toast,$Message: Message
};

3.2 注册部分

3.2.1 注册界面

在这里插入图片描述

3.2.2 注册代码

enroll.wxml
<!--pages/enroll/enroll.wxml-->
<form bindsubmit="regist"><view><view class="first"><input id="username" placeholder="请输入用户名" placeholder-class="plas" class="inputs" type="text" bindinput="usernameInput" name="username"></input></view><view class="second"><input id="password" placeholder="请输入密码" placeholder-class="plas" class="inputs" type="password" bindinput="passwordInput" name="password"></input></view><view class="second"><input id="passwordAck" placeholder="请再次输入密码" placeholder-class="plas" class="inputs" type="password" bindinput="passwordInputAck"></input></view><view class="second"><input id="email" placeholder="请输入邮箱" placeholder-class="plas" class="inputs" type="email" bindinput="emailInput" name="email"></input></view><view class="second"><input id="phoneNumber" placeholder="请输入手机号" placeholder-class="plas" class="inputs" type="number" bindinput="phoneNumberInput" name="phone"></input></view><view class="second"><input id="role" placeholder="角色" placeholder-class="plas" class="inputs" type="number" bindinput="roleInput" name="role"></input></view><!-- <view id="btn" class="click" bindtap="regist"><input type="submit">注册</input></view> --><view><button class="click" type="primary" form-type='submit'>注册</button></view><view class="cha" bindtap="signin"><text class="no">已有账号,点我登录</text></view></view>
</form>
enroll.wxss
/* pages/enroll/enroll.wxss */
page{left:10rpx;right:10rpx;background-color: white;
}
.first{width: 90%;height: 100rpx;margin-top: 80rpx;margin-left: 5%;margin-right: 5%;/* 排列方式 */display: flex;/* 纵向排列 */flex-direction: row;align-items: center;background-color: #f2f2f2;border-radius: 8rpx;
}
.plas{font-size: 30rpx;color: #ccc;
}
.inputs{/* 行高 */line-height: 100rpx;font-size: 30rpx;color: #000;margin:auto;margin-left: 20rpx;width: 100%;
}
.second{width: 90%;height: 100rpx;margin-top: 30rpx;margin-left: 5%;margin-right: 5%;/* 排列方式 */display: flex;/* 纵向排列 */flex-direction: row;align-items: center;background-color: #f2f2f2;border-radius: 8rpx;
}
.click{width: 90%;height: 100rpx;line-height: 100rpx;margin:auto;margin-top: 80rpx;background-color: #43CD80;border-radius: 8rpx;text-align: center;color: white;font-size: 33rpx;
}
.cha{width: 90%;height: 50rpx;margin: auto;margin-top: 30rpx;margin-left: 5%;margin-right: 5%;
}
.no{color: black;font-size: 28rpx;margin-left: 15rpx;font-family: PingFangSC-regular;
}
enroll.js
// pages/enroll/enroll.js
const app = getApp();
const util = require('../../utils/util.js');
const { $Toast } = require('../../dist/base/index');
Page({/*** 页面的初始数据*/data: {// 定义变量用来存储input输入的值username:"",password:"",passwordAck:"",email:"",phoneNumber:"",role:""},signin:function(e){//关闭当前页面,返回上一页面或多级页面。wx.navigateBack({// 返回上 1 页delta: 1})},// 注册regist:function(e){var that = this;if(that.data.username == ''){wx.showModal({title: '提示',content: '请输入用户名',showCancel:false,success (res) {}})}else if(that.data.password == ''){wx.showModal({title: '提示',content: '请输入密码',showCancel:false,success (res) {}})}else if(that.data.passwordAck == ''){wx.showModal({title: '提示',content: '请再次输入密码',showCancel:false,success (res) {}})}else if(that.data.passwordAck != that.data.password){wx.showModal({title: '提示',content: '两次密码输入不一致',showCancel:false,success (res) {}})}else if(that.data.email == ''){wx.showModal({title: '提示',content: '请输入邮箱',showCancel:false,success (res) {}})}else if(that.data.phoneNumber == ''){wx.showModal({title: '提示',content: '请输入手机号',showCancel:false,success (res) {}})}else if(that.data.phoneNumber.length != 11){wx.showModal({title: '提示',content: '手机号位数不正确,请重新输入',showCancel:false,success (res) {}})}else if(that.data.phoneNumber.length != 11){wx.showModal({title: '提示',content: '手机号不合法',showCancel:false,success (res) {}})}else if(that.data.role == ''){wx.showModal({title: '提示',content: '请输入角色',showCancel:false,success (res) {}})}else{wx.request({url: util.basePath + '/app/register.php', method:"POST",data: {'username':e.detail.value.username,'password':e.detail.value.password,'email':e.detail.value.email,'phone':e.detail.value.phone,'role':e.detail.value.role,},header: {'content-type': 'application/x-www-form-urlencoded'  },success (res) {console.log(res.data);}})}},// 每当 input 发生改变,触发这个方法usernameInput:function(e){// 获取 input 输入框的值this.data.username = e.detail.value;},passwordInput:function(e){// 获取 input 输入框的值this.data.password = e.detail.value;},passwordInputAck:function(e){// 获取 input 输入框的值this.data.passwordAck = e.detail.value;},emailInput:function(e){// 获取 input 输入框的值this.data.email = e.detail.value;},phoneNumberInput:function(e){// 获取 input 输入框的值this.data.phoneNumber = e.detail.value;},roleInput:function(e){// 获取 input 输入框的值this.data.role = e.detail.value;},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {},/*** 生命周期函数--监听页面显示*/onShow: function () {},/*** 生命周期函数--监听页面隐藏*/onHide: function () {},/*** 生命周期函数--监听页面卸载*/onUnload: function () {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function () {},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {},/*** 用户点击右上角分享*/onShareAppMessage: function () {}
})

4.PHP后台代码

如果本地没有PHP环境,要先使用 phpStudy 一键搭建PHP开发环境

4.1 连接数据库部分

connect.php:

<?php
$server = "localhost";//主机
$db_username = "root";// MySQL 数据库用户名
$db_password = "root";// MySQL 数据库密码
$db_name = "tea_work";//你的数据库名字$con = new mysqli($server, $db_username, $db_password,$db_name);//链接数据库// 检测连接
if (!$con) {die("Connection failed: " . mysqli_connect_error());
}
//echo "连接成功";
?>

4.2 登录部分

login.php

<?phpheader("Content-Type: text/html; charset=utf8");$name=$_POST['username'];//post获取表单里的name
$password=md5($_POST['password']);//post获取表单里的passwordinclude('connect.php');//链接数据库
$q="select * from `tb_user` where `username` = '$name' and `password` = '$password'";//向数据库查询表单传来的值的sql
$con->query('SET NAMES UTF8');
$result = $con->query($q);// 执行 sql// 获取执行 sql 后的返回对象
$obj=$result->fetch_assoc();if (mysqli_num_rows($result) > 0){// 管理员if($obj["role"] == '1'){echo"管理员登录成功";}else{echo"普通用户登录成功";}}else{echo "用户名或密码错误";
}
$con->close();//关闭数据库?>

4.3 注册部分

register.php:

<?phpheader("Content-Type: text/html; charset=utf8");$username=$_POST['username'];//post获取表单里的name
$password=md5($_POST['password']);//post获取表单里的password
$email=$_POST['email'];//post获取表单里的email
$phone=$_POST['phone'];//post获取表单里的phone
$role=$_POST['role'] ;//post获取表单里的roleinclude('connect.php');//链接数据库
$q="insert into tb_user(id,username,password,email,phone,role) values (null,'$username','$password','$email','$phone','$role')";//向数据库插入表单传来的值的sql
$reslut=$con->query($q);//执行sqlecho $q;
if (!$reslut){echo "注册失败";
}else{echo "注册成功";
}
$con->close()//关闭数据库
?>

补充:在小程序开发工具内进行本地调试(即请求url为127.0.0.1://xxx或localhost://xxx)时,如果出现如下报错信息:
http://127.0.0.1 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html在这里插入图片描述
解决方法:勾选如下选项即可。
在这里插入图片描述

补充注意

对于纯小白的新手,一定要先按照此教程顺序,从上到下依次执行,不要做任何修改,先跑通这个 demo,在这个过程中熟悉字段与属性的对应关系。
看到成功的效果后,再考虑在这个 demo 的基础上进行修改,添加或删除字段,注意:如果修改数据库字段,一定要在代码中进行全局搜索,找到对应字段的位置,进行相应的修改或删除。


http://chatgpt.dhexx.cn/article/YnSLgACo.shtml

相关文章

PHP实现生成小程序二维码带参数进入指定页面

1.需求场景 1.小程序一定要是发布的小程序。2.记得把业务域名加上。 场景&#xff1a;需要在网页上生成小程序的二维码图片&#xff0c;微信扫码之后带参数进入指定的小程序页面 小程序在扫描二维码跳转的指定页面中&#xff0c;在onload里面接收参数。 注意scene是后台返回的…

PHP_微信小程序(1)

能够使用laravel中间件检查用户权限能够注册成功小程序账号能够成功安装小程序开发工具能够运行第一个简单的hello world小程序掌握小程序文件结构 appapp.jsonapp.wxssapp.jspagespage.wxmlpage.wxsspage.jsonpage.js 了解app.json配置文件与作用 设置小程序的窗口 底部菜单 …

Java JCEF集成Chromium

目录 一. 前言 二. 构建 1. 前期准备 (1) JDK 1.8_271 32 bit (2) eclipse (3) 编译好的32 bit JCEF 2. 验证一下编译的JCEF能不能跑 3. 在eclipse 创建一个项目 4. 拷贝JCEF依赖 4. 配置Native Library(重要) 5. 删掉不需要的包 6. 试跑 三. 总结 一. 前言 假设…

JavaEE——JUC

JavaEE传送门 JavaEE JavaEE——常见的锁策略 JavaEE——CAS 目录 JUC1. Callable 接口2. ReentrantLock3. 原子类4. 线程池5. 信号量 Semaphore6. CountDownLatch JUC JUC 全称 java.util.concurrent 1. Callable 接口 类似于 Runnable. Runnable 描述的任务, 不带返回值. C…

jemalloc

项目的线上服务器&#xff0c;在code中大量使用了std::map&#xff0c;发现就存在一个问题&#xff0c;这个map使用后&#xff0c;clear后内存并不能很好的释放&#xff0c;这个主要就是std malloc的问题。可以尝试使用jemalloc和tcmalloc这些三方的malloc库。在目前我项目中&a…

Jacob简介

一、Jacob 介绍 Jacob 是 JAVA-COM Bridge的缩写&#xff0c;是一个中间件&#xff0c;能够提供自动化访问MS系统下COM组件和Win32 libraries的功能。 MS系统提供的COM组件 COM组件对象IDMS WordWord.ApplicationMS ExcelExcel.ApplicationMS PowerpointPowerpoint.Applicat…

Jacoco 入门使用

Jacoco入门使用 一、背景1. 为什么需要代码覆盖率2. 原理3. 插桩方式 二、项目实战on the fly模式(运行时插桩)1. 原理2. 配置执行2.1 环境准备2.2 以jacoco代理方式启动被测服务2.2.1 参数说明2.2.2 多种方式启动服务方式一&#xff1a;命令行方式二&#xff1a;maven插件启动…

关于jacoco的学习

目录 jacoco简单介绍 idea使用jacoco简单步骤 ANT构建 TOMCAT构建 准备工作 Tomcat配置 jacoco简单介绍 Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中&#xff0c;并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提…

JaCoCo官方教程

翻译自官方文档 1 概念 1.1 任务 - Mission JaCoCo应该为基于Java VM的环境中的代码覆盖率分析提供标准技术。重点是提供一个轻量级&#xff0c;灵活且文档齐全的库&#xff0c;以与各种构建和开发工具集成。 有几种适用于Java的开源覆盖技术。在实现Eclipse插件EclEmma时&am…

Jacoco简介

两分钟带你了解Jacoco 从测试小白一跃成为Testng专家 Java代码覆盖率实现方式有哪些 Jacoco的出发点是为基于JVM运行的代码提供代码覆盖率统计&#xff0c;期望提供轻量级的、可伸缩的、文档较全的库文件来集成各类构建和开发工具。 Java代码覆盖率工具有几款开源工具&#xff…

Maven工程加入Jacoo生成代码测试覆盖率报告

完整代码Github地址&#xff1a; https://github.com/mgljava/jacoco-demo Maven&#xff1a;Apache Maven是一个软件项目管理和理解工具。Maven基于项目对象模型(POM)的概念&#xff0c;可以从中心信息管理项目的构建、报告和文档 Jacoco&#xff1a;Java Code Coverage Lib…

Java单元覆盖率工具JaCoCo详细理解和使用(配置+示例)

一、代码覆盖率理解 代码覆盖&#xff08;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。 简单来理解&#xff0c;就是单元测试中代码执行量与代码总量之间的比率。 Java常用的单元测试…

怎么自学C语言 入门

第一阶段&#xff1a;C语言基础 在开始学习C语言基础时&#xff0c;要反问自己为什么学C语言&#xff0c;如何学好C语言。同时要知道什么是C语言以及C语言的发展。 当对这些知识有了一个概念之后&#xff0c;就正式开始学习C语言了&#xff0c;其中&#xff0c;可能会学到数据…

C语言入门03

运算符 流程控制语句

【C语言】C语言入门经典题目(范围广,内容多)

✨作者&#xff1a;小孙的代码分享 ✨专栏&#xff1a;《C语言入门》 ✨送给各位的一句话&#xff1a;空杯心态 才能学到新知 ✨希望大家看完这些题目有所收获&#xff0c;别忘了&#xff0c;点赞评论&#xff01; 目录 前言 &#x1f604; 字符转ASCII码&#x1f525; 判断闰…

C语言入门1:Hello World

C语言入门1&#xff1a;Hello World 1、第一个C语言程序&#xff1a;Hello World&#xff01;&#xff08;1&#xff09;编辑hello.c文件&#xff08;2&#xff09;在hello.c下面编辑如下代码&#xff0c;并保存&#xff08;3&#xff09;编译hello.c文件&#xff08;4&#xf…

C语言入门(1)——Hello World

C语言入门(1)——Hello World 1. 第一个C语言程序&#xff1a;Hello World 开始的第一个程序是一个最简单的程序&#xff0c;也就是最经典的Hello World程序&#xff0c;它的功能为打印出Hello World。程序的内容非常简单&#xff0c;也是C语言编写程序的基本结构框架。 1.示…

c语言入门介绍 Hello, World

相信每一个c语言的初学者的第一个程序都是从 Hello, World! 开始的吧。不过新手刚开始接触&#xff0c;应该有许多不懂的地方&#xff0c;下面我就通过Visual Studio 2019编程环境来简单介绍一下这个程序。 第一句是由于Visual Studio 2019编程环境中scanf函数&#xff08;输入…

C语言入门的三个简易程序

文章目录 一、打印100&#xff5e;200之间的素数方法一&#xff1a;1.思路2.代码如下3.结果图 方法二:1.思路2.代码如下3.结果图 二、打印乘法口诀表1.思路2.代码如下3.结果图 三、输出1000&#xff5e;2000之间的闰年1.思路2.代码如下3.结果图 四、提升 一、打印100&#xff5…

C语言入门 九九乘法表

利用C语言 输出九九乘法表 用双重循环来完成&#xff0c;外循环用变量i控制输出的行数&#xff08;总共九行&#xff09;同时i也是被乘数。 内循环用变量j循还控制列号&#xff0c;同时j也是乘数&#xff0c;规定列号不能大于行号&#xff0c;每一行输出结束后换行。 #inclu…