course/app/api/controller/StudentController.php
2024-07-25 22:45:25 +08:00

211 lines
9.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\controller;
use app\BaseController;
use app\common\model\StudentSchedule;
use app\common\service\StudentService;
use app\constant\ResponseCode;
use support\Request;
class StudentController extends BaseController
{
protected $noNeedLogin = ['login', 'getCode'];
/**
* @desc 登录
* @param Request $request
* @return \support\Response
*/
public function login(Request $request)
{
$service = new StudentService();
$res = $service->login($request->post());
return $this->json($res);
}
/**
* @desc 获取code
* @param Request $request
* @return \support\Response
*/
public function getCode(Request $request)
{
$appid = getenv('APP_ID');
$redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/h5#/pages/login/login");//重定向地址
// $redirect_uri = getenv('SERVER_DOMAIN') . "/h5#/pages/index/index";//重定向地址
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect";
// $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
return $this->json([
'code' => ResponseCode::SUCCESS,
'data' => $url
]);
// return redirect($url);
}
/**
* @desc 学生信息
* @param Request $request
* @return \support\Response
*/
public function userInfo(Request $request)
{
$service = new StudentService();
$res = $service->userInfo($request);
return $this->json($res);
}
/**
* @desc 更新学生openid
* @param Request $request
* @return \support\Response
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function updateOpenid(Request $request)
{
$service = new StudentService();
$res = $service->updateOpenid($request);
return $this->json($res);
}
/**
* @desc 学生课表
* @param Request $request
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function downloadSchedule(Request $request)
{
$request_data = $request->post();
$month = date('Y-m', strtotime($request_data['date']));
$student_schedule = StudentSchedule::where(['student_id' => $request->student->id])
->where(['month' => $month])
->with(['teacher', 'subject'])
->order('start_time asc')
->select()->toArray();
$array = [];
$stu_nmae = '';
foreach ($student_schedule as $k => &$v) {
$array[] = [
'week' => $this->getWeek(strtotime($v['date'])),
'date' => $v['date'],
'time_on' => $v['time'],
'subject' => $v['subject_name'],
'teacher_name' => $v['teacher_name'],
'time_num' => $v['hour'] + '/h',
];
$stu_nmae = $v['student_name'];
}
$params = [
'row' => count($student_schedule) + 1,//数据的行数
'file_name' => time() . '.png',
'title' => $stu_nmae,
'table_time' => $month,
'data' => $array,
];
$file_path = '/files/images/student_schedule/' . $month . "/{$request->student->id}/";
$base = [
'border' => 10,//图片外边框
'file_path' => public_path($file_path),//图片保存路径
'title_height' => 30,//报表名称高度
'title_font_size' => 16,//报表名称字体大小
'font_ulr' => public_path('/111.ttf'),//字体文件路径
'text_size' => 12,//正文字体大小
'row_hight' => 30,//每行数据行高
'filed_id_width' => 60,//序号列的宽度
'filed_name_width' => 120,//玩家名称的宽度
'filed_data_width' => 120,//数据列的宽度
'table_header' => ['', '星期', '日期', '上课时间', '学科', '教师', '课时'],//表头文字
'column_text_offset_arr' => [45, 70, 70, 100, 55, 65, 65],//表头文字左偏移量
'row_text_offset_arr' => [50, 110, 90, 110, 90, 90, 90],//数据列文字左偏移量
];
$base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
$base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
$border_top = $base['border'] + $base['title_height'];//表格顶部高度
$border_bottom = $base['img_height'] - $base['border'];//表格底部高度
$base['column_x_arr'] = [
$base['border'] + $base['filed_id_width'],//第一列边框线x轴像素 70/2+10
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素 190
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 2,//第四列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 3,//第五列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
];
// var_dump( $base['column_x_arr']);
$img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
$bg_color = imagecolorallocate($img, 255, 255, 255);//设定图片背景色
$text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
$border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
// $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
imagefill($img, 0, 0, $bg_color);//填充图片背景色
//先填充一个黑色的大块背景
imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
//再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
//画表格纵线 及 写入表头文字
foreach ($base['column_x_arr'] as $key => $x) {
imageline($img, $x, $border_top, $x, $border_bottom, $border_coler);//画纵线
$x = $x - $base['column_text_offset_arr'][$key] + 1;
// echo $x;echo "<br>";
$y = $border_top + $base['row_hight'] - 8;
$text = $base['table_header'][$key];
imagettftext($img, $base['text_size'], 0, $x, $y, $text_coler, $base['font_ulr'], $text);//写入表头文字
}
//画表格横线
foreach ($params['data'] as $key => $item) {
$border_top += $base['row_hight'];
imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
$x = $base['column_x_arr'][0] - $base['row_text_offset_arr'][0];
$y = $border_top + $base['row_hight'] - 10;
$text = $key + 1;
imagettftext($img, $base['text_size'], 0, $x, $y, $text_coler, $base['font_ulr'], $text);//写入序号
$sub = 0;
foreach ($item as $value) {
$sub++;
imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][$sub] - $base['row_text_offset_arr'][$sub], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $value);//写入data数据
}
}
//计算标题写入起始位置
$title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
$title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
$title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
//居中写入标题
imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width) / 2, $base['title_height'], $text_coler, $base['font_ulr'], $params['title']);
//写入制表时间
imagettftext($img, $base['text_size'], 0, $base['border'], $base['title_height'], $text_coler, $base['font_ulr'], '时间:' . $params['table_time']);
$save_path = $base['file_path'] . $params['file_name'];
if (!is_dir($base['file_path']))//判断存储路径是否存在,不存在则创建
{
mkdir($base['file_path'], 0777, true);//可创建多级目录
}
imagepng($img, $save_path);//输出图片输出png使用imagepng方法输出gif使用imagegif方法
$url = getenv('SERVER_DOMAIN') . $file_path . $params['file_name'];
return $this->json([
'code' => ResponseCode::SUCCESS,
'data' => $url
]);
}
public function getWeek($date)
{
$week_array = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
$week = date("w", $date);
return $week_array[$week];
}
}