源码地址:https://download.youkuaiyun.com/download/2302_79553009/89933699
项目简介
本项目旨在构建一个基于MBTI(迈尔斯-布里格斯性格分类指标)理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发,旨在帮助用户更好地理解和运用MBTI理论来评估个人性格类型,并应用于职业规划、团队建设和人际交往等多个方面。
用户端功能 包括账号注册与登录、在线性格测试、性格类型浏览、团队评估及在线交友等模块。用户可以通过完成性格测试来获得详细的MBTI性格分析,并通过平台提供的功能与其他具有不同性格类型的用户互动。
管理端功能 则包括了数据可视化、用户管理、测试题目管理和性格类型信息维护等功能。管理员可以通过数据可视化大屏监控网站运营状况,包括但不限于用户数量、性格类型分布等信息,并能对用户数据和测试题目进行维护。
技术实现 上,项目采用了header-body-footer三层架构,并通过Ajax技术实现了局部页面刷新,提升了用户体验。同时,为了保证数据的安全性和管理的便利性,项目还设计了专门的数据库结构,并引入了多种第三方库以增强平台的功能性和美观性。
项目效果预览
项目功能
用户端
用户端实现功能:
1、用户进行账号注册登录。
2、用户点击性格测试可进行答题判定16人格属性。完成答题后展示相应
性格结果以及MBTI四维度属性可视化。
3、用户点击性格类型可自主查看16人格详细性格描述以及相关网络昵称。
4、用户点击团队评估,可自行完成3、4、5人团队组建。网站会更具团队
人数以及团队成员的MBTI性格给出评估结果。针对四个维度进行相应分析,并给出针对于该团队的建议。
5、用户点击交友论坛可进入线上聊天模块,用户将以注册账号与已完成测
试的MBTI性格对应头像示人,与其他用户进行线上交流。
管理端
管理端实现功能:
1、进行用户管理员权限判定,进入后台界面。
2、管理员可以打开数据可视化大屏查看包括当前用户人数、网站最稀有人格、用户男女比例、用户活跃时间等数据。
3、管理员点击用户管理进入用户管理界面,可对当前网站所有已注册用户进行删除、修改和查询操作。
4、管理员点击MBTI题目管理,可对当前网站数据库已经存储的题目进行增加、删除、修改的操作,完成对题目集的管理。
5、管理员点击MBTI数据管理,可以进行当前网站16人格的详细描述信息预览,并进行实时更新信息。完成对16人人格的信息数据管理。
数据库设计
开发准备
工具引入
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="layui/layui.js"></script>
<script src="echarts.js/echarts.min.js"></script>
<link href="//unpkg.com/layui@2.9.18/dist/css/layui.css" rel="stylesheet">
项目开发
用户端开发
用户注册
用户完成信息输入,网站将插入该用户信息进入数据库进行保存完成注册。用户注册页面如下。
代码:
<?
$username=$_POST['username1'];
$password=trim($_POST['password1']);
$sex=$_POST['sex'];
$age=$_POST['age'];
$email=$_POST['email'];
//连接数据库
require "conn.php";
//判断是否输入名字
if( ! strlen($username) || ! strlen($password)){
echo "<script>alert('用户名和密码都必须填写!');history.back();</script>";
exit();
}
//判断用户名是否被占用
$sql="select * from user where account='$username'";
$result=mysqli_query($conn,$sql);
$num=mysqli_num_rows($result);
if($num){
echo "<script>alert('该账号已存在,请更换账号!');history.back();</script>";
exit();
}
if(!empty($email)){
if(!preg_match('/^[a-zA-Z0-9_\-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/',$email)){
echo "<script>alert('邮箱格式不正确!');history.back();</script>";
exit();
}
}
$sql1="insert into user(account,passwd,sex,email,age) values('$username','$password','$sex','$email','$age')";
$result1=mysqli_query($conn,$sql1);
if($result1){
echo "<script>alert('注册成功!');history.back();</script>";
}else{
echo "<script>alert('注册失败!');history.back();</script>";
}
?>
用户登录
用户登录完成账号密码输入,经过网站验证。成功后进入网站用户端首页。
用户登录页面如图
代码:
<?
session_start();
$username=trim($_POST['username']);
$password=trim($_POST['password']);
if( ! strlen($username) || ! strlen($password)){
echo "<script>alert('账号和密码都必须填写!');history.back();</script>";
exit();
}
else{
if(!preg_match('/^[a-zA-Z0-9_*]{6,10}$/',$password)){
echo "<script>alert('密码必须填写,且只能为大小写字母和数字,以及*,_构成,长度为6-10个字符!');history.back();</script>";
exit();
}
}
require "conn.php";
$sql="select * from user where account='$username' and passwd='$password'";
$result=mysqli_query($conn,$sql);
$r = mysqli_fetch_assoc($result);
$num = mysqli_num_rows($result);
if($num){
$_SESSION['userid']=$r['id'];
$id = $_SESSION['userid'];
if($r['admin']==1){
echo "<script>alert('欢迎管理员登录!');location.href='management.php';</script>";
}else{
echo "<script>alert('登录成功!');location.href='mbti_test.php';</script>";
}
}
else{
echo "<script>alert('登录失败!');history.back();</script>";
}
?>
MBTI性格测试
性格测试页面效果图如图
点击导航栏性格测试,将可以在本页面进行MBTI题目测试。每道题网站将根据同意与反对的程度来进行MBTI四种维度的判别。题目展示主要依靠表单input的radio属性来进行展示。一页展示五道题目,点击下一个按钮将展示第二部分题目。一共四部分测试题,分别对应MBTI四种维度属性,分别判断四个字母,形成最后的MBTI测试结果。并将测试结果添加至当前用户信息中。题目切换如图
关键代码:
<div class="main" id="main">
<div style="background-color: #33A474;height: 400px;">
<div style="text-align: center;height: 200px;">
<h1 style="font-size: 60px;color: white;padding-top: 100px;">MBTI性格测试</h1>
<p style="color: white;font-size: 20px;margin-top: 20px;">完成下方题目获取您的性格类型</p>
</div>
<div style="display: flex;">
<div style="margin: auto; display: flex;margin-top: 150px;">
<div class="card" style="width: 300px;height: 300px;background: rgba(255,255,255,0.7)" >
<div style="text-align: center;width: 300px;height: 200px;">
<img src="images/icon1.png" class="card-img-top" style="width: 50%;height: 50%;margin-top: 20px;">
</div>
<div class="card-body">
<b><p class="card-text" style="font-size: 20px;text-align: center;">借助我们的精选材料,塑造你想要的自我。</p></b>
</div>
</div>
<div class="card" style="width: 300px;height: 300px;margin-left: 50px;background: rgba(255,255,255,0.7)">
<div style="text-align: center;width: 300px;height: 200px;">
<img src="images/icon2.png" class="card-img-top" style="width: 40%;height: 70%;margin-top: 20px;" >
</div>
<div class="card-body">
<b> <p class="card-text" style="font-size: 20px;text-align: center;">做你自己,诚实回答,找出你的性格类型。</p></b>
</div>
</div>
<div class="card" style="width: 300px;height: 300px;margin-left: 50px;background: rgba(255,255,255,0.7)">
<div style="text-align: center;width: 300px;height: 200px;">
<img src="images/icon3.png" class="card-img-top" style="width: 50%;height: 50%;margin-top: 20px;" >
</div>
<div class="card-body">
<b> <p class="card-text" style="font-size: 20px;text-align: center;">了解你的性格类型在你生活的各个领域中产生影响。</p></b>
</div>
</div>
</div>
</div>
</div>
<div>
<img style="width: 100%" src="images/border2.png">
</div>
<!-- 测试题目-->
<div style="margin-top: 150px;">
<form class="questionForm" action="" method="post" id="myForm" >
<?
require "conn.php";
$sqlei = "select id,content from question where type ='EI' limit 5";
$sqlsn = "select id,content from question where type ='SN' limit 5";
$sqltf = "select id,content from question where type ='TF' limit 5";
$sqljp = "select id,content from question where type ='JP' limit 5";
$resultei =mysqli_query($conn,$sqlei);
$resultsn =mysqli_query($conn,$sqlsn);
$resulttf =mysqli_query($conn,$sqltf);
$resultjp =mysqli_query($conn,$sqljp);
?>
<div class="page" id="page1">
<?
while($rowei = mysqli_fetch_array($resultei)){
list($idei,$contentei) = $rowei;
?>
<legend style="margin-top: 20PX;"><?echo $contentei?></legend>
<fieldset style="margin-top: 40PX;margin-bottom: 50px;">
<h1 style="margin-top: 10px;margin-right: 20px; ">同意</h1>
<label>
<input class="R-3" type="radio" name="<?echo $idei?>" value="-3" required>
</label>
<label>
<input class="R-2" type="radio" name="<?echo $idei?>" value="-2">
</label>
<label>
<input class="R-1" type="radio" name="<?echo $idei?>" value="-1">
</label>
<label>
<input class="R0" type="radio" name="<?echo $idei?>" value="0">
</label>
<label>
<input class="R1" type="radio" name="<?echo $idei?>" value="1">
</label>
<label>
<input class="R2" type="radio" name="<?echo $idei?>" value="2">
</label>
<label>
<input class="R3" type="radio" name="<?echo $idei?>" value="3">
</label>
<h1 style="margin-top: 10px;">反对</h1>
</fieldset>
<hr>
<?}?>
<button type="button" onClick="nextPage(2)" id="scrollToTopButton">下一个</button>
</div>
<script>
function isElementVisible(element) {
return element.style.display !== 'none' && window.getComputedStyle(element).visibility !== 'hidden';
}
function getNextPage(currentPage, pageId) {
// 隐藏当前页面
if (currentPage) {
currentPage.style.display = 'none';
}
// 显示目标页面
const targetPage = document.getElementById(`page${pageId}`);
if (targetPage) {
targetPage.style.display = 'block';
}
}
function nextPage(pageId) {
const currentPage = Array.from(document.querySelectorAll('.page')).find(isElementVisible);
getNextPage(currentPage, pageId);
}
function prevPage(pageId) {
const currentPage = Array.from(document.querySelectorAll('.page')).find(isElementVisible);
getNextPage(currentPage, pageId);
}
// 切换题目后页面回到顶端
document.getElementById('scrollToTopButton').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
document.getElementById('scrollToTopButton1').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
document.getElementById('scrollToTopButton2').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
document.getElementById('scrollToTopButton3').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
document.getElementById('scrollToTopButton4').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
document.getElementById('scrollToTopButton5').addEventListener('click', function() {
// 使用平滑滚动回到顶部
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
$('#myForm').on('submit', function(event) {
event.preventDefault();
var formData = $(this).serialize(); // 序列化表单数据
$.ajax({
url: 'test_result.php', // 处理表单数据的PHP文件路径
type: 'POST', // 提交方式
data: formData, // 要发送的数据
success: function(response) {
$('#main').html(response);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log('Error: ' + textStatus + ' ' + errorThrown);
}
});
});
$(document).ready(function() {
$('#loadtest').click(function() {
$.ajax({
url: 'mbti_test.php',
type: 'GET',
success: function(data) {
$('#all').html(data);
},
error: function() {
alert('加载内容失败!');
}
});
});
$('#loadkinds').click(function() {
$.ajax({
url: 'allkinds.php',
type: 'GET',
success: function(data) {
$('#main').html(data);
},
error: function() {
alert('加载内容失败!');
}
});
});
$('#loadteams').click(function() {
$.ajax({
url: 'teams.php',
type: 'GET',
success: function(data) {
$('#main').html(data);
},
error: function() {
alert('加载内容失败!');
}
});
});
$('#loadcomment').click(function() {
$.ajax({
url: 'comment.php',
type: 'GET',
success: function(data) {
$('#main').html(data);
},
error: function() {
alert('加载内容失败!');
}
});