前几天工作上面突然说手头ERP项目先停一下,写一个PHP项目,项目也非常的简单,但是我第一次使用PHP,在此记录一下。怪不得说PHP是世界第一语言,写一些小的项目非常的舒服,不用重启服务器,即插即用。
项目就是写一个签到+祝福语的一个小程序,主要功能就是微信登录小程序,书写自己的祝福语,前端加上AR和灯笼。点击灯笼时随机展示一个祝福语。就很简单。
首先就是小程序登录,这里运用了之前项目的登录方法,添加了没有注册自动注册,是否签到功能。
/**
* 获取微信小程序用户openid
*/
public function getWxMiniProgramUserOpenid()
{
$code = $this->request->param('code', '');
$params = [
'appid' => 'xxxx',
'secret' => 'xxxxx',
'js_code' => $code,
'grant_type' => 'authorization_code'
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
//查找数据库,获取用户的信息
$user = ModelUser::where('openid', $json['openid'])->find();
//如果数据库中没有信息,说明还没有注册,进行初步注册操作
if (!$user) {
$userInfo = [
'jointime' => time(),
'joinip' => request()->ip(),
'logintime' => time(),
'loginip' => request()->ip(),
'prevtime' => time(),
'status' => 'normal',
'is_sign_in' => '0',
'openid' => $json['openid']
];
try {
$user = ModelUser::create($userInfo, true);
} catch (Exception $e) {
$this->error($e->getMessage());
$this->error('授权登录失败了!');
}
}
}
$ret = $this->auth->direct($user->id);
if ($ret) {
//根据token获取登陆用户信息
$json['user'] = $this->auth->getUserinfo();
//这里是返回用户是否进行签到
$json['is_sign_in'] = $user->is_sign_in;
$this->success('获取成功', $json);
} else {
$this->error('获取失败');
}
}
然后就是签到功能的实现,签到我是放到了一个签到表中进行存储,签到完成再在用户信息表中更改是否签到状态。
/**
* 进行签到
*/
public function signIn()
{
//首先通过token获取用户信息
$user = $this->auth->getUser();
//如果没有信息,说明没有进行登录
if (!$user) {
$this->error(__("请进行登录后签到!"), null, 3);
}
//这里是判断是否到签到时间
$sj = "17:00:00";//设置签到时间
$dtrq = date('Y-m-d ', time()); //当天日期
$jz = strtotime($dtrq . "$sj"); //拼接时间并转换成时间戳
$dq = time(); //当前时间的时间戳
if ($dq <= $jz) { //判断时间戳大小
//如果没有到时间就返回未到时间
return $this->error(_("未到签到时间,请等待!"), null, 5);
}
//获取用户全部信息
$modelUser = ModelUser::where('id', $user->id)->find();
$id = $user->id;
$condition = ['user_id' => $id];
//查询签到表,是否已经进行签到
$data = In::where($condition)->find();
if ($data) {
//这里如果已经签到也返回一个成功结果,但是加上友好提示
$this->success("您已签到,无需重复签到!");
}
//获取签到时间
$date = date('Y-m-d H:i:s');
$data = [
'user_id' => $id,
'user_nickname' => $user->nickname,
'sign_in_time' => $date,
];
$params = array_merge($data);
//进行签到表的添加
Db::startTrans();
try {
In::create($params, true);
Db::commit();
//这里用户表中的是否签到状态也要进行修改
if ($modelUser) {
$modelUser->is_sign_in = '1';
$modelUser->save();
}
} catch (Exception $e) {
echo $e->getMessage();
Db::rollback();
}
$this->success("签到成功!");
}
/**
* @throws DbException
* 查询签到列表
*/
public function list()
{
$page = $this->request->param('page');
$limit = $this->request->param('limit');
$sql = In::where(null);
$list = $sql->page($page)
->order('sign_in_time', 'desc')
->paginate($limit);
$this->success("请求成功", $list);
}
添加祝福语
/**
* 添加
*/
public function addOrUpdate()
{
//获取用户登录信息,没有登陆返回登录页面
$user=$this->auth->getUser();
if(!$user){
$this->error(__('请先登录!'),null,3);
}
//这里表示只有签到完成之后才能进行添加祝福语
$user_id=$user->id;
$term=['user_id' => $user_id];
$sign_in=In::where($term)->find();
if(!$sign_in){
$this->error(__('请先进行签到'),null,4);
}
//获取前端祝福语内容
$msg_content = $this->request->post('msg_content');
$sender_nickname = $user->nickname;
//查询该用户是否已经进行添加,如果添加了就走修改操作
$condition=['sender_id' => $user_id];
$data = Msg::where($condition)->find();
$sender_id=$user->id;
if($data){
//已经添加,进行修改操作
return Msgcon::update($data->id,$msg_content);
}
//进行插入数据库的数据构建
$data = [
'msg_content' => $msg_content,
'sender_id' => $sender_id,
'sender_nickname' => $sender_nickname,
'is_deleted'=>'0'
];
$params = array_merge($data);
//开始添加操作事务
Db::startTrans();
try {
Msg::create($params, true);
Db::commit();
} catch (Exception $e) {
$this->setError($e->getMessage());
Db::rollback();
}
$this->success("请求成功");
}
/**
* 更新
*/
public function update($id,$msg_content)
{
$data=Msg::find($id);
if(!$data){
$this->error("无此消息,请重试!");
}
if($data->is_deleted==1){
$this->error("该信息已删除,无法修改!");
}
if($msg_content){
$data->msg_content=$msg_content;
}
$data->save();
return $this->success("请求成功",$data);
}
随机获取某个祝福语
/**
* 随机展示祝福语
*/
public function showRandom()
{
//进行数据库中数据的统计,由于是统计个数,所以在删除祝福语时不能直接删除,而是要将is_deleted这个字段设置成“1”
$str = Msg::count();
//获取范围内的随机数
$random_number=rand(1,$str);
$data= Msg::find($random_number);
//判断如果是已经删除的或者内容为空的则不进行展示
if($data->is_deleted=="1"||$data->msg_content==''||$data->msg_contene==null){
//再走一次接口
$this->showRandom();
}else{
$id= $data->sender_id;
//展示页面需要用到用户昵称和头像,在这里进行查询
$sender= User::find($id);
$avatar=$sender->avatar;
$result['msg_content']=$data->msg_content;
$result['avatar']=$sender->avatar;
$result['nickname']=$sender->nickname;
return $this->success('请求成功',$result);
}
}
以上就是这个小程序添加的功能,很简单,但是也是我第一次使用PHP,不得不说,PHP挺好用的。
------------------------------------------------分割线------------------------------------------------------------------------
本以为工作结束了,突然要求要一个链接来导出签到用户的昵称、时间和祝福语,那就写吧。照着网上的进行了修改完成了。
//导出数据
public function export()
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
//因为数据不在一个表中,进行了联表查询
$sql = "SELECT user_nickname,sign_in_time,msg_content
FROM `fa_sign_in` LEFT JOIN fa_msg
ON fa_msg.sender_id=fa_sign_in.user_id";
//加载主表的列
$columnList = Db::query($sql);
//修改单元格宽度
$sheet->getColumnDimension('A')->setWidth(15);
$sheet->getColumnDimension('B')->setWidth(20);
$sheet->getColumnDimension('C')->setWidth(25);
// Set the cell content
$sheet->setCellValue('A1', '昵称');
$sheet->setCellValue('B1', '签到时间');
$sheet->setCellValue('C1', '祝福语');
//从第二行开始,第一行是title
$row = 2;
//遍历查询的数组,与上边的title的ABC进行对应
foreach ($columnList as $item) {
$sheet->setCellValue('A' . $row, $item['user_nickname']);
$sheet->setCellValue('B' . $row, $item['sign_in_time']);
$sheet->setCellValue('C' . $row, $item['msg_content']);
$row++;
}
// Create a writer
$writer = new Xlsx($spreadsheet);
// Set the headers for download
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="嘉宾名单.xlsx"');
header('Cache-Control: max-age=0');
// Write the file to the browser for download
$writer->save('php://output');
}
这下应该可以下班喽