title | description | keys |
---|---|---|
后台内核(Admin) |
后台内核,为后台业务提供底层策略,写法支持.(导航菜单,基础页面) |
admin,phpzlc/admin,后台 |
后台内核,为后台业务提供底层策略,写法支持.(导航菜单,基础页面,导入,导出等功能)
composer require phpzlc/admin
后台控制器需要按照下列来实现基类
class AdminController extends SystemBaseController
{
/**
* @var AdminStrategy
*/
private $adminStrategy;
/**
* @var string
*/
private $pageTag;
public function inlet($returnType = SystemBaseController::RETURN_HIDE_RESOURCE, $isLogin = true)
{
$this->adminStrategy = new AdminStrategy($this->container);
$this->adminStrategy->setPageTag($this->pageTag);
return parent::inlet($returnType, $isLogin);
}
}
是后台核心机制类,主要用于设置后台系统的基本属性和动作
//菜单配置
$menus = [
new Menu($title, $ico, $tag, $url, $url_target, [
new Menu($title, $ico, $tag, $url, $url_target, $childs = array())
])
];
$this->adminStrategy = new AdminStrategy($this->container);
//设置管理端基本信息(名称,页面标记,菜单......)
$this->adminStrategy
// 设置后台标题
->setTitle('admin')
// 设置后台入口URL
->setEntranceUrl($this->generateUrl('admin_manage_index'))
// 设置后台退出登录URL
->setEndUrl($this->generateUrl('admin_manage_logout'))
// 设置修改密码页面URL
->setSettingPwdUrl($this->generateUrl('admin_manage_edit_password'))
// 设置后台页面模式
->setMenuModel(AdminStrategy::menu_model_simple)
// 设置页面标记
->setPageTag($this->page_tag)
// 设置清除缓存API地址url
->setClearCacheApiUrl($this->generateUrl('admin_manage_clearCache'))
// 设置后台favicon_ico图标
->setFaviconIco('public/image/100.png')
// 设置后台logo
->setLogo('public/image/200.png')
// 设置后台导航菜单
->setMenus($menus)
// 设置登陆页面背景图片
->setLoginLackGroundImg('public/image/200.png');
-
设置锚点url
用于设置表单提交,取消等需要返回到某个控制器层的action中时,我们可以使用该方法,将action设为锚点,一般在列表中设置。
public function setUrlAnchor()
-
设置页面标记
页面标记配置,需要在菜单相对应配置,用于菜单选项选中后高亮显示。
public function setPageTag($tag)
-
设置后台标题
public function setTitle($title)
-
设置后台favicon_ico图标
public function setFaviconIco($favicon_ico)
-
设置后台logo
public function setLogo($logo)
-
设置后台入口URL,一般用于返回首页功能
public function setEntranceUrl($entrance_url)
-
设置退出登录URL
public function setEndUrl($end_url)
-
设置密码修改页面url
public function setSettingPwdUrl($setting_pwd_url)
-
设置清除缓存API地址url
public function setClearCacheApiUrl(string $clear_cache_api_url)
-
设置管理员角色名称
public function setAdminRoleName($admin_role_name)
-
设置登陆页面背景图片
public function setLoginLackGroundImg(string $login_lack_ground_img)
-
设置管理员登录头像
public function setAdminAvatar(string $admin_avatar)
-
设置head自定义代码
public function setHendCode(string $head_code)
-
设置面包线
$this->adminStrategy->setNavigations(array $navigations)
-
在原有的面包线上添加面包线
$this->adminStrategy->addNavigation(new Navigation($title, $url = ''));
本框架提供两种后台页面模式.这两种模式可以进行切换,适合不同量级的后台.
-
简单模式(三级菜单,后期业务升级可便捷地切换到复杂模式)
-
复杂模式(四级菜单,增加头部菜单,功能划分更精确直观)
-
代码配置
$this->adminStrategy = new AdminStrategy(ContainerInterface $container); $this->adminStrategy->setMenuModel(AdminStrategy::menu_model_simple) // 简单模式 menu_model_simple; 复杂模式 menu_model_all;
-
我们将要显示的导航菜单根据它的层级设置一个多维数组$menus,然后调用
$this->adminStrategy->setMenus(array $menus);
-
比较常用三级层级的导航菜单
new Menu('博客管理系统', null, null, null, null, [ new Menu('博客管理', 'fa fa-clone', null, null, null, [ new Menu('文章管理', null, 'admin_article_index', $this->generateUrl('admin_blog_manage_article_index'), null), ]), ]);
我们提供全局变量参数,来改变后台环境显示.例如,内测;开发;样品;正式环境
-
内测环境(配置地址.env.local)
ADMIN_ENV=beta
-
开发模式环境(配置地址.env.local)
ADMIN_ENV=dev
-
样品环境(配置地址.env.local)
ADMIN_ENV=demo
-
正式环境(配置地址.env.local)
ADMIN_ENV=prod
-
我们提供可复制的仪表盘页面代码参考模板
-
页面效果
-
我们提供可复制的列表页面代码参考模板
-
页面效果
-
控制器层
/** * 用户管理首页 * * @param Request|null $request * @return bool|JsonResponse|RedirectResponse|Response */ public function index(Request $request = null) { $r = $this->inlet(self::RETURN_SHOW_RESOURCE, true); if($r !== true){ return $r; } // 设置当前页面为锚点 $this->adminStrategy->setUrlAnchor(); // 获取搜索框数据 $user_name = $request->get('user_name'); // 添加需要搜索字段的规则 $rules = [ 'user_name' . Rule::RA_LIKE => '%' . $user_name . '%', ]; // 页面页码配置(必须在控制器配置) $page = $request->get('page', 1); // 页面展示数据的行数(必须在控制器配置, 默认展示20行数据) $rows = $request->get('rows', 20); // 页面展示的数据 $data = $this->userRepository->findLimitAll($rows, $page, $rules); // 数据库数据的数量(必须在控制器配置) $count = $this->userRepository->findCount($rules); // 返回数据和页面 return $this->render('admin/user/index.html.twig', array( 'page' => $page, 'rows' => $rows, 'count' => $count, 'users' => $data )); }
-
composer require phpoffice/phpspreadsheet
-
页面层
// 该功能控件常见于在列表页中,位置处于搜索框和数据列表页中间部分跟新建按钮存在一个标签中(特殊情况根据需求可以编写在任何你想要的页面) // 下载导入模板 <el-button size="mini" @click="handleImportTemplate">下载导入模板</el-button> // 导入按钮 <el-upload class="upload-demo" action="导入地址" :limit="1" :on-success="handleImport" :on-error = "handleImport" :file-list="fileList"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div> </el-upload> <script> export default { methods: { handleImport(result){ const that = this; resultPreprocess(that, result, "admin_url_anchor()"); }, } } </script>
-
效果图
-
控制器层
/** * 导入模板下载 * * @param Request $request * @return bool|JsonResponse|RedirectResponse|Response|void */ public function importTemplate(Request $request) { $r = $this->inlet(self::RETURN_HIDE_RESOURCE, true); if($r !== true){ return $r; } // 根据业务所设置的Business层 $driverImportBusiness = new DriverImportBusiness($this->container); return $driverImportBusiness->goUrl($driverImportBusiness->downloadImportTemplate($request)); } /** * 导入功能 * * @return bool|JsonResponse|RedirectResponse|Response * @throws \Doctrine\DBAL\ConnectionException */ public function import() { // phpzlc框架控制器的入口方法 $r = $this->inlet(self::RETURN_HIDE_RESOURCE, true); if($r !== true){ return $r; } set_time_limit(0); ob_start(); // 该Business层封装导入方法(该Business层根据业务需求所编写,但是必须继承Business/ExcelBusiness/ImportBusiness类) $ImportBusiness = new ImportBusiness($this->container); /** * @var Connection $conn */ $conn = ActionLoad::$globalDoctrine->getConnection(); $conn->beginTransaction(); try { // 通过Excel组件的Import获取上传导入的数据 $data = $ImportBusiness->importData(); // 循环data数据 foreach ($data as $k => $v) { //将数据导入数据库当中 } $conn->commit(); return Responses::success('导入成功'); }catch (PhpZlcApiException $exception){ $conn->rollBack(); return Responses::error($exception->getMessage()); } }
-
Business层
// 命名空间 namespace App\Business\DriverBusiness; //引用的文件 use App\Business\ExcelBusiness\ImportBusiness; use PHPZlc\PHPZlc\Bundle\EventListener\ApiExceptionListener\PhpZlcApiException; class DriverImportBusiness extends ImportBusiness { public function importTemplateFilePath() { // 导入模板的名称 return '司机导入模板.xlsx'; } // 序列化导入的数据 public function format($data) { if(empty($data)){ throw new PhpZlcApiException('导入数据不能为空'); } $info = []; $drivers = []; // 数据的循环与判断 foreach ($data as $index => $value){ $name = $this->getValue($value, 0); $sex = $this->getValue($value, 1); $phone = $this->getValue($value, 2); $password = $this->getValue($value, 3); $id_card_no = $this->getValue($value, 4); $rows = $index + 1; if(empty($phone)){ throw new PhpZlcApiException('第' . $rows . '行手机号不能为空'); } if(empty($sex)){ throw new PhpZlcApiException('第' . $rows . '行性别不能为空'); }else{ if($sex == '男'){ $sex = 1; }elseif ($sex == '女'){ $sex = 2; }else{ throw new PhpZlcApiException('第' . $rows . '行请输入正确的性别'); } } $info[] = array( 'name' => $name, 'sex' => $sex, 'phone' => $phone, 'password' => $password, 'id_card_no' => $id_card_no ); } return $info; } }
-
页面层
// 该控件的编写位置跟上面的下载导入模板和导入的位置相同(具体位置具体分析) <el-button size="mini" type="success" @click="export_data()">导出</el-button> <script> export default { methods: { export_data(){ window.location.href = urlParamWrite(getSelfUrl(), 'ex', '1'); }, } } </script>
-
效果图
-
控制器层
/** * 导出 * */ public function info(Request $request) { $r = $this->inlet(); if($r !== true){ return $r; } $this->adminStrategy->setUrlAnchor(); $rows = $request->get('rows', 20); $page = $request->get('page', 1); // 获取数据的规则 $rules = [ 'feedDayDaily' => $request->get('id') ]; $daily = ActionLoad::$globalDoctrine->getRepository('App:FeedDayDaily')->find($request->get('id')); // 通过ex判断是否是导出数据, 如若ex的值为1,则导出数据,如若不是,则显示页面 if($request->get('ex') != 1){ }else{ // 调用phpzlcExport组件 $ex = new Export(); // 设置导出Excel表头(一维数组) $head = []; // 获取需要导出的数据 $list = ActionLoad::$globalDoctrine->getRepository('App:FeedDayDailyInfo')->findAll($rules); $data = []; // 对需要导出的数据进行循环处理,放入data数组中(二维数组) foreach ($list as $value){ $data[] = array( $value->getId(), $value->getName ) } // 调用Excel组件的export方法 $ex->export($daily->getTitle(), $head, $data, true); } }
具体写法,更多特性可通过demo项目了解。