php源码建博客5--建库建表-配置文件-错误日志
主要:
- 整理框架
- 建库建表
- 配置文件类
- 错误日志记录
--------------本篇后文件结构:--------------------------------------
blog
├─App
│ ├─Model 模型目录
│ ├─View 视图目录
│ │ ├─Admin后台目录
│ │ └─Home前台目录
│ ├─Common 配置目录
│ │ └─config.php 配置文件
│ ├─Log 日志目录
│ │ └─log.txt 日志文件
│ ├─Controller 控制器
│ │ ├─Admin后台
│ │ │ └─DemoController.class.php 测试控制器
│ │ └─Home前台
├─Public 静态公共文件(js,css,images)
│ ├─Plugins 插件
│ ├─Back后台
│ └─Home前台
├─Frame 公共使用的类
│ ├─BaseModel.class.php 数据库连接类
│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│ ├─FactoryModel.class.php 模型工厂类
│ ├─Log.class.php 日志厂类
│ ├─Config.class.php 配置文件读取类
│ ├─Init.class.php 初始化应用类
│ └─MySQLDB.class.php 数据库操作工具类
└─index.php 入口文件
-----------------------------------------------------------------------------------------------------
利用上篇中搭建好的mvc框架结构,正式开始开发博客项目。首先建立数据表,然后开始搭建后台,数据前台展示,完成博客主要模块展示。
下载查看该项目源码: https://gitee.com/NewbiesYang/young_blog
整理框架
清理测试页面
1)前面构建框架结构,使用了用户登录测试页面以及后台首页页面。在此全部去掉,从新开始构建前台和后台页面。类似于我们下载了一个ThinkPHP或Laravel或其他的框架。 现在开始在这个微型框架上来构建我们的项目
2) 实际开发,会用前端人员做好的静态页面来进行开发。所以也可以在 【模板之家】或其他网站 下载 后台模板和前台博客静态页面。然后专注于后端开发,可以加快速度。本项目供学习研究使用,也就不那么着急了。
原本是准备全部利用别人写好的前端页面(包括前端显示和后台页面),专注于后端逻辑的开发。而且已经把分类页面列表都做好了。还提交传送了。 此刻,仔细想想,要是这样玩,那我直接用框架更好了。既然做后端开发,自己写个后端页面+程序处理,没什么问题吧..., 置于前端显示页面,那再用前辈写的前端页面倒是可以的 于是乎,卷起柚子,说干就干,先来整理框架,开始搭建博客。。。。。
说一说
框架结构:
--------------清理后MVC框架文件结构:--------------------------------------
blog
├─App
│ ├─Model 模型目录
│ ├─View 视图目录
│ │ ├─Back后台
│ │ └─Home前台
│ ├─Controller 控制器目录
│ │ ├─Back后台
│ │ └─Home前台
├─Public 静态公共文件(js,css,images)
│ ├─Plugins 插件
│ ├─Back后台
│ └─Home前台
├─Frame 公共使用的类
│ ├─BaseModel.class.php 数据库连接类
│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│ ├─FactoryModel.class.php 模型工厂类
│ ├─Init.class.php 初始化应用类
│ └─MySQLDB.class.php 数据库操作工具类
└─index.php 入口文件
-----------------------------------------------------------------
后续的开发只需要复制该目录结构文件, 就可以在此基础上进行开发了。
提交传送代码
git add -A
git commit -m "清理MVC结构"
git push origin master
插件准备
1) layui插件: 搭建后台程序,准备使用layui前端框架,这个框架个人认为做后台界面还是不错的。它还包含一些比较使用模块。
用bootstrap也可以,我更加倾向于用它来做前台页面。
下载网址: http://www.layui.com/
2) jQuery库: 更方便操作DOM, 尤其是经常使用ajax请求。
3) 其他插件: 如Ueditor编辑器等 需要使用时再下载吧。一般插件都会有demo示例, 按照示例和手册,懂web开发基本能使用。
上述插件暂时不熟悉没有关系,官网上有手册,需要什么模块,便查手册便使用,就像搭积木,如果要做得更好,当然要花更多的时间多练习。我本着后台给程序管理员使用,也不一定要非常漂亮,实用就好。
建库建表
准备: 创建分支
$ git checkout master
$ git checkout -b "start-admin-module"
建表思路:
根据博客模板,从首页开始分析, 分析哪些需要动态数据,以便建立对应数据表。
用户: 登录, 注册, 修改, 删除
文章: 分类管理, 博文管理, 评论管理
角色管理: 管理员,普通用户
菜单管理: 不同权限人员,对应菜单栏也有区别
建表工具可以任意选择。初期手工写建表语句,熟悉后直接使用工具。 本项目中使用 Navicat 建立数据库和表
数据库,表
1) 创建数据库:php_blog
create database php_blog charset utf8
2) 用户表: y_users
CREATE TABLE `y_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户主键',
`username` varchar(20) NOT NULL COMMENT '用户名',
`password` char(32) NOT NULL COMMENT '密码',
`email` varchar(50) NOT NULL DEFAULT '' COMMENT '注册邮箱',
`token_email` varchar(32) NOT NULL DEFAULT '' COMMENT '邮箱验证',
`status` tinyint(1) unsigned NOT NULL DEFAULT '' COMMENT '状态, 0-正常,1-禁用',
`gid` tinyint(1) unsigned NOT NULL DEFAULT '' COMMENT '角色id,1-管理员,2-普通用户,0-无效',
`login_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后登录的ip地址',
`login_times` smallint(6) unsigned NOT NULL DEFAULT '' COMMENT '登录次数',
`created_at` int(10) unsigned NOT NULL DEFAULT '' COMMENT '注册时间',
`updated_at` int(10) unsigned NOT NULL DEFAULT '' COMMENT '最后一次登录时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='用户表';
用户表SQL
3)角色表: y_user_group
CREATE TABLE `y_user_group` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色id',
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称',
`auths` varchar(255) NOT NULL DEFAULT '' COMMENT '角色权限',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
角色表SQL
4) 菜单表: y_menus
CREATE TABLE `y_menus` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜单id',
`title` varchar(20) DEFAULT '' COMMENT '菜单名称',
`controller` varchar(30) DEFAULT '' COMMENT '控制器名称',
`action` varchar(30) DEFAULT '' COMMENT '操作名称',
`status` tinyint(1) unsigned DEFAULT '' COMMENT '状态,1-正常,0-禁用',
`is_hidden` tinyint(1) unsigned DEFAULT '' COMMENT '是否隐藏,0-正常显示,1-隐藏',
`sort` int(10) unsigned DEFAULT '' COMMENT '排序',
`pid` int(10) unsigned DEFAULT '' COMMENT '上一级菜单',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';
菜单表SQL
5) 文章表 y_article
CREATE TABLE `y_article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id',
`title` varchar(60) NOT NULL DEFAULT '' COMMENT '标题',
`description` varchar(200) NOT NULL DEFAULT '' COMMENT '文章简介',
`content` text NOT NULL COMMENT '内容',
`cid` int(10) unsigned NOT NULL COMMENT '文章类别',
`pic` varchar(150) NOT NULL DEFAULT '' COMMENT '文章封面图',
`pic_watermark` varchar(150) NOT NULL DEFAULT '' COMMENT '水印图',
`pic_thumb` varchar(150) NOT NULL DEFAULT '' COMMENT '缩略图',
`uid` int(10) unsigned NOT NULL COMMENT '作者',
`clicks` int(10) unsigned NOT NULL DEFAULT '' COMMENT '阅读数(点击数)',
`updated_at` int(10) unsigned NOT NULL DEFAULT '' COMMENT '更新时间',
`created_at` int(11) NOT NULL DEFAULT '' COMMENT '发布时间',
PRIMARY KEY (`id`),
KEY `title` (`title`),
KEY `uid` (`uid`),
KEY `clicks` (`clicks`),
KEY `cid` (`cid`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='文章表';
文章表SQL
6) 文章类别表 y_category
CREATE TABLE `y_category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类id',
`catename` varchar(15) NOT NULL COMMENT '分类名',
`description` varchar(255) NOT NULL DEFAULT '' COMMENT '简介',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='文章类别表';
文章类别表SQL
7) 评论(回复)表 y_comment
CREATE TABLE `y_comment` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '评论id',
`uid` int(10) unsigned NOT NULL COMMENT '评论者',
`created_at` int(11) DEFAULT NULL COMMENT '评论时间',
`content` varchar(255) NOT NULL DEFAULT '' COMMENT '评论内容',
`aid` int(10) unsigned NOT NULL COMMENT '被评论的文章',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='评论(回复)表';
评论(回复)表SQL
8) session数据表 y_session (其实可以不用这个,目的是为了操作 "将session写入数据库" )
CREATE TABLE `y_session` (
`sess_id` varchar(50) NOT NULL DEFAULT '' COMMENT 'session id',
`data` text NOT NULL COMMENT 'session数据',
`created_at` int(11) NOT NULL COMMENT 'session创建时间',
PRIMARY KEY (`sess_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='session数据表';
session数据表SQL
为了避免弄的太复杂, 暂时建立这些数据表,字段后续可以进行调整。如果需要加入模块功能,可以相应增加相应数据表。
连接数据库
在badeModel中修改数据连接的数组信息 【Frame/BaseModel.class.php】 (如果使用配置文件类,此处就可以省略了)
class BaseModel {
。。。
。。。
。。。
function __construct(array $config=null)
{
$conf = array(
'host'=>'localhost',
'user'=>'root',
'pwd'=>'root',
'port'=>'3306',
'charset'=>'utf8',
'dbname'=>'php_blog',
);
$conf = empty($config)? $conf : array_merge($conf,$config);
$this->db = Db::getDb($conf);
}
}
设置连接数据库信息
配置文件类
需求分析:
为了框架便于数据库连接以及方便读取配置文件。如 希望在 App/Common/config.php 做一些配置项,要求能读取这些配置并应用到项目
思路:
step 1: 创建文件 App/Common/config.php 并将数据库连接信息写入该配置文件 step 2: 在Frame/目录下创建读取配置文件类 Config.class.php step 3: 设置自动加载 读取配置类 step 4: 基础模型类实例化 读取配置类。 操作数据库必须要经过基础模型类 step 5: 调整数据库工具类获取配置信息,既 其构造方法中通过传递进来的数据配置信息对象获取 step 6: 测试连接数据结果,验证获取配置
实现连接数据库-读取数据库配置信息思路
代码实现
1) 创建配置文件config.php 【App/Common/Config.php】
<?php
/**
* 配置文件
* User: young
*/
return [
//数据库连接配置
'host'=>'localhost',
'user'=>'root',
'pwd'=>'root',
'port'=>'3306',
'charset'=>'utf8',
'dbname'=>'php_blog',
];
配置文件-数据库配置信息
2) 创建读取配置文件类 【Frame/Config.class.php】
<?php
/**
* 配置文件读取类
* User: young
*/ class Config
{
protected static $ins = null; //本类实例
protected $cfg = array(); //存储配置项 /**
* 获取本类实例
* @access public
* @return object 本类的单例对象
*/
public static function getIns() {
if(false === (self::$ins instanceof self)){
self::$ins = new self();
}
return self::$ins;
} /**
* 构造方法: 读取配置项
* @access public
* @return void
*/
final protected function __construct() {
require APP.'Common'.DS.'config.php'; //读取配置项
$this->cfg = $cfg;
} /**
* 根据指定的配置项,返回该配置项的值
* @param string $k 配置项
* @return mixed|null 返回配置项的数据
*/
public function __get($k) {
if(!isset($this->cfg[$k])) {
return null;
}
return $this->cfg[$k];
} /**
* 根据指定的配置项,返回配置项的值
* @param string $k 配置项名称
* @param string $v 配置项对应的值
*/
public function __set($k,$v) {
$this->cfg[$k] = $v;
}
}
3) 自动加载配置类
需要自动加载该类, 该类在Frame目录下, 所以可以写入到 Init.class.php 类中的属性数组中 【Frame/Init.class.php】
<?php
/**
* 初始化应用类
* User: young
*/ class Init
{
protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config');
。。。
。。。
。。。
自动加载配置类
4)基础模型类实例化配置类【Frame/BaseModel.class.php】
<?php /**
* BaseModel.class.php 基础模型类
* 连接数据库
* @author young
*/
class BaseModel
{
protected $db = null;
/**
* 构造方法: 实例化数据库类
* @access public
*/
function __construct()
{
$conf = Config::getIns(); //读取配置项实例
$this->db = Db::getDb($conf);
}
}
5)数据库读取配置项信息 【Frame/Db.class.php】
<?php
/**
* Db.class.php 数据库操作工具类
* @author young
*/ class Db {
。。。
。。。
。。。
/**
* 构造方法: 保存数据库连接信息,连接数据库
* @access private
* @param array $conf 数据库连接信息
*/
private function __construct($conf)
{
$this->host = $conf->host;
$this->user = $conf->user;
$this->pwd = $conf->pwd;
$this->port = $conf->port;
$this->charset = $conf->charset;
$this->dbname = $conf->dbname;
$this->connect();
}
。。。
。。。
。。。
}
数据库工具类获取配置信息
6) 测试 在App/Controller/Home/DemoController.class.php 用于测试数据库连接情况
<?php
/**
* 测试控制器类
* User: young
*/ class DemoController extends BaseController
{
public function test()
{
$db = new BaseModel();
$data = $db->db->getAllRows("select * from y_user");
var_dump($data);
}
}
测试控制器类测试连接数据库
注: 前提,需要将BaseModel.class.php中的$db属性先临时修改为public公开,才能测试成功 (原因:在Demo控制器中实例化的基础模型类,数据库操作实例是放在类的属性db中,外部不能访问protected属性), 本节所有测试,可以临时将db设置为公开的。
还可以使用配置如: 上传目录,网站配置信息等,根据需求自定义配置需求,再通过读取配置类读取配置的数据
提交代码
git add -A
git commit -m "完成读取配置文件类"
错误日志记录
除了开发阶段调试错误, 项目上线一般会将错误信息写入指定文件中。安全性更好。
需求分析:
将错误写入日志文件中,这里暂时主要记录数据库操作的错误。 如:默认将错误记录在App/log/logError.txt。 如果在配置文件中进行了配置,则将日志信息写入到配置项log指定的目录中
思路:
step 1: 制作日志类Frame/Log.class.php, 用于将错误信息写入到指定文件中。 (设置日志文件位置,正好可以利用上面写的配置项,通过读取配置来实现) step 2: 在基础模型类BaseModel中,读取配置项后, 可以将日志目录路径写入常量。 使用try..catch 捕捉异常,将错误写入日志 step 3: 实现日志类自动加载。Log类在Frame目录中,所以只要在初始化应用类Init中的属性$frame数组中加入 “Log” step 4: 记录错误。 数据库连接可能失败, sql语句可能执行失败 step 5: 测试错误日志记录功
实现错误日志记录过程思路
代码实现
1) 制作错误日志类 【Frame/Log.class.php】
<?php
/**
* 日志类
* User: young
*/ class Log
{
/**
* 记录错误信息到文件中
* @param string $err 错误信息
*/
public static function write($err)
{
date_default_timezone_set('PRC'); //时区设置
//打开文件
$fh = fopen(LOG.'log.txt','a'); // 追加方式打开 //拼接信息
$err = date('Y年m月d日 H:i:s',time()) . "\t\r\n" . $err . "\t\r\n"; //写入
fwrite($fh,$err); //关闭
fclose($fh);
}
}
2) 读取日志位置,捕捉错误 【Frame/BaseModel.class.php】
发生错误记录后,这里只是简单使用exit(..)退出, 可以自定error错误页面会更好
<?php /**
* BaseModel.class.php 基础模型类
* 连接数据库,捕捉记录错误
* @author young
*/
class BaseModel
{
Public $db = null;
/**
* 构造方法: 实例化数据库类
* @access public
*/
function __construct()
{
$conf = Config::getIns(); //读取配置项实例 //读取日志配置项目 并写成常量
$logPath = $conf->log;
$logPath = !isset($logPath) ? APP."log".DS : $logPath;
define('LOG',$logPath); //监控数据库操作
try {
$this->db = Db::getDb($conf);
}catch(Exception $e) {
$err = '';
$err .= '错误代码:' . $e->getCode() . "\r\n";
$err .= '错误信息:' . $e->getMessage() . "\r\n";
$err .= '文件:' . $e->getFile() . "\r\n";
$err .= '行号:' . $e->getLine() . "\r\n\r\n";
Log::write($err);
exit("<h2>客官!页面暂时无法响应,请稍后访问</h2>");
}
}
}
点击查看【基础模型类中监测并记录错误】
3)自动加载日志记录类 【Frame/Init.class.php】
<?php
/**
* 初始化应用类
* User: young
*/ class Init
{
protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config','Log');
。。。
。。。
。。。
点击查看【自动加载日志类】
4) 记录错误 【Frame/Db.class.php】
数据库连接可能发生错误处理
class Db
{
。。。
。。。
。。。
/**
* 连接数据库,设置编码,选库
* @access private
*/
private function connect()
{
$this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") ;
if(!$this -> link) {
$error = new Exception("数据库连接不上",10000);
throw $error;
}
$this->setCharset($this->charset);
$this->useDb($this->dbname);
}
。。。
。。。
。。。
点击查看【数据库连接错误抛出】
sql语句发生错误处理
class Db
{
。。。
。。。
。。。
/**
* 执行sql语句
* @param string $sql sql语句
* @return mixed
*/
private function query($sql)
{
$result = mysql_query($sql, $this->link);
// if(false === $result) {
// echo "<p>sql执行失败!<br>";
// echo "<br>失败语句:".$sql;
// echo "<br>错误代号".mysql_errno();
// echo "<br>错误提示: ".mysql_error()."</p>";
// exit();
// }
if(false === $result) {
$err = "sql执行失败!\r\n失败语句:".$sql."\r\n错误代号:".mysql_errno()."\r\n错误提示:".mysql_error()."\r\n\r\n";
Log::write($err);
exit("<h2>查询出错,请稍后访问</h2>");
}
return $result;
}
。。。
。。。
。。。
点击查看【执行SQL错误处理】
测试
可以在【App/Common/config.php】中配置日志文件目录。 如果不进行配置, 默认记录在App/log/目录中
<?php
/**
* 配置文件
* User: young
*/
return [
//数据库连接配置
。。。
、 。。。
。。。 //日志文件位置配置
'log' => APP,
];
点击查看【日志文件配置】
以下测试可以 开启配置项中的配置log 和关闭后分别测试。 注意: 如果没有做配置log, 则要首先在App目录下建立一个log目录
1. 在配置文件中故意写错数据库连接信息,如密码写错
2. 执行sql错误
最后说明: 配置目录,日志目录都是不希望浏览器直接访问的,所以需要将.htaccess文件放入目录中 (由于App目录中已经存在,故也可以省略)
提交传送代码
git add -A
git commit -m "完成日志类"
git checkout master
git merge start-admin-module
git push origin master
小结: 本篇主要实现了 框架清理,博客数据库表搭建,创建配置读取类,日志记录类。
实际上,到此仍然只是更加完善了一下框架结构,增加了2个功能。正如前篇所提,还有很多是可以改进的。这里就暂时不再继续增加功能了。
提出问题:
1. 如何使用该自制框架搭建项目 ==> 用户操作+mvc实现
2. 如何着手使用ajax实现后台登录功能 ==> ajax应用
3. 如何着手实现分类模块功能,它有哪些操作 ==> 增删改查
下一步: 后台模板视图制作,后台登录,文章分类模块功能。
php源码建博客5--建库建表-配置文件-错误日志的更多相关文章
- spark 源码阅读博客
http://blog.csdn.net/oopsoom/article/details/38257749
- php源码建博客4--实现MVC结构微型框架
主要: 常量优化路径 自动加载类 优化入口文件 安全访问项目目录 --------------文件结构:-------------------------------------- blog├─App ...
- 00-django | 01-构建博客目录
00-django | 01-构建博客目录 python Django 创建blog 进入到 manage.py 文件所在的目录(即项目根目录)下,运行 pipenv run python manag ...
- 用hugo建博客的记录 · 老张不服老
前后累计折腾近6个小时,总算把搭建hugo静态博客的整个过程搞清楚了.为什么用了这么久?主要还是想偷懒,不喜欢读英文说明.那就用中文记录一下过程吧.还是中文顺眼啊. 某日发现自己有展示些东西给外网的需 ...
- 比特币源码分析--C++11和boost库的应用
比特币源码分析--C++11和boost库的应用 我们先停下探索比特币源码的步伐,来分析一下C++11和boost库在比特币源码中的应用.比特币是一个纯C++编写的项目,用到了C++11和bo ...
- php源码建博客3--区分平台的MVC结构
主要: 模型单例工厂 目录结构优化 区分平台(前台,后台....) --------------文件结构:-------------------------------------- blog├─Ap ...
- php源码建博客2--实现单入口MVC结构
主要: MVC目录结构 数据库工具类制作 创建公共模型类和公共控制器类 --------------文件结构:-------------------------------------- blog├─ ...
- php源码建博客1--搭建站点-实现登录页面
主要: 站点搭建 实现登录页面 分析及改进 站点搭建 1) 在apache安装目录下: [conf\extra\httpd-vhosts.conf]加入站点配置 <VirtualHost *: ...
- github pages+hexo自建博客
1.github创建新项目,然后开启pages即可 2.全局安装hexo npm install -g hexo 3.初始化hexo hexo init 4.安装hexo的依赖 npm i 5.基本上 ...
随机推荐
- 推卡:“积分侠”的福利 广发DIY信用卡
广发diy信用卡最大的优势在持卡人在三大类商户刷卡消费可享受3倍积分优惠,很多卡友不知道这些商户到底有哪些,以及商户mcc码是什么,下面和小编一起来看看. 可享受3倍积分的商户类型 持卡人可在以下三大 ...
- SQL Server ->> SQL Server 2016重要功能改进之 -- INSERT SELECT时并发插入数据
SQL Server 2016对INSERT INTO XXXX SELECT语句进行了优化,在某些情况下可以触发数据的并行插入,但是要求兼容模式是130(SQL Server 2016)以及在插入的 ...
- linux shell每天一阅 -- 安装nginx以及apache
当然这个博客原代码是转载大神的... 自动安装Nginx脚本,采用case方式,选择方式,也可以根据实际需求改成自己想要的脚本mynginx.sh #!/bin/sh ###nginx install ...
- 用jquery实现的简单数据双向绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP5.5的新特性
看了@轩脉刃 今天出炉的PHP 5.5 新特性.不过没有翻译全,我这里稍微补充下,整理成完整的一篇:) 原文:http://www.php.net/manual/zh/migration55.new- ...
- 如何使用Excel选择整列排序
在excel中,排序的时候弹窗提示“若要执行此操作,所有合并单元格需大小相同”,该怎么操作才能实现排序呢?接下来,小编就和大家分享具体操作. 工具/原料 excel 方法/步骤 打开出 ...
- 关于HiddenHttpMethodFilter
这个类的代码比较少,所以把整个类的代码都复制过来.在注释中添加上自己的理解. public class HiddenHttpMethodFilter extends OncePerRequestFil ...
- [BJOI2018]治疗之雨
题目 我还没疯 发现如果我们将血量抽象成点,一轮操作抽象成图上的一条边,我们如果能求出每一条边的概率,我们就能搞一下这道题 假设我们求出了这个图\(E\),设\(dp_i\)表示从\(i\)点到达\( ...
- Web网站高并发量的解决方案
摘要: 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相 ...
- 剑指offer13 在O(1)时间删除链表的结点
把下一个节点的值直接赋值给要删除的节点,然后删除下一个节点.当这样做会有两个bad case:被删除的链表结点的下一个结点为空指针,如果链表只有一个结点.其实链表只有一个结点应该属于下一个结点为空指针 ...