213 lines
7.9 KiB
MySQL
213 lines
7.9 KiB
MySQL
|
|
-- 新闻资讯:数据表、业务字典与 CMS 菜单权限。
|
|||
|
|
-- 执行目标:测试/生产 HighGo 数据库的 shz schema。
|
|||
|
|
-- 可重复执行:表/索引、字典类型/字典项、菜单/按钮均做幂等处理。
|
|||
|
|
|
|||
|
|
BEGIN;
|
|||
|
|
|
|||
|
|
-- 显式创建序列以兼容生产 HighGo(生产环境不识别 BIGSERIAL 类型别名)。
|
|||
|
|
CREATE SEQUENCE IF NOT EXISTS "shz"."news_info_id_seq"
|
|||
|
|
START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
|
|||
|
|
|
|||
|
|
CREATE TABLE IF NOT EXISTS "shz"."news_info" (
|
|||
|
|
"id" BIGINT NOT NULL DEFAULT nextval('shz.news_info_id_seq'::regclass) PRIMARY KEY,
|
|||
|
|
"module" VARCHAR(100) NOT NULL,
|
|||
|
|
"title" VARCHAR(200) NOT NULL,
|
|||
|
|
"content" TEXT NOT NULL,
|
|||
|
|
"status" CHAR(1) NOT NULL DEFAULT '1',
|
|||
|
|
"create_by" VARCHAR(64) NOT NULL DEFAULT '',
|
|||
|
|
"create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
"update_by" VARCHAR(64) NOT NULL DEFAULT '',
|
|||
|
|
"update_time" TIMESTAMP,
|
|||
|
|
"del_flag" CHAR(1) NOT NULL DEFAULT '0',
|
|||
|
|
"remark" VARCHAR(500) NOT NULL DEFAULT '',
|
|||
|
|
CONSTRAINT "chk_news_info_status" CHECK ("status" IN ('0', '1')),
|
|||
|
|
CONSTRAINT "chk_news_info_del_flag" CHECK ("del_flag" IN ('0', '2'))
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
COMMENT ON TABLE "shz"."news_info" IS '新闻资讯表';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."id" IS '新闻资讯ID';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."module" IS '资讯模块,对应业务字典 news_module 的 dict_value';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."title" IS '标题';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."content" IS '富文本正文(经过服务端白名单清理的HTML)';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."status" IS '上下架状态(0上架 1下架)';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."create_by" IS '创建者';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."create_time" IS '创建时间';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."update_by" IS '更新者';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."update_time" IS '更新时间';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."del_flag" IS '删除标志(0存在 2删除)';
|
|||
|
|
COMMENT ON COLUMN "shz"."news_info"."remark" IS '备注';
|
|||
|
|
|
|||
|
|
CREATE INDEX IF NOT EXISTS "idx_news_info_module"
|
|||
|
|
ON "shz"."news_info" ("module");
|
|||
|
|
CREATE INDEX IF NOT EXISTS "idx_news_info_status_created"
|
|||
|
|
ON "shz"."news_info" ("status", "create_time" DESC)
|
|||
|
|
WHERE "del_flag" = '0';
|
|||
|
|
|
|||
|
|
-- 资讯模块使用“业务字典”,资讯表只保存 dict_value;管理员可在现有业务字典页面继续添加模块项。
|
|||
|
|
INSERT INTO "shz"."bussiness_dict_type" (
|
|||
|
|
"dict_id", "dict_name", "dict_type", "status", "create_by", "create_time", "remark"
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
(SELECT COALESCE(MAX("dict_id"), 0) + 1 FROM "shz"."bussiness_dict_type"),
|
|||
|
|
'新闻资讯模块',
|
|||
|
|
'news_module',
|
|||
|
|
'0',
|
|||
|
|
'system',
|
|||
|
|
CURRENT_TIMESTAMP,
|
|||
|
|
'新闻资讯模块,资讯表保存 dict_value,可在业务字典中扩展'
|
|||
|
|
WHERE NOT EXISTS (
|
|||
|
|
SELECT 1
|
|||
|
|
FROM "shz"."bussiness_dict_type"
|
|||
|
|
WHERE "dict_type" = 'news_module'
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
WITH seed("dict_sort", "dict_label", "dict_value", "list_class", "is_default") AS (
|
|||
|
|
VALUES
|
|||
|
|
(1, '求职资讯', 'job_information', 'primary', 'Y'),
|
|||
|
|
(2, '面试技巧', 'interview_tips', 'success', 'N'),
|
|||
|
|
(3, '简历指南', 'resume_guide', 'warning', 'N'),
|
|||
|
|
(4, '行业指南', 'industry_guide', 'info', 'N'),
|
|||
|
|
(5, '政策法规', 'policy_regulations', 'danger', 'N')
|
|||
|
|
),
|
|||
|
|
new_rows AS (
|
|||
|
|
SELECT
|
|||
|
|
ROW_NUMBER() OVER (ORDER BY seed."dict_sort") AS rn,
|
|||
|
|
seed.*
|
|||
|
|
FROM seed
|
|||
|
|
WHERE NOT EXISTS (
|
|||
|
|
SELECT 1
|
|||
|
|
FROM "shz"."bussiness_dict_data" data
|
|||
|
|
WHERE data."dict_type" = 'news_module'
|
|||
|
|
AND data."dict_value" = seed."dict_value"
|
|||
|
|
)
|
|||
|
|
),
|
|||
|
|
base AS (
|
|||
|
|
SELECT COALESCE(MAX("dict_code"), 0) AS max_code
|
|||
|
|
FROM "shz"."bussiness_dict_data"
|
|||
|
|
)
|
|||
|
|
INSERT INTO "shz"."bussiness_dict_data" (
|
|||
|
|
"dict_code", "dict_sort", "dict_label", "dict_value", "dict_type",
|
|||
|
|
"css_class", "list_class", "is_default", "status", "create_by", "create_time", "remark"
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
base.max_code + new_rows.rn,
|
|||
|
|
new_rows."dict_sort",
|
|||
|
|
new_rows."dict_label",
|
|||
|
|
new_rows."dict_value",
|
|||
|
|
'news_module',
|
|||
|
|
NULL,
|
|||
|
|
new_rows."list_class",
|
|||
|
|
new_rows."is_default",
|
|||
|
|
'0',
|
|||
|
|
'system',
|
|||
|
|
CURRENT_TIMESTAMP,
|
|||
|
|
'新闻资讯模块'
|
|||
|
|
FROM new_rows
|
|||
|
|
CROSS JOIN base;
|
|||
|
|
|
|||
|
|
-- CMS 一级目录。
|
|||
|
|
INSERT INTO "shz"."sys_menu" (
|
|||
|
|
"menu_name", "parent_id", "order_num", "path", "component", "query", "route_name",
|
|||
|
|
"is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon",
|
|||
|
|
"create_by", "create_time", "update_by", "update_time", "remark", "menu_id"
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
'新闻资讯', 0, 8, 'news-information', '', '', 'NewsInformation',
|
|||
|
|
1, 0, 'M', '0', '0', '', 'ReadOutlined',
|
|||
|
|
'system', CURRENT_TIMESTAMP, '', NULL, '新闻资讯管理目录', ids."menu_id"
|
|||
|
|
FROM (
|
|||
|
|
SELECT COALESCE(MAX("menu_id"), 0) + 1 AS "menu_id"
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
) ids
|
|||
|
|
WHERE NOT EXISTS (
|
|||
|
|
SELECT 1
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
WHERE "parent_id" = 0 AND "path" = 'news-information'
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- CMS 资讯管理页面;页面权限同时作为列表权限。
|
|||
|
|
INSERT INTO "shz"."sys_menu" (
|
|||
|
|
"menu_name", "parent_id", "order_num", "path", "component", "query", "route_name",
|
|||
|
|
"is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon",
|
|||
|
|
"create_by", "create_time", "update_by", "update_time", "remark", "menu_id"
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
'资讯管理', parent."menu_id", 1, 'news-info', 'NewsInfo/index', '', 'NewsInfo',
|
|||
|
|
1, 0, 'C', '0', '0', 'cms:newsInfo:list', 'ProfileOutlined',
|
|||
|
|
'system', CURRENT_TIMESTAMP, '', NULL, '新闻资讯管理页面', ids."menu_id"
|
|||
|
|
FROM (
|
|||
|
|
SELECT "menu_id"
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
WHERE "parent_id" = 0 AND "path" = 'news-information'
|
|||
|
|
ORDER BY "menu_id"
|
|||
|
|
LIMIT 1
|
|||
|
|
) parent
|
|||
|
|
CROSS JOIN (
|
|||
|
|
SELECT COALESCE(MAX("menu_id"), 0) + 1 AS "menu_id"
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
) ids
|
|||
|
|
WHERE NOT EXISTS (
|
|||
|
|
SELECT 1
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
WHERE "perms" = 'cms:newsInfo:list'
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 页面按钮权限。
|
|||
|
|
WITH parent AS (
|
|||
|
|
SELECT "menu_id"
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
WHERE "perms" = 'cms:newsInfo:list'
|
|||
|
|
ORDER BY "menu_id"
|
|||
|
|
LIMIT 1
|
|||
|
|
),
|
|||
|
|
seed("order_num", "menu_name", "perms", "remark") AS (
|
|||
|
|
VALUES
|
|||
|
|
(1, '新闻资讯查询', 'cms:newsInfo:query', '查询新闻资讯详情'),
|
|||
|
|
(2, '新闻资讯新增', 'cms:newsInfo:add', '新增新闻资讯'),
|
|||
|
|
(3, '新闻资讯修改', 'cms:newsInfo:edit', '修改新闻资讯'),
|
|||
|
|
(4, '新闻资讯删除', 'cms:newsInfo:remove', '删除新闻资讯'),
|
|||
|
|
(5, '新闻资讯上下架', 'cms:newsInfo:status', '新闻资讯上架或下架')
|
|||
|
|
),
|
|||
|
|
new_rows AS (
|
|||
|
|
SELECT
|
|||
|
|
ROW_NUMBER() OVER (ORDER BY seed."order_num") AS rn,
|
|||
|
|
seed.*
|
|||
|
|
FROM seed
|
|||
|
|
WHERE NOT EXISTS (
|
|||
|
|
SELECT 1
|
|||
|
|
FROM "shz"."sys_menu" existing
|
|||
|
|
WHERE existing."perms" = seed."perms"
|
|||
|
|
)
|
|||
|
|
),
|
|||
|
|
base AS (
|
|||
|
|
SELECT COALESCE(MAX("menu_id"), 0) AS max_id
|
|||
|
|
FROM "shz"."sys_menu"
|
|||
|
|
)
|
|||
|
|
INSERT INTO "shz"."sys_menu" (
|
|||
|
|
"menu_id", "menu_name", "parent_id", "order_num", "path", "component", "query", "route_name",
|
|||
|
|
"is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon",
|
|||
|
|
"create_by", "create_time", "update_by", "update_time", "remark"
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
base.max_id + new_rows.rn,
|
|||
|
|
new_rows."menu_name",
|
|||
|
|
parent."menu_id",
|
|||
|
|
new_rows."order_num",
|
|||
|
|
'', '', '', '',
|
|||
|
|
1, 0, 'F', '0', '0', new_rows."perms", '#',
|
|||
|
|
'system', CURRENT_TIMESTAMP, '', NULL, new_rows."remark"
|
|||
|
|
FROM new_rows
|
|||
|
|
CROSS JOIN parent
|
|||
|
|
CROSS JOIN base;
|
|||
|
|
|
|||
|
|
COMMIT;
|
|||
|
|
|
|||
|
|
-- 说明:管理员角色通过 *:*:* 自动拥有全部权限;其他角色请在 CMS“角色管理”中按需分配“新闻资讯”。
|
|||
|
|
-- 验证:
|
|||
|
|
-- SELECT column_name, data_type FROM information_schema.columns
|
|||
|
|
-- WHERE table_schema = 'shz' AND table_name = 'news_info' ORDER BY ordinal_position;
|
|||
|
|
-- SELECT dict_label, dict_value FROM shz.bussiness_dict_data
|
|||
|
|
-- WHERE dict_type = 'news_module' ORDER BY dict_sort;
|
|||
|
|
-- SELECT menu_id, menu_name, parent_id, menu_type, perms FROM shz.sys_menu
|
|||
|
|
-- WHERE path = 'news-information' OR perms LIKE 'cms:newsInfo:%' ORDER BY menu_id;
|