工作初识PHP

文章描述了一位开发者初次使用PHP开发微信小程序的过程,包括获取用户openid、微信登录、签到功能实现、祝福语添加以及导出签到用户数据至Excel。作者分享了如何处理用户登录、签到逻辑和数据库操作等细节。
摘要由CSDN通过智能技术生成

        前几天工作上面突然说手头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');
    }

        这下应该可以下班喽

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值