422 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			422 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /**
 | ||
|  *	后台管理系统-首页
 | ||
|  */
 | ||
| namespace app\index\controller;
 | ||
| use app\index\controller\BaseController;
 | ||
| use think\facade\Db;
 | ||
| use think\facade\View;
 | ||
| use think\facade\Env;
 | ||
| use think\facade\Config;
 | ||
| use app\index\model\Banner;
 | ||
| use app\index\model\Resources\ResourcesCategory;
 | ||
| use app\index\model\Articles\ArticlesCategory;
 | ||
| use app\index\model\Resources\Resources;
 | ||
| use app\index\model\Articles\Articles;
 | ||
| use PHPMailer\PHPMailer\PHPMailer;
 | ||
| 
 | ||
| 
 | ||
| class IndexController extends BaseController
 | ||
| {
 | ||
|     /**
 | ||
|      * 首页
 | ||
|      */
 | ||
|     public function index()
 | ||
|     {
 | ||
|         // 获取banner列表
 | ||
|         $bannerList = Banner::where('delete_time', null)
 | ||
|             ->order('sort DESC, id DESC')
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         View::assign('bannerList', $bannerList);
 | ||
|         return View::fetch();
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取站点资讯列表
 | ||
|      */
 | ||
|     public function siteNewslist()
 | ||
|     {
 | ||
|         // 获取站点资讯分类(顶级分类id为1的子分类)
 | ||
|         $categories = ArticlesCategory::where('cid', 1)
 | ||
|             ->where('delete_time', null)
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         $articles = [];
 | ||
|         $categoryData = [];
 | ||
| 
 | ||
|         // 提取分类名称和ID用于前端tab显示
 | ||
|         foreach ($categories as $category) {
 | ||
|             $categoryData[] = [
 | ||
|                 'id' => $category['id'],
 | ||
|                 'name' => $category['name']
 | ||
|             ];
 | ||
| 
 | ||
|             // 获取该分类下的文章,限制4条
 | ||
|             $articles = Articles::where('cate', $category['id'])
 | ||
|                 ->where('delete_time', null)
 | ||
|                 ->where('status', 2)
 | ||
|                 ->order('id', 'desc')
 | ||
|                 ->field('id, cate, title, image, author, publishdate, views')
 | ||
|                 ->limit(4)
 | ||
|                 ->select()
 | ||
|                 ->toArray();
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         return json([
 | ||
|             'code' => 1,
 | ||
|             'msg' => '获取成功',
 | ||
|             'articles' => $articles,
 | ||
|             'categories' => $categoryData
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取技术文章列表
 | ||
|      */
 | ||
|     public function technicalArticleslist()
 | ||
|     {
 | ||
|         // 获取技术文章分类(顶级分类id为3的子分类)
 | ||
|         $categories = ArticlesCategory::where('cid', 3)
 | ||
|             ->where('delete_time', null)
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         // 组装分类数据,方便后续查找
 | ||
|         $categoryData = [];
 | ||
|         $categoryImageMap = [];
 | ||
|         $articlesByCategory = [];
 | ||
| 
 | ||
|         foreach ($categories as $category) {
 | ||
|             $categoryData[] = [
 | ||
|                 'id' => $category['id'],
 | ||
|                 'name' => $category['name']
 | ||
|             ];
 | ||
|             $categoryImageMap[$category['id']] = $category['image'] ?? '';
 | ||
| 
 | ||
|             // 获取每个分类下的文章,限制12条
 | ||
|             $articles = Articles::where('cate', $category['id'])
 | ||
|                 ->where('delete_time', null)
 | ||
|                 ->where('status', 2)
 | ||
|                 ->order('id', 'desc')
 | ||
|                 ->field('id, cate, title, image, author, publishdate, views')
 | ||
|                 ->limit(12)
 | ||
|                 ->select()
 | ||
|                 ->toArray();
 | ||
| 
 | ||
|             // 替换image为空的文章
 | ||
|             foreach ($articles as &$article) {
 | ||
|                 if (empty($article['image']) && !empty($categoryImageMap[$article['cate']])) {
 | ||
|                     $article['image'] = $categoryImageMap[$article['cate']];
 | ||
|                 }
 | ||
|             }
 | ||
|             unset($article);
 | ||
| 
 | ||
|             $articlesByCategory[$category['id']] = $articles;
 | ||
|         }
 | ||
| 
 | ||
|         return json([
 | ||
|             'code' => 1,
 | ||
|             'msg' => '获取成功',
 | ||
|             'articles' => $articlesByCategory,
 | ||
|             'categories' => $categoryData
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取banner列表
 | ||
|      */
 | ||
|     public function bannerlist()
 | ||
|     {
 | ||
|         // 获取启用状态的banner列表,按排序倒序
 | ||
|         $bannerList = Banner::where('delete_time', null)
 | ||
|             ->order('sort DESC, id DESC')
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         return json(['code' => 1, 'msg' => '获取成功', 'banner' => $bannerList]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取资源下载列表
 | ||
|      */
 | ||
|     public function resourcesList()
 | ||
|     {
 | ||
|         // 获取资源分类(顶级分类id为2的子分类)
 | ||
|         $categories = ResourcesCategory::where('cid', 2)
 | ||
|             ->where('delete_time', null)
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         // 组装分类数据
 | ||
|         $categoryData = [];
 | ||
|         $categoryImageMap = [];
 | ||
|         $resourcesByCategory = [];
 | ||
| 
 | ||
|         foreach ($categories as $category) {
 | ||
|             $categoryData[] = [
 | ||
|                 'id' => $category['id'],
 | ||
|                 'name' => $category['name']
 | ||
|             ];
 | ||
|             $categoryImageMap[$category['id']] = $category['image'] ?? '';
 | ||
| 
 | ||
|             // 获取每个分类下的资源,限制8条
 | ||
|             $resources = Resources::where('cate', $category['id'])
 | ||
|                 ->where('delete_time', null)
 | ||
|                 ->where('status', 1)
 | ||
|                 ->order('id', 'desc')
 | ||
|                 ->field('id, cate, title, desc, downloads, create_time, icon, views, uploader')
 | ||
|                 ->limit(8)
 | ||
|                 ->select()
 | ||
|                 ->toArray();
 | ||
| 
 | ||
|             // 替换thumbnail为空的资源
 | ||
|             foreach ($resources as &$resource) {
 | ||
|                 if (empty($resource['thumbnail']) && !empty($categoryImageMap[$resource['cate']])) {
 | ||
|                     $resource['thumbnail'] = $categoryImageMap[$resource['cate']];
 | ||
|                 }
 | ||
|             }
 | ||
|             unset($resource);
 | ||
| 
 | ||
|             $resourcesByCategory[$category['id']] = $resources;
 | ||
|         }
 | ||
| 
 | ||
|         // 合并所有分类的资源
 | ||
|         $allResources = [];
 | ||
|         foreach ($resourcesByCategory as $resources) {
 | ||
|             $allResources = array_merge($allResources, $resources);
 | ||
|         }
 | ||
| 
 | ||
|         // 按上传时间排序
 | ||
|         usort($allResources, function ($a, $b) {
 | ||
|             return $b['create_time'] - $a['create_time'];
 | ||
|         });
 | ||
| 
 | ||
|         // 只取最新的8条
 | ||
|         $allResources = array_slice($allResources, 0, 8);
 | ||
| 
 | ||
|         return json([
 | ||
|             'code' => 1,
 | ||
|             'msg' => '获取成功',
 | ||
|             'resources' => $allResources,
 | ||
|             'categories' => $categoryData
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取程序下载列表
 | ||
|      */
 | ||
|     public function programList()
 | ||
|     {
 | ||
|         // 获取程序分类(顶级分类id为4的子分类)
 | ||
|         $categories = ResourcesCategory::where('cid', 1)
 | ||
|             ->where('delete_time', null)
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         // 组装分类数据
 | ||
|         $categoryData = [];
 | ||
|         $categoryImageMap = [];
 | ||
|         $programsByCategory = [];
 | ||
| 
 | ||
|         foreach ($categories as $category) {
 | ||
|             $categoryData[] = [
 | ||
|                 'id' => $category['id'],
 | ||
|                 'name' => $category['name']
 | ||
|             ];
 | ||
|             $categoryImageMap[$category['id']] = $category['image'] ?? '';
 | ||
| 
 | ||
|             // 获取每个分类下的程序,限制8条
 | ||
|             $programs = Resources::where('cate', $category['id'])
 | ||
|                 ->where('delete_time', null)
 | ||
|                 ->where('status', 1)
 | ||
|                 ->order('id', 'desc')
 | ||
|                 ->field('id, cate, title, desc, downloads, create_time, icon, views, uploader')
 | ||
|                 ->limit(8)
 | ||
|                 ->select()
 | ||
|                 ->toArray();
 | ||
| 
 | ||
|             // 替换thumbnail为空的程序
 | ||
|             foreach ($programs as &$program) {
 | ||
|                 if (empty($program['thumbnail']) && !empty($categoryImageMap[$program['cate']])) {
 | ||
|                     $program['thumbnail'] = $categoryImageMap[$program['cate']];
 | ||
|                 }
 | ||
|             }
 | ||
|             unset($program);
 | ||
| 
 | ||
|             $programsByCategory[$category['id']] = $programs;
 | ||
|         }
 | ||
| 
 | ||
|         // 合并所有分类的程序
 | ||
|         $allPrograms = [];
 | ||
|         foreach ($programsByCategory as $programs) {
 | ||
|             $allPrograms = array_merge($allPrograms, $programs);
 | ||
|         }
 | ||
| 
 | ||
|         // 按上传时间排序
 | ||
|         usort($allPrograms, function ($a, $b) {
 | ||
|             return $b['create_time'] - $a['create_time'];
 | ||
|         });
 | ||
| 
 | ||
|         // 只取最新的8条
 | ||
|         $allPrograms = array_slice($allPrograms, 0, 8);
 | ||
| 
 | ||
|         return json([
 | ||
|             'code' => 1,
 | ||
|             'msg' => '获取成功',
 | ||
|             'programs' => $allPrograms,
 | ||
|             'categories' => $categoryData
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 获取游戏下载列表
 | ||
|      */
 | ||
|     public function gameList()
 | ||
|     {
 | ||
|         // 获取游戏分类(顶级分类id为8的子分类)
 | ||
|         $categories = ResourcesCategory::where('cid', 8)
 | ||
|             ->where('delete_time', null)
 | ||
|             ->select()
 | ||
|             ->toArray();
 | ||
| 
 | ||
|         // 组装分类数据
 | ||
|         $categoryData = [];
 | ||
|         $categoryImageMap = [];
 | ||
|         $programsByCategory = [];
 | ||
| 
 | ||
|         foreach ($categories as $category) {
 | ||
|             $categoryData[] = [
 | ||
|                 'id' => $category['id'],
 | ||
|                 'name' => $category['name'],
 | ||
|                 'image' => $category['image'] ?? ''
 | ||
|             ];
 | ||
| 
 | ||
|             // 获取每个分类下的游戏,限制8条
 | ||
|             $programs = Resources::where('cate', $category['id'])
 | ||
|                 ->where('delete_time', null)
 | ||
|                 ->where('status', 1)
 | ||
|                 ->order('id', 'desc')
 | ||
|                 ->field('id, cate, title, desc, downloads, create_time, icon, views, uploader, number, url, code')
 | ||
|                 ->limit(8)
 | ||
|                 ->select()
 | ||
|                 ->toArray();
 | ||
| 
 | ||
|             // 处理游戏数据
 | ||
|             foreach ($programs as &$program) {
 | ||
|                 // 如果没有图标,使用分类图片
 | ||
|                 if (empty($program['icon']) && !empty($category['image'])) {
 | ||
|                     $program['icon'] = $category['image'];
 | ||
|                 }
 | ||
|                 // 格式化时间
 | ||
|                 $program['create_time'] = date('Y-m-d H:i:s', $program['create_time']);
 | ||
|             }
 | ||
|             unset($program);
 | ||
| 
 | ||
|             $programsByCategory[$category['id']] = $programs;
 | ||
|         }
 | ||
| 
 | ||
|         // 合并所有分类的游戏
 | ||
|         $allPrograms = [];
 | ||
|         foreach ($programsByCategory as $programs) {
 | ||
|             $allPrograms = array_merge($allPrograms, $programs);
 | ||
|         }
 | ||
| 
 | ||
|         // 按上传时间排序
 | ||
|         usort($allPrograms, function ($a, $b) {
 | ||
|             return strtotime($b['create_time']) - strtotime($a['create_time']);
 | ||
|         });
 | ||
| 
 | ||
|         // 只取最新的8条
 | ||
|         $allPrograms = array_slice($allPrograms, 0, 8);
 | ||
| 
 | ||
|         return json([
 | ||
|             'code' => 0,
 | ||
|             'msg' => '获取成功',
 | ||
|             'data' => [
 | ||
|                 'games' => $allPrograms,
 | ||
|                 'categories' => $categoryData
 | ||
|             ]
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     function sendEmail($email, $to, $content, $title)
 | ||
|     {
 | ||
| 
 | ||
|         // 邮件内容
 | ||
| 
 | ||
|         //实例化PHPMailer核心类
 | ||
|         $mail = new PHPMailer();
 | ||
| 
 | ||
|         //是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
 | ||
|         $mail->SMTPDebug = 1;
 | ||
| 
 | ||
|         //使用smtp鉴权方式发送邮件
 | ||
|         $mail->isSMTP();
 | ||
| 
 | ||
|         //smtp需要鉴权 这个必须是true
 | ||
|         $mail->SMTPAuth = true;
 | ||
| 
 | ||
|         //链接qq域名邮箱的服务器地址
 | ||
|         $mail->Host = 'smtp.qq.com';//如果是163邮箱 就把qq换成163
 | ||
| 
 | ||
|         //设置使用ssl加密方式登录鉴权
 | ||
|         $mail->SMTPSecure = 'ssl';
 | ||
| 
 | ||
|         //设置ssl连接smtp服务器的远程服务器端口号,以前的默认是25,但是现在新的好像已经不可用了 可选465或587
 | ||
|         $mail->Port = 465;
 | ||
| 
 | ||
|         //设置smtp的helo消息头 这个可有可无 内容任意
 | ||
|         // $mail->Helo = 'Hello smtp.qq.com Server';
 | ||
| 
 | ||
|         //设置发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名
 | ||
|         $mail->Hostname = $email;
 | ||
| 
 | ||
|         //设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
 | ||
|         $mail->CharSet = 'UTF-8';
 | ||
| 
 | ||
|         //设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名
 | ||
|         $mail->FromName = '学创网络';
 | ||
| 
 | ||
|         //smtp登录的账号 这里填入字符串格式的qq号即可
 | ||
|         $mail->Username = $email;
 | ||
| 
 | ||
|         //smtp登录的密码 使用qq邮箱生成的授权码(qq邮箱生成授权码参考网址:http://www.huochewu.com/show_1609305/)
 | ||
|         $mail->Password = '';
 | ||
| 
 | ||
|         //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
 | ||
|         $mail->From = $email;
 | ||
| 
 | ||
|         //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
 | ||
|         $mail->isHTML(true);
 | ||
| 
 | ||
|         //设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
 | ||
|         $mail->addAddress($to, '666');
 | ||
| 
 | ||
|         //添加多个收件人 则多次调用方法即可
 | ||
|         // $mail->addAddress('xxx@163.com','');
 | ||
| 
 | ||
|         //添加该邮件的主题
 | ||
|         $mail->Subject = $title;
 | ||
| 
 | ||
|         //添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串 如:使用file_get_contents函数读取本地的html文件
 | ||
|         $mail->Body = $content;
 | ||
| 
 | ||
|         //为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可) 第二参数为在邮件附件中该附件的名称
 | ||
|         // $mail->addAttachment('./d.jpg','mm.jpg');
 | ||
|         //同样该方法可以多次调用 上传多个附件
 | ||
|         // $mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');
 | ||
|         $status = $mail->send();
 | ||
|         //简单的判断与提示信息
 | ||
|         if ($status) {
 | ||
|             return '发送成功';
 | ||
|         } else {
 | ||
|             return '发送失败';
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| }
 |