一、登录页重构(暖色调品牌版)
- 左右分栏卡片: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
90 行
3.1 KiB
JavaScript
90 行
3.1 KiB
JavaScript
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
|
|
|
|
var Controller = {
|
|
index: function () {
|
|
var table = $("#table");
|
|
var tableName = table.data("table");
|
|
var meta = Config.columns || [];
|
|
|
|
// 依据后端字段元数据动态构建列
|
|
var head = [[{checkbox: true, width: 40}]];
|
|
meta.forEach(function (col) {
|
|
head[0].push({
|
|
field: col.field,
|
|
title: col.title,
|
|
sortable: !!col.sortable,
|
|
operate: col.search ? 'LIKE' : false,
|
|
formatter: function (value) {
|
|
if (value === null || value === undefined || value === '' || value === '0' && col.type === 'date') {
|
|
return '<span class="text-muted">-</span>';
|
|
}
|
|
if (value === '') {
|
|
return '<span class="text-muted">-</span>';
|
|
}
|
|
return $('<div>').text(value).html();
|
|
}
|
|
});
|
|
});
|
|
head[0].push({
|
|
field: 'operate',
|
|
title: '操作',
|
|
table: table,
|
|
events: Table.api.events.operate,
|
|
formatter: Table.api.formatter.operate,
|
|
width: 110
|
|
});
|
|
|
|
Table.api.init({
|
|
extend: {
|
|
index_url: 'manage/index?table=' + tableName,
|
|
add_url: 'manage/add?table=' + tableName,
|
|
edit_url: 'manage/edit?table=' + tableName,
|
|
del_url: 'manage/del?table=' + tableName,
|
|
multi_url: 'manage/multi?table=' + tableName,
|
|
table: tableName
|
|
}
|
|
});
|
|
|
|
table.bootstrapTable({
|
|
url: 'manage/index?table=' + tableName,
|
|
pk: 'id',
|
|
sortName: 'id',
|
|
sortOrder: 'desc',
|
|
search: true,
|
|
commonSearch: false,
|
|
showExport: false,
|
|
pageSize: 20,
|
|
pageList: [10, 20, 50, 100],
|
|
columns: head,
|
|
queryParams: function (params) {
|
|
params.table = tableName;
|
|
return params;
|
|
}
|
|
});
|
|
|
|
Table.api.bindevent(table);
|
|
|
|
table.on('load-success.bs.table', function (e, data) {
|
|
if (data && typeof data.total !== 'undefined') {
|
|
$('#hq-total').text(data.total);
|
|
}
|
|
});
|
|
},
|
|
add: function () {
|
|
Controller.api.bindevent();
|
|
},
|
|
edit: function () {
|
|
Controller.api.bindevent();
|
|
},
|
|
api: {
|
|
bindevent: function () {
|
|
Form.api.bindevent($("form[role=form]"));
|
|
$(document).on('click', '.btn-return', function () {
|
|
parent.Layer.closeAll();
|
|
});
|
|
}
|
|
}
|
|
};
|
|
return Controller;
|
|
});
|