阿里百秀后台管理项目笔记 ---- Day02
来吧展示:
step1: 动态获取用户头像信息
- 引入 jquery.js 文件
<script src="/static/assets/vendors/jquery/jquery.js"></script>
- 显示头像的时机:在输入完邮箱后鼠标跳转到下一个input中才显示,所以事件是 blur
$('#email').on('blur', function () {
)}
- 利用正则表达式去判断用户输入的是不是邮箱
var emailFormat = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/
- 忽略掉文本框为空或者不是一个邮箱
方法是 emailFormat.test()
if (!value || !emailFormat.test(value)) return
- 利用ajax的方式去获取头像信息,使用淡入淡出方式展示图片
$.get('/admin/api/avatar.php', { email: value }, function (res) {
// 希望 res => 这个邮箱对应的头像地址
if (!res) return
// 展示到上面的 img 元素上
// $('.avatar').fadeOut().attr('src', res).fadeIn()
$('.avatar').fadeOut(function () {
// // 等到 淡出完成
$(this).on('load', function () {
// // 图片完全加载成功过后
$(this).fadeIn()
}).attr('src', res)
})
})
- 创建一个api文件夹,专门用来存放接口文件
avatar.php
<?php
require_once '../../config.php';
// 1. 接收传递过来的邮箱
if (empty($_GET['email'])) {
exit('缺少必要参数');
}
$email = $_GET['email'];
// 2. 查询对应的头像地址
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (!$conn) {
exit('连接数据库失败');
}
$res = mysqli_query($conn, "select avatar from users where email = '{$email}' limit 1;");
if (!$res) {
exit('查询失败');
}
$row = mysqli_fetch_assoc($res);
// 3. echo
echo $row['avatar'];
- 整合 login.php 代码
$(function ($) {
var emailFormat = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/
$('#email').on('blur', function () {
var value = $(this).val()
// 忽略掉文本框为空或者不是一个邮箱
if (!value || !emailFormat.test(value)) return
// console.log(value)
$.get('/admin/api/avatar.php', { email: value }, function (res) {
// 希望 res => 这个邮箱对应的头像地址
if (!res) return
// 展示到上面的 img 元素上
// $('.avatar').fadeOut().attr('src', res).fadeIn()
$('.avatar').fadeOut(function () {
// // 等到 淡出完成
$(this).on('load', function () {
// // 图片完全加载成功过后
$(this).fadeIn()
}).attr('src', res)
})
})
})
})
step2: 首页index.php的站点内容统计数据的动态呈现
- 引入 functions.php 文件执行数据库的查询操作
require_once '../functions.php';
- 执行数据的查询
$posts_count = mysql_one('select count(1) as num from posts;')['num'];
$categories_count = mysql_one('select count(1) as num from categories;')['num'];
$comments_count = mysql_one('select count(1) as num from comments;')['num'];
- 将数据动态呈现到页面
<ul class="list-group">
<li class="list-group-item"><strong><?php echo $posts_count ;?></strong>篇文章(<strong>2</strong>篇草稿)</li>
<li class="list-group-item"><strong><?php echo $categories_count; ?></strong>个分类</li>
<li class="list-group-item"><strong><?php echo $comments_count; ?></strong>条评论(<strong>1</strong>条待审核)</li>
</ul>
step3: 使用饼图呈现统计数据
来吧展示:
- echarts官网下载文件
https://echarts.apache.org/zh/index.html - 找到想绘制的饼图实例
- 引入 echarts.min.js 文件
<script src="/static/assets/vendors/echarts/echarts.min.js"></script>
- 准备一个盒子去展示饼图
<div class="col-md-4">
<div id="main" style="width: 600px;height:400px;"></div>
</div>
- 制作饼图
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main'));
var option = {
title: {
text: '站点内容统计',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
orient: 'vertical',
left: 'left',
data: ['文章', '分类', '评论']
},
series: [
{
name: '数据统计',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: [
{value: <?php echo $posts_count; ?>, name: '文章'},
{value: <?php echo $categories_count; ?>, name: '分类'},
{value: <?php echo $comments_count; ?>, name: '评论'}
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myChart.setOption(option);
</script>
step4:获取当前登录用户信息与头像
sidebar.php
//php部分
require_once '../functions.php';
$current_user = get_userinfo();
//html部分
<div class="profile">
<img class="avatar" src="<?php echo $current_user['avatar'] ;?>">
<h3 class="name"><?php echo $current_user['nickname'] ;?></h3>
</div>
step5: 分类列表数据呈现
- 引入 functions.php 以及判断用户登录状态
require_once '../functions.php';
get_userinfo();
- 查询 categories 表中所有数据
$categories = mysql_all('select * from categories;');
- 将查询到的数据渲染到页面上
<tbody>
<?php foreach ($categories as $item): ?>
<tr>
<td class="text-center"><input type="checkbox"></td>
<td><?php echo $item['name']; ?></td>
<td><?php echo $item['slug']; ?></td>
<td class="text-center">
<a href="javascript:;" class="btn btn-info btn-xs">编辑</a>
<a href="javascript:;" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
step5: 添加分类功能
来吧展示:
- 在添加分类的 form 表单中加入 method 与 action 属性
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
- 在名称与别名中添加 name 属性 name 属性的名字与id名字一致
<input id="name" name="name" class="form-control"
name="name" type="text" placeholder="分类名称">
<input id="slug" name="slug" class="form-control"
name="slug" type="text" placeholder="slug">
- 判断表单提交方式是否为 post ,如果是则执行add_category() 函数
if($_SERVER['REQUEST_METHOD'] === 'POST'){
add_category();
}
- 插入更新语句 更新数据库
function add_category(){
if(empty($_POST['name']) || empty($_POST['slug'])){
$GLOBALS['message'] = '请完整填写表单';
return;
}
$name = $_POST['name'];
$slug = $_POST['slug'];
$rows = mysql_change("insert into categories values (null, '{$slug}', '{$name}');");
//添加成功与添加失败的信息提示
$GLOBALS['success'] = $rows > 0;
$GLOBALS['message'] = $rows <= 0 ? '添加失败!' : '添加成功!';
}
- 添加成功与添加失败的错误信息呈现
引入 bootstrap.css 文件
<link rel="stylesheet" href="/static/assets/vendors/bootstrap/css/bootstrap.css">
<?php if (isset($message)): ?>
<?php if ($success): ?>
<div class="alert alert-success">
<strong>成功!</strong> <?php echo $message; ?>
</div>
<?php else: ?>
<div class="alert alert-danger">
<strong>错误!</strong> <?php echo $message; ?>
</div>
<?php endif ?>
<?php endif ?>
step6: 单条数据删除
- 在删除的 a 标签中更改 href 属性值,当点击删除时跳转到删除页
<a href="/admin/categories.php?id=<?php echo $item['id']; ?>"class="btn btn-info btn-xs">编辑</a>
- categroies.php
<?php
require_once '../functions.php';
if (empty($_GET['id'])) {
exit('缺少必要参数');
}
$id = $_GET['id'];
$rows = mysql_change('delete from categories where id in (' . $id . ');');
header('Location: /admin/categories.php');
?>
step7: 批量删除的显示与隐藏
来吧展示:
- 给批量删除的标签加上id属性
<a id = "btn-delete" class="btn btn-danger btn-sm" href="javascript:;" style="display: none">批量删除</a>
- 实现批量删除方法一:
这个方法不能从根本上删除数据,不宜采纳
// 实现批量操作方法一:
$(function($){
var $tbodyCheckboxs = $('tbody input')
var $btnDelete = $('#btn_delete')
$tbodyCheckboxs.on('change',function(){
var flag = false
$tbodyCheckboxs.each(function(i,item){
if($(item).prop('checked')){
flag = true
}
})
flag ? $btnDelete.fadeIn() : $btnDelete.fadeOut()
})
})
- 实现批量操作方法二:
能从根本上实现批量删除
//实现批量操作方法二:
$(function($){
var $tbodyCheckboxs = $('tbody input')
var $btnDelete = $('#btn_delete')
var allCheckeds = []
$tbodyCheckboxs.on('change',function(){
var id = $(this).data('id')
if($(this).prop('checked')){
allCheckeds.push(id)
}else{
allCheckeds.splice(allCheckeds.indexOf(id),1)
}
console.log(allCheckeds)
allCheckeds.length ? $btnDelete.fadeIn() : $btnDelete.fadeOut()
// 显示批量删除都有哪些id值
$btnDelete.attr('href','/admin/category-delete.php?id='+allCheckeds)
// 要用到dom属性下的serch属性,所有要换成prop
})
})
step8: 编辑分类
来吧展示:
- 判断用户是编辑还是添加,添加是插入数据,编辑是更新数据
if (empty($_GET['id'])) {
// 添加
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
add_category();
}
}else {
$current_edit_category = mysql_one('select * from categories where id = ' . $_GET['id']);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
edit_category();
}
}
- 编辑函数
function edit_category () {
global $current_edit_category;
// 接收并保存
$id = $current_edit_category['id'];
$name = empty($_POST['name']) ? $current_edit_category['name'] : $_POST['name'];
$current_edit_category['name'] = $name;
$slug = empty($_POST['slug']) ? $current_edit_category['slug'] : $_POST['slug'];
$current_edit_category['slug'] = $slug;
// insert into categories values (null, 'slug', 'name');
$rows = mysql_change("update categories set slug = '{$slug}', name = '{$name}' where id = {$id}");
$GLOBALS['success'] = $rows > 0;
$GLOBALS['message'] = $rows <= 0 ? '更新失败!' : '更新成功!';
}
3.在编辑的a标签中更改href属性值,根据id去执行相应的编辑功能
<a href="/admin/categories.php?id=<?php echo $item['id']; ?>" class="btn btn-info btn-xs">编辑</a>
- 在页面中判断用户是添加还是编辑,分别显示不同的页面
<div class="col-md-4">
<?php if (isset($current_edit_category)): ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?id=<?php echo $current_edit_category['id']; ?>" method="post">
<h2>编辑《<?php echo $current_edit_category['name']; ?>》</h2>
<div class="form-group">
<label for="name">名称</label>
<input id="name" class="form-control" name="name" type="text" placeholder="分类名称" value="<?php echo $current_edit_category['name']; ?>">
</div>
<div class="form-group">
<label for="slug">别名</label>
<input id="slug" class="form-control" name="slug" type="text" placeholder="slug" value="<?php echo $current_edit_category['slug']; ?>">
<p class="help-block">https://zce.me/category/<strong>slug</strong></p>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">保存</button>
</div>
</form>
<?php else: ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<h2>添加新分类目录</h2>
<div class="form-group">
<label for="name">名称</label>
<input id="name" name="name" class="form-control" name="name" type="text" placeholder="分类名称">
</div>
<div class="form-group">
<label for="slug">别名</label>
<input id="slug" name="slug" class="form-control" name="slug" type="text" placeholder="slug">
<p class="help-block">https://zce.me/category/<strong>slug</strong></p>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">添加</button>
</div>
</form>
<?php endif ?>
</div>
step 9 : 退出功能
来吧展示:
- 在 nav.php 文件的退出 a 链接中更改一下 href 属性值
<nav class="navbar">
<!-- <button class="btn btn-default navbar-btn fa fa-bars"></button> -->
<ul class="nav navbar-nav navbar-right">
<li><a href="profile.php"><i class="fa fa-desktop"></i>网站首页</a></li>
<li><a href="profile.php"><i class="fa fa-user-circle-o"></i>个人中心</a></li>
<li><a href="/admin/login.php?action=logout"><i class="fa fa-sign-out"></i>退出</a></li>
</ul>
</nav>
- 在 login.php 文件中加入实现退出功能代码,删除 session
// 退出功能
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['action']) && $_GET['action'] === 'logout') {
// 删除了登录标识session
unset($_SESSION['current_login_user']);
}
阿里百秀后台管理项目笔记 ---- Day02的更多相关文章
- 阿里百秀后台管理项目笔记 ---- Day01
摘要 在此记录一下阿里百秀项目的教学视频的学习笔记,部分页面被我修改了,某些页面效果会不一样,基本操作是一致的,好记性不如烂笔头,加油叭!!! step 1 : 整合全部静态页面 将静态页面全部拷贝到 ...
- vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
之前写过一篇vue初始化项目,构建vuex的后台管理项目架子,这个structure-admin-web所拥有的功能 接下来,针对structure-admin-web的不足,进行了补充,开发了具有登 ...
- vue初始化项目,构建vuex的后台管理项目架子
构架vuex的后台管理项目源码:https://github.com/saucxs/structure-admin-web 一.node安装 可以参考这篇文章http://www.mwcxs.top/ ...
- SSM 电影后台管理项目
SSM 电影后台管理项目 概述 通过对数据库中一张表的CRUD,将相应的操作结果渲染到页面上. 笔者通过这篇博客还原了项目(当然有一些隐藏的坑),然后将该项目上传到了Github.Gitee,在末尾会 ...
- docloud后台管理项目(开篇)
最近朋友做app需要web做后台管理,所以花了一周时间做了这个项目. 废话不多说,开发环境是nginx+php5.3,使用thinkphp框架.是一个医疗器械数据统计的后台,业务功能很简单就是查看用户 ...
- 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo
¶项目分析 一个完整的网站服务架构,包括: 1.web frame ---这里应用express框架 2.web server ---这里应用nodejs 3.Database ---这里 ...
- 项目:Vue+node+后台管理项目小结
序:本文主要分两块说:项目机制,具体用到的知识块. 1. 项目机制 项目的原型以vue-cli为原型,进行项目的初步构建.项目以node.js服务和webpack打包机制为依托,将.vue文件打包为浏 ...
- docloud后台管理项目(前端篇)
以下内容与主题无关,如果不想看可以直接忽视 !--忽视开始--! 给大家推荐一款强大的编辑器,那就是集响应快.体验好.逼格高.功能丰富为一体的sublime text 3.它除了以上特点,还有一个最重 ...
- 基于 Ant Desigin 的后台管理项目打包优化实践
背景 按照 Ant Design 官网用 React 脚手构建的后台项目,刚接手项目的时候大概30条路由左右,我的用的机子是 Mac 8G 内存,打包完成需要耗时2分钟左右,决定优化一下. 项目技术栈 ...
- vue后台管理项目中菜单栏切换的三种方法
第一种方法:vue嵌套路由(二) <el-menu :default-active="defaultActive" style="min-height: 100%; ...
随机推荐
- 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)
本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...
- 京东云开发者|mysql基于binlake同步ES积压解决方案
1 背景与目标 1.1 背景 国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与My ...
- Asp.Net Core6.0中MediatR的应用CQRS
1.前言 对于简单的系统而言模型与数据可以进行直接的映射,比如说三层模型就足够支撑项目的需求了.对于这种简单的系统我们过度设计说白了无异于增加成本,因为对于一般的CRUD来说我们不用特别区分查询和增删 ...
- Go语言核心36讲48
你真的很棒,已经跟着我一起从最开始初识Go语言,一步一步地走到了这里. 在这之前的几十篇文章中,我向你一点一点地介绍了很多Go语言的核心知识,以及一些最最基础的标准库代码包.我想,你已经完全有能力独立 ...
- 【云原生 · Kubernetes】runtime组件
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying runtime组件 8.1 部署cri-o组件 8.2 下载二进制文件 8.3 修改配置文件 ...
- uniapp 微信小程序 配置分享朋友和朋友圈
uniapp 微信小程序 配置分享朋友和朋友圈 首先在小程序中配置微信分享,和微信朋友圈, onShareAppMessage, onShareTimeline 这两个API 和 onLoad 同级目 ...
- Jmeter中用户定义的变量跟用户参数的区别
用户定义的变量: 全局变量,可以跨线程组被调用,但是,在启动运行时,获取一次值,在运行过程中,不会再动态获取值.用户参数: 局部变量,只能在自己的线程组中被调用,不能直接跨线程组被调用:但是,它在启动 ...
- 直接快速下载NLTK数据
直接快速下载NLTK数据 直接下载NLTK的数据速度很慢,这里提供NLTK数据集,直接下载即可.或者选择下列百度云下载: 链接:https://pan.baidu.com/s/17ZgkoQeMosW ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(36)-掌握Fiddler中Fiddler Script用法,你会有多牛逼-上篇
1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...
- cs231n__5.1/5.2 CNN
CS231n note 5.1 CNN_history now: 略 5.2 CNN 上节课我们谈到了全连接层的概念: 对于全连接层而言,我们要做的就是在这些向量上进行操作. 例如: 但是至于卷积层, ...