搜索
系统检测到您的用户名不符合规范:

ThinkPHP5.1实现CMS程序安装向导【内附漂亮的后台】

浏览:10404 发布日期:2018年05月21日 分类:功能实现 关键字: ThinkPHP5.1实现CMS程序安装向导
只要能称作CMS的内容管理系统、自然会有一个清爽的安装向导【指南】、也就是小白的操作、假设你的顾客是开挖机的、你给他说让他改配置文件、他是不懂的、所以只能设计一个安装指南、让客户输入相关的资料即可自动安装。
ThinkPHP5.1实现CMS程序安装向导【内附漂亮的后台】


其实是图片、【尴尬的笑了】

最近在写一个小的CMS内容管理系统、因此我将如何实现CMS的安装向导和大家分享下。
在此之前、我看过很多类似的CMS管理系统、甚至有很多自称为通用的后台管理系统、各种类型、质量是参差不齐的、有的太过于简略【只有登录注册、权限管理等基础的东西】、有的太过于复杂【封装太严重】。首先我拿到这么个系统、对于小白或者刚入门的我来说、是不肯能扩展的、这辈子都不可能的【开玩笑】、研究别人的写法、我还得需要时间、但是前提你已经说了这是一个通用的管理系统、怎么通用呢?总结一点就是对于新手而言、没办法在你的基础上进行代码的修改【扩展】。
做得高端一点的呢、要收费、对于刚进入"码农"行业的小白程序猿来说、这完全是不可能的嘛、如果有可能就是被忽悠的、人家写得那么高端、你怎么去扩展、且还收费。说这么多、其实就想表达一些内容:
简单且可扩展性强、在不改动核心代码的基础之上做开发、让使用者【开发者】只专注于自己的逻辑业务的实现、在开发中、CMS值帮你提供一部分功能、且不影响你的逻辑业务。嗯、对就是这样......

进入正题、怎么实现这种引导安装呢?
我的思路是:
1、准备好你的SQL文件、
2、准备好你的安装向导页面【chou一点没关系】
3、准备一些输入框给客户、例如主机头、用户名、密码、端口等
3、验证输入是否合法、如果合法、则提交
4、加载SQL文件、执行一系列的字符串替换操作、例如替换表前缀
5、SQL准备好了、然后创建一个数据库、
6、导入SQL
7、根据客户输入的内容、修改配置文件
8、各种判断之后、如果全部成功、则说明安装成功、否则安装失败、重新来过。

嗯、就是这样、简单八步轻松搞定。
先上几张我的例示图片、再上代码吧

安装界面:

系统首页:

CMS安装的导向代码:
<?php
/**
* @Author 张超.
* @Copyright http://www.zhangchao.name
* @Email 416716328@qq.com
* @DateTime 2018年5月20日 15:53
* @Yes-Admin 安装引导
*/
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
ini_set('display_errors', '1');
//定义目录分隔符
define("DS", DIRECTORY_SEPARATOR);
//定义项目目录
define('APP_PATH', dirname(dirname(__FILE__)) . DS . 'application' . DS);
//定义web根目录
define('WWW_ROOT', dirname(__FILE__) . DS);
//定义CMS名称
$sitename = "Yes-Admin CMS";
$lockFile = "." . DS . "install" . DS . "install.lock";
if (is_file($lockFile)) {
die("<script>window.location.href = '/run'</script>");
}
if ($_GET['c'] = 'start' && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
//执行安装
$host = isset($_POST['hostname']) ? $_POST['hostname'] : '127.0.0.1';
$port = isset($_POST['port']) ? $_POST['port'] : '3306';
//判断是否在主机头后面加上了端口号
$hostData = explode(":", $host);
if (isset($hostData) && $hostData && is_array($hostData) && count($hostData) > 1) {
$host = $hostData[0];
$port = $hostData[1];
}
//mysql的账户相关
$mysqlUserName = isset($_POST['username']) ? $_POST['username'] : 'root';
$mysqlPassword = isset($_POST['password']) ? $_POST['password'] : 'root';
$mysqlDatabase = isset($_POST['database']) ? $_POST['database'] : 'yesadmin';
$mysqlPreFix = isset($_POST['prefix']) ? $_POST['prefix'] : 'yes_';
$mysqlPreFix = rtrim($mysqlPreFix, "_") . "_";
$adminUserName = isset($_POST['adminUserName']) ? $_POST['adminUserName'] : 'admin';
$adminPassword = isset($_POST['adminPassword']) ? $_POST['adminPassword'] : '123456';
$rePassword = isset($_POST['rePassword']) ? $_POST['rePassword'] : '123456';
$email = isset($_POST['email']) ? $_POST['email'] : 'admin@admin.com';

//判断两次输入是否一致
if ($adminPassword != $rePassword) {
die("<script>alert('两次输入密码不一致!');history.go(-1)</script>");
}
if (!preg_match("/^[\S]+$/", $adminPassword)) {
die("<script>alert('密码不能包含空格!');history.go(-1)</script>");
}
if (!preg_match("/^\w+$/", $adminUserName)) {
die("<script>alert('用户名只能输入字母、数字、下划线!');history.go(-1)</script>");
}
if (strlen($adminUserName) < 3 || strlen($adminUserName) > 12) {
die("<script>alert('用户名请输入3~12位字符!');history.go(-1)</script>");
}
if (strlen($adminPassword) < 5 || strlen($adminPassword) > 16) {
die("<script>alert('密码请输入5~16位字符!');history.go(-1)</script>");
}
//检测能否读取安装文件
$sql = @file_get_contents(WWW_ROOT . DS . "install" . DS . 'yesadmin.sql');
if (!$sql) {
die("<script>alert('请检查/public/install/yesadmin.sql是否有读取权限!');</script>");
}
//替换表前缀
$sql = str_replace("`yes_", "`{$mysqlPreFix}", $sql);
//链接数据库
$pdo = new PDO("mysql:host={$host};port={$port}", $mysqlUserName, $mysqlPassword, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
// 连接数据库
$link = @new mysqli("{$host}:{$port}", $mysqlUserName, $mysqlPassword);
// 获取错误信息
$error = $link->connect_error;
if (!is_null($error)) {
// 转义防止和alert中的引号冲突
$error = addslashes($error);
die("<script>alert('数据库链接失败:$error');history.go(-1)</script>");
}
// 设置字符集
$link->query("SET NAMES 'utf8'");
$link->server_info > 5.0 or die("<script>alert('请将您的mysql升级到5.0以上');history.go(-1)</script>");
// 创建数据库并选中
if (!$link->select_db($mysqlDatabase)) {
$create_sql = 'CREATE DATAbase IF NOT EXISTS ' . $mysqlDatabase . ' DEFAULT CHARACTER SET utf8;';
$link->query($create_sql) or die('创建数据库失败');
$link->select_db($mysqlDatabase);
}
$sqlArr = explode(';', $sql);
foreach ($sqlArr as $key => $val) {
if ($val) {
$link->query($val);
}
}
$password = password_hash($adminPassword, PASSWORD_BCRYPT);
$result = $link->query("UPDATE {$mysqlPreFix}admin SET name = '{$adminUserName}',password = '{$password}' WHERE name = 'admin'");
if (!$result) {
die("<script>alert('安装失败!:$error');history.go(-1)</script>");
}
$databaseConfig = include "../config" . DS . "database.php";
//替换数据库相关配置
$databaseConfig['hostname'] = $host;
$databaseConfig['database'] = $mysqlDatabase;
$databaseConfig['username'] = $mysqlUserName;
$databaseConfig['password'] = $mysqlPassword;
$databaseConfig['hostport'] = $port;
$databaseConfig['prefix'] = $mysqlPreFix;
$putConfig = @file_put_contents("../config" . DS . "database.php", "<?php\nreturn \n" . var_export($databaseConfig, true) . "\n;");
if (!$putConfig) {
die("<script>alert('安装失败、请确定database.php是否有写入权限!:$error');history.go(-1)</script>");
}
$result = @file_put_contents($lockFile, 1);
if (!$putConfig) {
die("<script>alert('安装失败、请确定install.lock是否有写入权限!:$error');history.go(-1)</script>");
}
die("<script>alert('系统安装成功、点击跳转!');window.location.href = '/run'</script>");
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>安装<?php echo $sitename; ?></title>
<meta name="renderer" content="webkit">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style type="text/css">
html, body {
height: 100%;
background-image: url("./install/img/installbg.jpg");
background-size: cover;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div style="margin: 0 auto;text-align: center;margin-top: 20px;">
<img src="install/img/logo.jpg" style="border-radius: 50%;">
</div>
</div>
<div class="col-md-4 col-md-offset-4"
style="margin-top: 20px;background-color: rgba(255,255,255,.5);padding: 30px;border-radius: 5px">
<div id="cms-box">
<form class="form-horizontal" action="./install.php?c=start" method="post">
<p style="font-size: 28px;font-weight: bolder;text-align: center;color: #fff;"><?= $sitename ?> 安装向导</p>
<div class="panel panel-default">
<div class="panel-heading">数据库相关设置</div>
<div class="panel-body">
<div class="form-group">
<label class="col-sm-2 control-label">主机地址</label>
<div class="col-sm-10">
<input type="text" name="hostname" class="form-control" placeholder="请输入主机地址、端口号可选">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">数据库名</label>
<div class="col-sm-10">
<input type="text" name="database" class="form-control" placeholder="请输入数据库名">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" name="username" class="form-control" placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" name="password" class="form-control" placeholder="请输入数据库密码">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">表前缀</label>
<div class="col-sm-10">
<input type="text" name="prefix" class="form-control" placeholder="请设置数据表前缀">
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">管理员账户相关设置</div>
<div class="panel-body">
<div class="form-group">
<label class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" name="adminUserName" class="form-control" placeholder="请输入管理员账号">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input type="text" name="email" class="form-control" placeholder="请输入管理员邮箱">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" name="adminPassword" class="form-control" placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">重复密码</label>
<div class="col-sm-10">
<input type="password" name="rePassword" class="form-control" placeholder="请再次输入密码">
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-success" style="width: 80%;">立即安装</button>
</div>
</div>
</form>
</div>

</div>
</div>
</div>
<script type="text/javascript" src="./install/static/jquery.min.js"></script>
<script type="text/javascript" src="./install/static/jquery.ripples.js"></script>
<script type="text/javascript">
$(function () {
$('body').ripples({
resolution: 512,
dropRadius: 20, //px
perturbance: 0.04,
});
});
</script>
</body>
</html>

个人技术交流QQ群:665781972
个人博客:https://www.zhangchao.name、百度文库资料可以免下载券下载【不是我告诉你的】

附件 install.zip ( 3.45 KB 下载:405 次 )

收藏
小丑鬼
积分:1785 等级:LV3
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /