【一】概论

(1)简介:

这里说的邮件不是平时说的email邮件(邮件地址带有@符号的),而是指的一般论坛网站的站内信息,也叫私信或者pm(private message私信)

【二】站内信案例

(1)站内信构成:邮件的发送(写邮件)、邮件的接收(收件箱)、邮件的发件箱(发送的邮件列表)

(2)准备工作:

①数据表:sp_email

SQL语句:①后面的comment为注释,方便开发人员分辨;②附件这里数据库设计为只能上传一个附件

create table sp_email(
id int(11) not null auto_increment,
from_id int(11) not null comment'发送者id',
to_id int(11) not null comment'接收者id',
title varchar(50) not null comment'标题',
file varchar(255) default null comment'文件', //完整路径
hasfile smallint(1) default '0' comment'是否有附件', //有文件为1,没有文件为0.默认0(没有附件)
filename varchar(255) default null comment'文件原始名',
content text comment'内容',
addtime int(11) default null comment'添加时间', //发送时间
isread smallint(1) default '0' comment'是否已读', //是否已读,回值
primary key(id)
)engine=myisam auto_increment=1 default charset=utf8;

②修改模板文件index.html,创建导航菜单(发邮件、邮件收件箱、已发邮件)

         <li>
<a href="javascript:;" class="emailManage">邮件管理</a>
<ul>
<li><a href="{:U('Email/send')}" class="documentManage">发邮件</a></li>
<li><a href="{:U('Email/sendBox')}" class="documentManage">发件箱</a></li>
<li><a href="{:U('Email/recBox')}" class="documentManage">收件箱</a></li>
</ul>
</li>

③创建控制器EmailController.class.php

<?php
namespace Admin\Controller;
use Think\Controller;
class EmailController extends Controller{
}
?>

(3)邮件发送

分析

控制器:EmailController.class.php

方法:send(二合一,展示模板和数据保存)

模板:send.html

下面分步操作:

第一步:创建send方法,展示模板页面

<?php
namespace Admin\Controller;
use Think\Controller;
class EmailController extends Controller{
//send方法,展示模板+数据保存
public function send(){
$this->display();
}
}
?>

第二步:将send.html模板文件复制到指定目录下Application\Admin\View\Email\send.html,并替换静态资源路径

第三部:改写send方法,查询收件人,在模板中列出收件人列表

//send方法,展示模板+数据保存
public function send(){
//查询收件人信息,除去自己(id与session('id')相等的),因为自己不可以发送给自己
$data = M('user')->field('id,truename')->where('id != '.session('id'))->select();
$this->assign('data',$data);
$this->display();
}

第四步:在模板里展示收件人列表

第五步:检查表单,表单完整代码

<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>发送邮件</legend>
<p>
<label for="to_id">收件人:</label>
<select name="to_id" id="to_id">
<option value="0">请选择收件人</option>
<volist name="data" id="vol">
<option value="{$vol.id}">{$vol.truename}</option>
</volist>
</select>
</p>
<p><label for="title">标题:</label><input type="text" name="title" id="title"></p>
<p><label for="file">附件:</label><input type="file" name="file" id="file"></p>
<p><label for="author">内容:</label><textarea name="content"></textarea></p>
<div>
<a href="javascript:;" id="submitBtn">提交</a>
<a href="javascript:;" id="resetBtn">清空</a>
</div>
</fieldset>
</form>

第六步:将提交数据保存到数据表

先判断请求类型,若为POST请求,则处理数据,否则展示数据和模板页面。先将大概结构写出来

public function send(){
//判断请求类型
if (IS_POST) {
//接收数据
$post = I('post.');
//实例化自定义模型
$model = D('Email');
//调用具体类的方法实现数据的保存
$result = $model -> addData($post,$_FILES('file'));
if($result){
$this->success('邮件发送成功',U('sendBox'),3);
}else{
$this->error('邮件发送失败');
} }else{
//查询收件人信息,除去自己(id与session('id')相等的)
$data = M('user')->field('id,truename')->where('id != '.session('id'))->select();
$this->assign('data',$data);
$this->display();
}
}

第七步:创建自定义模型EmailModel.class.php,添加保存方法addData。先列出自定义模型的方法架构

<?php
namespace Admin\Model;
use Think\Model;
class EmailModel extends Model{
public function addData($post,$file){
}
}
?>

第八步:编写需要的addData方法实现数据处理和保存入库(文件处理+数据处理)

//文件分为文件+字符
if(!$file['error']){//判断是否有文件上传
//1. 配置数组,定义配置
$cfg = array(
//配置上传路径
'rootPath' => WORKING_PATH . UPLOAD_ROOT_PATH
);
//2. 实例化上传类
$upload = new \Think\Upload($cfg);
//3. 上传操作,并接受上传结果
$info = $upload->uploadOne($file);
dump($info);die;
}else{ }

先判断上传是否成功,上传成功的话会输出有9个元素的一维数组

接下来判断是否上传成功,若成功则继续处理补全字段。完整代码

<?php
namespace Admin\Model;
use Think\Model;
class EmailModel extends Model{
public function addData($post,$file){
//文件分为文件+字符
if(!$file['error']){//判断是否有文件上传
//1. 配置数组,定义配置
$cfg = array(
//配置上传路径
'rootPath' => WORKING_PATH . UPLOAD_ROOT_PATH
);
//2. 实例化上传类
$upload = new \Think\Upload($cfg);
//3. 上传操作,并接受上传结果
$info = $upload->uploadOne($file);
if ($info) {//成功后补全字段
//处理数据表中需要的字段file、hasfile、filename
$post['file'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];//文件在磁盘上的存储路径
$post['hasfile'] = 1;//表示是否有文件,能走进来说明肯定有文件,所以为1
$post['filename'] = $info['name'];//文件的原始名称
}else{}
// 补全字段from_id和addtime
$post['from_id'] = session('id');//发件人id
$post['addtime'] = time();//发送时间
//数据保存
return $this->add($post);
}else{ }
}
}
?>

效果图:

数据成功保存到数据表

(4)发件箱

分析:

控制器:EmailController.class.php

方法:sendBox

模板:sendBox.html

下面分步进行

第一步:创建方法sendBox,获取列表数据展示数据和模板文件

注意:发件箱里需要显示出收件人的名字(数据表里存的是from_id收件人的id,所以需要联表查询数据)

主表:sp_email(别名t1) ;从表:sp_user(别名t2)

联表条件:t1.to_id = t2.id

原生SQL:(两个方法table和join,table相当于join的inner内联,这里用table)

注意:table方法后跟两个表名,join方法后跟一个表名(左联)

select t1.*,t2.truename as truename from sp_email as t1 left join sp_user as t2 on t1.to_id=t2.id where t1.from_id=当前用户id;

将上述SQL代码复制到Navicate中执行结果

接下来参考上述代码到ThinkPHP里去执行连贯操作,然后输出打印下查询结果

浏览器测试后,显示出查询数据。接着将数据传递给模板,代码

//sendBox方法,发件箱
public function sendBox(){
//联表查询当前用户已经发送的邮件
$data = M('Email')->field('t1.*,t2.truename as truename')->alias('t1')->join('left join sp_user as t2 on t1.to_id=t2.id')->
where('t1.from_id = '.session('id'))->select();
$this->assign('data',$data);
$this->display();
}

第二步:复制模板文件sendBox.html到指定位置,并换掉静态资源路径

<table border="1" cellspacing="0" cellpadding="10">
<thead>
<tr><td>序号</td><td>收件人</td><td>标题</td><td>附件</td><td>内容</td><td>发送时间</td><td>状态</td><td>操作</td></tr>
</thead>
<volist name="data" id="vol">
<tr>
<td>{$vol.id}</td>
<td>{$vol.truename}</td>
<td>{$vol.title|msubstr=###,0,10}</td>
<td>{$vol.filename|msubstr=###,0,16}
<notempty name="vol.filename"><a href="__CONTROLLER__/download/id/{$vol.id}">【下载】</a></notempty>
</td>
<td>{$vol.content|msubstr=###,0,10}</td>
<td>{$vol.addtime|date='Y-m-d H:i:s',###}</td>
<td>
<if condition="$vol.isread == 0"><span style="color:red">未读</span><else/><span style="color:green">已读</span></if>
</td>
<td>
<a href="javascript:;" class="showBtn" data="{$vol.id}"" data-title="{$vol.title}">查看</a> |
<a href="__CONTROLLER__/edit/id/{$vol.id}" class="editBtn">删除</a>
</td>
</tr>
</volist>
</table>

显示效果:

注意:

1. 为了区别读取状态,这里我需要加判断。如果isread为0则表示未读,否则表示已读;

          2. 为了测试效果,我去Navicate里将isread手动修改为1,然后刷新浏览器测试(为了直观,可以在模板里加上颜色)

第三步:添加附件下载功能

//download下载附件
public function download(){
//接收id
$id = I('get.id');
//查询数据
$data = M('Email') -> find($id);
//下载代码,主要需要的是路径,接下来拼接路径
$file = WORKING_PATH . $data['file'];
//输出文件
header("Content-type: application/octet-stream");//文件流,告诉浏览器输出的东西是文件流
header('Content-Disposition: attachment; filename="' . basename($file) . '"');//文件名
header("Content-Length: ". filesize($file));//文件大小
//输出缓冲区
readfile($file);
}

最新文章

  1. [转]PhpStorm 超强语言模板的支持
  2. 删除txt文件每行第一(n)个空格前内容的方法
  3. system_call中断处理过程
  4. Android-----工程文件目录介绍
  5. Fliwer:监控植物状态 实现远程浇水
  6. maven总结4
  7. sed的实际用法举例
  8. spring boot了解
  9. 06_Elasticsearch 批量获取mget
  10. 2014第6周五JS调试
  11. ClusterWare 服务介绍
  12. hdu1054(最小顶点覆盖)
  13. Net Kafka
  14. Javascript高级编程学习笔记(57)—— 事件(1)事件流
  15. SHELL希尔排序
  16. linux 环境统配
  17. Flutter 相机定制
  18. Python实现Json结构对比的小工具兼谈编程求解问题
  19. PHP使用Sublime Text3技巧
  20. CentOS禁用笔记本touchpad

热门文章

  1. 基于Canvas的Char.js库使用
  2. javascript下的json 序列化及反序列化
  3. c#实现播放器的集中方式
  4. jvm实例的个数
  5. 查看jvm常用命令
  6. override (C# Reference)
  7. 使用Java实现图像分割
  8. JavaScript代码优化新工具UglifyJS
  9. PCB 漏加阻抗条的臆想(转)
  10. vbnet 进程监控,监控Acad开启的数量,并且添加到开机启动