文件
huaqiapp/server/public/assets/js/backend/manage.js
linda 56f5f60aa5 feat(admin): 后台登录页品牌化 + 26 个业务模块与前端对齐 + 数据同步打通
一、登录页重构(暖色调品牌版)
- 左右分栏卡片: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
2026-11-06 11:10:19 +08:00

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;
});