一、登录页重构(暖色调品牌版)
- 左右分栏卡片:44% 品牌面板(花红渐变 + 光斑 + 内联 SVG 花瓣 Logo + 花期字标/口号)
+ 56% 表单面板(52px 输入框、内嵌矢量图标、聚焦暖色光晕、渐变主按钮)
- 与前台同一套设计令牌(#E8604C / #F58C7C / #FFF9F5 / #3E2C27),响应式适配
- 完整保留 #login-form/#pd-form-username/#profile-img/#errtips/token/验证码/保持登录等结构,后台登录 JS 零改动
二、后台业务模块(26 个,与前端 M1–M9 一一对应)
- 新增通用 Manage 控制器(列表/搜索/排序/新增/编辑/软删除/批量/列元数据)
- 新增 ManageConfig(26 张表的字段标签/类型/枚举/搜索配置)与 FormBuilder(表单控件渲染)
- 新增通用视图 manage/{index,add,edit,style}.html + public/assets/js/backend/manage.js
- 新增 26 个薄控制器(各 8 行,仅声明 )
- db/05_admin_menu.sql:花期运营菜单树 + 6 个通用操作权限,含站点名品牌化
三、品牌一致性
- site.php 站点名改为「花期运营中心」,顶栏 Logo 增加矢量花瓣
- 业务页暖色表头、渐变按钮、圆角输入、品牌色开关
四、验证(全绿)
- 后台自检 31 项:登录页品牌、框架菜单、26 模块页面 200 + 列表数据、后台编辑写库、
后台改动 → 前台 API 同步读取、数据还原
- 前台接口 82 项断言、契约 84 接口、Vue 20/20、SCSS 19/19、无 emoji 均通过
- 修复 5 个真实问题:方法签名不兼容致 500、菜单缓存、SQL 字符集乱码、
snake_case URL 与权限规则命名、会话文件属主导致的自检 500
144 行
7.5 KiB
HTML
可执行文件
144 行
7.5 KiB
HTML
可执行文件
<!-- Logo(花期品牌) -->
|
||
<style>
|
||
.hq-logo-lg { display: inline-flex; align-items: center; gap: 8px; }
|
||
.hq-logo-lg svg { flex-shrink: 0; }
|
||
.hq-logo-mini { letter-spacing: 1px; }
|
||
</style>
|
||
<a href="javascript:;" class="logo">
|
||
<!-- 迷你模式下Logo的大小为50X50 -->
|
||
<span class="logo-mini hq-logo-mini">花期</span>
|
||
<!-- 普通模式下Logo -->
|
||
<span class="logo-lg hq-logo-lg">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none"
|
||
stroke="#FFD8C9" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
|
||
<circle cx="12" cy="12" r="2.6"/>
|
||
<circle cx="12" cy="5.4" r="2.9"/>
|
||
<circle cx="18.6" cy="12" r="2.9"/>
|
||
<circle cx="12" cy="18.6" r="2.9"/>
|
||
<circle cx="5.4" cy="12" r="2.9"/>
|
||
</svg>
|
||
<span>{$site.name|htmlentities}</span>
|
||
</span>
|
||
</a>
|
||
|
||
<!-- 顶部通栏样式 -->
|
||
<nav class="navbar navbar-static-top">
|
||
|
||
<!--第一级菜单-->
|
||
<div id="firstnav">
|
||
<!-- 边栏切换按钮-->
|
||
<a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button">
|
||
<span class="sr-only">{:__('Toggle navigation')}</span>
|
||
</a>
|
||
|
||
<!--如果不想在顶部显示角标,则给ul加上disable-top-badge类即可-->
|
||
<ul class="nav nav-tabs nav-addtabs disable-top-badge hidden-xs" role="tablist">
|
||
{$navlist}
|
||
</ul>
|
||
|
||
<div class="navbar-custom-menu">
|
||
<ul class="nav navbar-nav">
|
||
|
||
<li class="hidden-xs">
|
||
<a href="__PUBLIC__" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i> {:__('Home')}</a>
|
||
</li>
|
||
|
||
<!-- 清除缓存 -->
|
||
<li class="hidden-xs">
|
||
<a href="javascript:;" data-toggle="dropdown" title="{:__('Wipe cache')}">
|
||
<i class="fa fa-trash"></i> {:__('Wipe cache')}
|
||
</a>
|
||
<ul class="dropdown-menu wipecache">
|
||
<li><a href="javascript:;" data-type="all"><i class="fa fa-trash fa-fw"></i> {:__('Wipe all cache')}</a></li>
|
||
<li class="divider"></li>
|
||
<li><a href="javascript:;" data-type="content"><i class="fa fa-file-text fa-fw"></i> {:__('Wipe content cache')}</a></li>
|
||
<li><a href="javascript:;" data-type="template"><i class="fa fa-file-image-o fa-fw"></i> {:__('Wipe template cache')}</a></li>
|
||
<li><a href="javascript:;" data-type="addons"><i class="fa fa-rocket fa-fw"></i> {:__('Wipe addons cache')}</a></li>
|
||
<li><a href="javascript:;" data-type="browser"><i class="fa fa-chrome fa-fw"></i> {:__('Wipe browser cache')}
|
||
<span data-toggle="tooltip" data-title="{:__('Wipe browser cache tips')}"><i class="fa fa-info-circle"></i></span>
|
||
</a></li>
|
||
</ul>
|
||
</li>
|
||
|
||
<!-- 多语言列表 -->
|
||
{if $Think.config.lang_switch_on}
|
||
<li class="hidden-xs">
|
||
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-language"></i></a>
|
||
<ul class="dropdown-menu">
|
||
<li class="{$config['language']=='zh-cn'?'active':''}">
|
||
<a href="?ref=addtabs&lang=zh-cn">简体中文</a>
|
||
</li>
|
||
<li class="{$config['language']=='en'?'active':''}">
|
||
<a href="?ref=addtabs&lang=en">English</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
{/if}
|
||
|
||
<!-- 全屏按钮 -->
|
||
<li class="hidden-xs">
|
||
<a href="#" data-toggle="fullscreen"><i class="fa fa-arrows-alt"></i></a>
|
||
</li>
|
||
|
||
<!-- 账号信息下拉框 -->
|
||
<li class="dropdown user user-menu">
|
||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||
<img src="{$admin.avatar|cdnurl|htmlentities}" class="user-image" alt="">
|
||
<span class="hidden-xs">{$admin.nickname|htmlentities}</span>
|
||
</a>
|
||
<ul class="dropdown-menu">
|
||
<!-- User image -->
|
||
<li class="user-header">
|
||
<img src="{$admin.avatar|cdnurl|htmlentities}" class="img-circle" alt="">
|
||
|
||
<p>
|
||
{$admin.nickname|htmlentities}
|
||
<small>{$admin.logintime|date="Y-m-d H:i:s",###}</small>
|
||
</p>
|
||
</li>
|
||
<li class="user-body">
|
||
<div class="visible-xs">
|
||
<div class="pull-left">
|
||
<a href="__PUBLIC__" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i> {:__('Home')}</a>
|
||
</div>
|
||
<div class="pull-right">
|
||
<a href="javascript:;" data-type="all" class="wipecache"><i class="fa fa-trash fa-fw"></i> {:__('Wipe all cache')}</a>
|
||
</div>
|
||
</div>
|
||
</li>
|
||
<!-- Menu Footer-->
|
||
<li class="user-footer">
|
||
<div class="pull-left">
|
||
<a href="general/profile" class="btn btn-primary addtabsit"><i class="fa fa-user"></i>
|
||
{:__('Profile')}</a>
|
||
</div>
|
||
<div class="pull-right">
|
||
<a href="{:url('index/logout')}" class="btn btn-danger"><i class="fa fa-sign-out"></i>
|
||
{:__('Logout')}</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<!-- 控制栏切换按钮 -->
|
||
<li class="hidden-xs">
|
||
<a href="javascript:;" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
{if $Think.config.fastadmin.multiplenav}
|
||
<!--第二级菜单,只有在multiplenav开启时才显示-->
|
||
<div id="secondnav">
|
||
<ul class="nav nav-tabs nav-addtabs disable-top-badge" role="tablist">
|
||
{if $fixedmenu}
|
||
<li role="presentation" id="tab_{$fixedmenu.id|htmlentities}" class="{:$referermenu?'':'active'}"><a href="#con_{$fixedmenu.id|htmlentities}" node-id="{$fixedmenu.id|htmlentities}" aria-controls="{$fixedmenu.id|htmlentities}" role="tab" data-toggle="tab"><i class="fa fa-dashboard fa-fw"></i> <span>{$fixedmenu.title|htmlentities}</span> <span class="pull-right-container"> </span></a></li>
|
||
{/if}
|
||
{if $referermenu}
|
||
<li role="presentation" id="tab_{$referermenu.id|htmlentities}" class="active"><a href="#con_{$referermenu.id|htmlentities}" node-id="{$referermenu.id|htmlentities}" aria-controls="{$referermenu.id|htmlentities}" role="tab" data-toggle="tab"><i class="fa fa-list fa-fw"></i> <span>{$referermenu.title|htmlentities}</span> <span class="pull-right-container"> </span></a> <i class="close-tab fa fa-remove"></i></li>
|
||
{/if}
|
||
</ul>
|
||
</div>
|
||
{/if}
|
||
</nav>
|