update
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
DROP TABLE IF EXISTS sys_user;
|
||||
DROP TABLE IF EXISTS sys_user_login_log;
|
||||
DROP TABLE IF EXISTS sys_audit_log;
|
||||
DROP TABLE IF EXISTS sessions;
|
||||
DROP TABLE IF EXISTS sys_department;
|
||||
DROP TABLE IF EXISTS sys_role;
|
||||
DROP TABLE IF EXISTS sys_menu;
|
||||
DROP TABLE IF EXISTS sys_role_menu;
|
||||
DROP TABLE IF EXISTS sys_config;
|
||||
DROP TABLE IF EXISTS categories;
|
||||
DROP TABLE IF EXISTS customers;
|
||||
DROP TABLE IF EXISTS customer_contact;
|
||||
DROP TABLE IF EXISTS projects;
|
||||
DROP TABLE IF EXISTS project_files;
|
||||
DROP TABLE IF EXISTS budgets;
|
||||
DROP TABLE IF EXISTS incomes;
|
||||
DROP TABLE IF EXISTS expenses;
|
||||
@@ -0,0 +1,666 @@
|
||||
-- SQL dump generated using DBML (dbml.dbdiagram.io)
|
||||
-- Database: PostgreSQL
|
||||
-- Generated at: 2025-06-12T01:21:05.629Z
|
||||
|
||||
CREATE TABLE "sys_user" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"uuid" uuid NOT NULL,
|
||||
"email" VARCHAR(100) NOT NULL,
|
||||
"username" VARCHAR(100) NOT NULL,
|
||||
"hashed_password" bytea NOT NULL,
|
||||
"salt" VARCHAR(20) NOT NULL,
|
||||
"avatar" VARCHAR(200) NOT NULL,
|
||||
"gender" INT NOT NULL DEFAULT 0,
|
||||
"department_id" INT NOT NULL DEFAULT 0,
|
||||
"role_id" INT NOT NULL DEFAULT 0,
|
||||
"status" INT NOT NULL DEFAULT 0,
|
||||
"change_password_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_user_login_log" (
|
||||
"id" BIGSERIAL NOT NULL,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"email" VARCHAR(100) NOT NULL,
|
||||
"is_success" Boolean NOT NULL,
|
||||
"message" VARCHAR(300) NOT NULL,
|
||||
"referer_url" VARCHAR(500) NOT NULL,
|
||||
"url" VARCHAR(500) NOT NULL,
|
||||
"os" VARCHAR(50) NOT NULL,
|
||||
"ip" VARCHAR(20) NOT NULL,
|
||||
"browser" VARCHAR(100) NOT NULL,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_audit_log" (
|
||||
"id" BIGSERIAL NOT NULL,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"email" VARCHAR(100) NOT NULL,
|
||||
"start_at" TIMESTAMPTZ NOT NULL,
|
||||
"end_at" TIMESTAMPTZ NOT NULL,
|
||||
"duration" VARCHAR(10) NOT NULL,
|
||||
"url" VARCHAR(500) NOT NULL,
|
||||
"method" VARCHAR(50) NOT NULL,
|
||||
"parameters" VARCHAR NOT NULL,
|
||||
"referer_url" VARCHAR(500) NOT NULL,
|
||||
"os" VARCHAR(50) NOT NULL,
|
||||
"ip" VARCHAR(20) NOT NULL,
|
||||
"browser" VARCHAR(100) NOT NULL,
|
||||
"remark" VARCHAR(300) NOT NULL,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sessions" (
|
||||
"token" TEXT NOT NULL,
|
||||
"data" BYTEA NOT NULL,
|
||||
"expiry" TIMESTAMPTZ NOT NULL,
|
||||
PRIMARY KEY ("token")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_department" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"name" VARCHAR(200) NOT NULL,
|
||||
"parent_id" INT NOT NULL,
|
||||
"parent_path" VARCHAR(500) NOT NULL,
|
||||
"status" INT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_role" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"name" VARCHAR(200) NOT NULL,
|
||||
"display_name" VARCHAR(200) NOT NULL,
|
||||
"parent_id" INT NOT NULL,
|
||||
"parent_path" VARCHAR(500) NOT NULL,
|
||||
"vip" Boolean NOT NULL,
|
||||
"status" INT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_menu" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"name" VARCHAR(200) NOT NULL,
|
||||
"display_name" VARCHAR(200) NOT NULL,
|
||||
"url" VARCHAR(200) NOT NULL,
|
||||
"type" VARCHAR(50) NOT NULL,
|
||||
"parent_id" INT NOT NULL,
|
||||
"parent_path" VARCHAR(500) NOT NULL,
|
||||
"avatar" VARCHAR(100) NOT NULL,
|
||||
"style" VARCHAR(100) NOT NULL,
|
||||
"visible" Boolean NOT NULL,
|
||||
"is_list" Boolean NOT NULL,
|
||||
"status" INT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_role_menu" (
|
||||
"role_id" INT NOT NULL,
|
||||
"menu_id" INT NOT NULL,
|
||||
PRIMARY KEY ("role_id", "menu_id")
|
||||
);
|
||||
|
||||
CREATE TABLE "sys_config" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"key" VARCHAR(100) NOT NULL,
|
||||
"value" jsonb NOT NULL,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "categories" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"icon" VARCHAR(300) NOT NULL DEFAULT '',
|
||||
"description" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"letter" VARCHAR(100) NOT NULL DEFAULT '',
|
||||
"parent_id" INT NOT NULL DEFAULT 0,
|
||||
"parent_path" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "customers" (
|
||||
"id" BIGINT NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"category" INT NOT NULL DEFAULT 0,
|
||||
"source" INT NOT NULL DEFAULT 0,
|
||||
"address" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"contact_name" VARCHAR(100) NOT NULL DEFAULT '',
|
||||
"contact_phone" VARCHAR(50) NOT NULL DEFAULT '',
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_by" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_by" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "customer_contact" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"telephone" VARCHAR(50) NOT NULL,
|
||||
"customer_id" BIGINT NOT NULL,
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_by" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_by" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "projects" (
|
||||
"id" BIGINT NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"start_at" TIMESTAMPTZ NOT NULL,
|
||||
"end_at" TIMESTAMPTZ NOT NULL,
|
||||
"customer_id" BIGINT NOT NULL,
|
||||
"total_money" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"description" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"apply_at" TIMESTAMPTZ NOT NULL,
|
||||
"apply_user_id" INT NOT NULL,
|
||||
"manager_id" INT NOT NULL,
|
||||
"members" VARCHAR(1000) NOT NULL,
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_user_id" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_user_id" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "project_files" (
|
||||
"id" BIGINT NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"path" VARCHAR(500) NOT NULL,
|
||||
"project_id" BIGINT NOT NULL,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_user_id" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "budgets" (
|
||||
"id" BIGSERIAL NOT NULL,
|
||||
"project_id" BIGINT NOT NULL,
|
||||
"name" VARCHAR(100) NOT NULL,
|
||||
"budget_type" INT NOT NULL,
|
||||
"category" INT NOT NULL,
|
||||
"start_at" TIMESTAMPTZ NOT NULL,
|
||||
"end_at" TIMESTAMPTZ NOT NULL,
|
||||
"amount" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"used_amount" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"remaining_amount" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"remark" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"sort" INT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_user_id" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_user_id" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "incomes" (
|
||||
"id" BIGSERIAL NOT NULL,
|
||||
"project_id" BIGINT NOT NULL,
|
||||
"budget_id" BIGINT NOT NULL DEFAULT 0,
|
||||
"amount" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"income_at" TIMESTAMPTZ NOT NULL,
|
||||
"income_type" INT NOT NULL,
|
||||
"income_bank" INT NOT NULL,
|
||||
"remark" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_user_id" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_user_id" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE TABLE "expenses" (
|
||||
"id" BIGSERIAL NOT NULL,
|
||||
"project_id" BIGINT NOT NULL,
|
||||
"budget_id" BIGINT NOT NULL DEFAULT 0,
|
||||
"amount" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
"expenses_at" TIMESTAMPTZ NOT NULL,
|
||||
"expenses_type" INT NOT NULL,
|
||||
"remark" VARCHAR(500) NOT NULL DEFAULT '',
|
||||
"status" SMALLINT NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()),
|
||||
"created_user_id" INT NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'),
|
||||
"updated_user_id" INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_user" ("uuid");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_user" ("username");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_user" ("email");
|
||||
|
||||
CREATE INDEX ON "sys_user" ("status");
|
||||
|
||||
CREATE INDEX ON "sys_user_login_log" ("created_at");
|
||||
|
||||
CREATE INDEX ON "sys_user_login_log" ("email");
|
||||
|
||||
CREATE INDEX ON "sys_audit_log" ("created_at");
|
||||
|
||||
CREATE INDEX ON "sys_audit_log" ("email");
|
||||
|
||||
CREATE INDEX ON "sessions" ("expiry");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_department" ("name");
|
||||
|
||||
CREATE INDEX ON "sys_department" ("status");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_role" ("name");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_role" ("display_name");
|
||||
|
||||
CREATE INDEX ON "sys_role" ("status");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_menu" ("url");
|
||||
|
||||
CREATE INDEX ON "sys_menu" ("type");
|
||||
|
||||
CREATE INDEX ON "sys_menu" ("parent_id");
|
||||
|
||||
CREATE INDEX ON "sys_menu" ("status");
|
||||
|
||||
CREATE UNIQUE INDEX ON "sys_config" ("key");
|
||||
|
||||
CREATE INDEX ON "categories" ("name");
|
||||
|
||||
CREATE UNIQUE INDEX ON "categories" ("letter");
|
||||
|
||||
CREATE INDEX ON "customers" ("name");
|
||||
|
||||
CREATE INDEX ON "customer_contact" ("name");
|
||||
|
||||
CREATE INDEX ON "customer_contact" ("telephone");
|
||||
|
||||
CREATE INDEX ON "projects" ("name");
|
||||
|
||||
CREATE INDEX ON "project_files" ("name");
|
||||
|
||||
CREATE INDEX ON "budgets" ("project_id");
|
||||
|
||||
CREATE INDEX ON "budgets" ("category");
|
||||
|
||||
CREATE INDEX ON "incomes" ("project_id");
|
||||
|
||||
CREATE INDEX ON "incomes" ("budget_id");
|
||||
|
||||
CREATE INDEX ON "incomes" ("income_type");
|
||||
|
||||
CREATE INDEX ON "expenses" ("project_id");
|
||||
|
||||
CREATE INDEX ON "expenses" ("budget_id");
|
||||
|
||||
CREATE INDEX ON "expenses" ("expenses_type");
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."email" IS '邮箱地址';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."username" IS '用户名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."hashed_password" IS '加密密码';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."salt" IS '密码盐值';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."avatar" IS '头像';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."gender" IS '性别';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."department_id" IS '部门';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."role_id" IS '角色';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."change_password_at" IS '密码修改时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_user"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."email" IS '邮箱地址';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."is_success" IS '是否登陆成功';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."message" IS '登陆消息';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."referer_url" IS '上一个链接';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."url" IS '链接';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."os" IS '系统';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."ip" IS 'ip';
|
||||
|
||||
COMMENT ON COLUMN "sys_user_login_log"."browser" IS '浏览器';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."email" IS '邮箱地址';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."start_at" IS '请求开始时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."end_at" IS '请求结束时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."duration" IS '请求总时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."url" IS '请求链接';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."method" IS '请求类型';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."parameters" IS '请求参数';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."referer_url" IS '上一个链接';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."os" IS '系统';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."ip" IS 'ip';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."browser" IS '浏览器';
|
||||
|
||||
COMMENT ON COLUMN "sys_audit_log"."remark" IS '备注';
|
||||
|
||||
COMMENT ON COLUMN "sessions"."token" IS 'token';
|
||||
|
||||
COMMENT ON COLUMN "sessions"."data" IS 'data';
|
||||
|
||||
COMMENT ON COLUMN "sessions"."expiry" IS 'expiry';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."name" IS '部门名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."parent_id" IS '上级id';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."parent_path" IS '树路径';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_department"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."display_name" IS '显示名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."parent_id" IS '上级id';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."parent_path" IS '树路径';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."vip" IS '是否vip';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_role"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."display_name" IS '显示名称';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."url" IS '菜单url';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."type" IS '菜单类型(node, menu, btn)';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."parent_id" IS '上级id';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."parent_path" IS '树路径';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."avatar" IS '菜单图标';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."style" IS '菜单样式';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."visible" IS '是否可见';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."is_list" IS '是否列表';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_menu"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_role_menu"."role_id" IS '角色id';
|
||||
|
||||
COMMENT ON COLUMN "sys_role_menu"."menu_id" IS '菜单id';
|
||||
|
||||
COMMENT ON COLUMN "sys_config"."key" IS '存储键';
|
||||
|
||||
COMMENT ON COLUMN "sys_config"."value" IS '存储值';
|
||||
|
||||
COMMENT ON COLUMN "sys_config"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "sys_config"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "categories"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "categories"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "categories"."icon" IS '图标';
|
||||
|
||||
COMMENT ON COLUMN "categories"."description" IS '描述';
|
||||
|
||||
COMMENT ON COLUMN "categories"."letter" IS '拼音';
|
||||
|
||||
COMMENT ON COLUMN "categories"."parent_id" IS '父级ID';
|
||||
|
||||
COMMENT ON COLUMN "categories"."parent_path" IS '树路径';
|
||||
|
||||
COMMENT ON COLUMN "categories"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "categories"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "categories"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "categories"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "customers"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "customers"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "customers"."category" IS '类别';
|
||||
|
||||
COMMENT ON COLUMN "customers"."source" IS '来源';
|
||||
|
||||
COMMENT ON COLUMN "customers"."address" IS '地址';
|
||||
|
||||
COMMENT ON COLUMN "customers"."contact_name" IS '主要联系人';
|
||||
|
||||
COMMENT ON COLUMN "customers"."contact_phone" IS '主要联系人手机';
|
||||
|
||||
COMMENT ON COLUMN "customers"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "customers"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "customers"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "customers"."created_by" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "customers"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "customers"."updated_by" IS '更新人';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."telephone" IS '联系方式';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."customer_id" IS '客户ID';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."created_by" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "customer_contact"."updated_by" IS '更新人';
|
||||
|
||||
COMMENT ON COLUMN "projects"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "projects"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "projects"."start_at" IS '开始时间';
|
||||
|
||||
COMMENT ON COLUMN "projects"."end_at" IS '结束时间';
|
||||
|
||||
COMMENT ON COLUMN "projects"."customer_id" IS '客户ID';
|
||||
|
||||
COMMENT ON COLUMN "projects"."total_money" IS '总金额';
|
||||
|
||||
COMMENT ON COLUMN "projects"."description" IS '简介';
|
||||
|
||||
COMMENT ON COLUMN "projects"."apply_at" IS '申请时间';
|
||||
|
||||
COMMENT ON COLUMN "projects"."apply_user_id" IS '申请人';
|
||||
|
||||
COMMENT ON COLUMN "projects"."manager_id" IS '项目经理';
|
||||
|
||||
COMMENT ON COLUMN "projects"."members" IS '项目成员';
|
||||
|
||||
COMMENT ON COLUMN "projects"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "projects"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "projects"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "projects"."created_user_id" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "projects"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "projects"."updated_user_id" IS '更新人';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."path" IS '路径';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."project_id" IS '项目ID';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "project_files"."created_user_id" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."project_id" IS '项目ID';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."name" IS '名称';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."budget_type" IS '预算类型: 收入/支出';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."category" IS '类别';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."start_at" IS '开始时间';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."end_at" IS '结束时间';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."amount" IS '预算金额';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."used_amount" IS '已使用金额';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."remaining_amount" IS '剩余金额';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."remark" IS '备注';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."sort" IS '排序';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."created_user_id" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "budgets"."updated_user_id" IS '更新人';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."project_id" IS '项目ID';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."budget_id" IS '预算ID';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."amount" IS '收入金额';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."income_at" IS '收入时间';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."income_type" IS '收入类型';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."income_bank" IS '收入银行';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."remark" IS '备注';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."created_user_id" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "incomes"."updated_user_id" IS '更新人';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."id" IS 'ID';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."project_id" IS '项目ID';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."budget_id" IS '预算ID';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."amount" IS '支出金额';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."expenses_at" IS '支出时间';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."expenses_type" IS '支出类型';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."remark" IS '备注';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."status" IS '状态';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."created_at" IS '创建时间';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."created_user_id" IS '创建人';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."updated_at" IS '更新时间';
|
||||
|
||||
COMMENT ON COLUMN "expenses"."updated_user_id" IS '更新人';
|
||||
46
internal/erpserver/repository/seed/seed.go
Normal file
46
internal/erpserver/repository/seed/seed.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package seed
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"management/internal/erpserver/model/system"
|
||||
)
|
||||
|
||||
func Init(
|
||||
configRepository system.ConfigRepository,
|
||||
departmentRepository system.DepartmentRepository,
|
||||
roleRepository system.RoleRepository,
|
||||
userRepository system.UserRepository,
|
||||
menuRepository system.MenuRepository,
|
||||
) error {
|
||||
ctx := context.Background()
|
||||
|
||||
// 后台pear配置
|
||||
if err := configRepository.Initialize(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 部门
|
||||
err := departmentRepository.Initialize(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 角色
|
||||
role, err := roleRepository.Initialize(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 用户
|
||||
if err := userRepository.Initialize(ctx, 0, role.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 菜单
|
||||
if err = menuRepository.Initialize(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/drhin/logger"
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
gl "gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
type txCtxKey struct{}
|
||||
@@ -59,15 +60,19 @@ func NewDB(log *logger.Logger, config *config.Config) (*gorm.DB, func(), error)
|
||||
config.DB.DBName,
|
||||
config.DB.Port,
|
||||
)
|
||||
db, err := gorm.Open(postgres.New(postgres.Config{
|
||||
pgConfig := postgres.Config{
|
||||
DSN: dsn,
|
||||
PreferSimpleProtocol: true, // disables implicit prepared statement usage
|
||||
}), &gorm.Config{})
|
||||
}
|
||||
db, err := gorm.Open(postgres.New(pgConfig), &gorm.Config{
|
||||
Logger: getGormLogger(config),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
db = db.Debug()
|
||||
// db.Debug 会默认显示日志
|
||||
//db = db.Debug()
|
||||
|
||||
// Connection Pool config
|
||||
sqlDB, err := db.DB()
|
||||
@@ -75,9 +80,24 @@ func NewDB(log *logger.Logger, config *config.Config) (*gorm.DB, func(), error)
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
sqlDB.SetMaxIdleConns(10)
|
||||
sqlDB.SetMaxOpenConns(100)
|
||||
sqlDB.SetConnMaxLifetime(time.Hour)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
|
||||
if err := sqlDB.PingContext(ctx); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
// 设置最大空闲连接数(默认 2)
|
||||
sqlDB.SetMaxIdleConns(config.DB.MaxIdleConns)
|
||||
|
||||
// 设置最大打开连接数(默认 0 无限制)
|
||||
sqlDB.SetMaxOpenConns(config.DB.MaxOpenConns)
|
||||
|
||||
// 设置连接最大存活时间
|
||||
sqlDB.SetConnMaxLifetime(config.DB.ConnMaxLifetime)
|
||||
|
||||
// 设置连接最大空闲时间
|
||||
sqlDB.SetConnMaxIdleTime(config.DB.ConnMaxIdleTime)
|
||||
|
||||
cleanup := func() {
|
||||
if err := sqlDB.Close(); err != nil {
|
||||
@@ -88,6 +108,13 @@ func NewDB(log *logger.Logger, config *config.Config) (*gorm.DB, func(), error)
|
||||
return db, cleanup, nil
|
||||
}
|
||||
|
||||
func getGormLogger(config *config.Config) gl.Interface {
|
||||
if config.DB.LogMode {
|
||||
return gl.Default.LogMode(gl.Info) // 开发环境显示日志
|
||||
}
|
||||
return gl.Default.LogMode(gl.Silent)
|
||||
}
|
||||
|
||||
//var (
|
||||
// once sync.Once
|
||||
// // 全局变量,方便其它包直接调用已初始化好的 datastore 实例.
|
||||
|
||||
@@ -2,10 +2,15 @@ package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"management/internal/erpserver/model/dto"
|
||||
"management/internal/erpserver/model/system"
|
||||
"management/internal/erpserver/repository"
|
||||
"management/internal/pkg/database"
|
||||
"management/internal/pkg/know/pearadmin"
|
||||
|
||||
"gorm.io/datatypes"
|
||||
)
|
||||
|
||||
type configRepository struct {
|
||||
@@ -18,6 +23,26 @@ func NewConfigRepository(repo *repository.Repository) system.ConfigRepository {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *configRepository) Initialize(ctx context.Context) error {
|
||||
_, err := r.GetByKey(ctx, pearadmin.PearKey)
|
||||
if err != nil {
|
||||
if database.IsNoRows(err) {
|
||||
b, e := json.Marshal(pearadmin.PearJson)
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
|
||||
s := system.Config{
|
||||
Key: pearadmin.PearKey,
|
||||
Value: datatypes.JSON(b),
|
||||
}
|
||||
return r.Create(ctx, &s)
|
||||
}
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *configRepository) Create(ctx context.Context, obj *system.Config) error {
|
||||
return r.repo.DB(ctx).Create(obj).Error
|
||||
}
|
||||
@@ -44,6 +69,15 @@ func (r *configRepository) GetByKey(ctx context.Context, key string) (*system.Co
|
||||
return &obj, nil
|
||||
}
|
||||
|
||||
func (r *configRepository) GetValueByKey(ctx context.Context, key string) ([]byte, error) {
|
||||
var obj system.Config
|
||||
err := r.repo.DB(ctx).Where("key = ?", key).First(&obj).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj.Value, nil
|
||||
}
|
||||
|
||||
func (r *configRepository) List(ctx context.Context, q dto.SearchDto) ([]*system.Config, int64, error) {
|
||||
query := r.repo.DB(ctx).
|
||||
Model(&system.Config{}).
|
||||
|
||||
@@ -2,6 +2,7 @@ package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"management/internal/erpserver/model/dto"
|
||||
"management/internal/erpserver/model/system"
|
||||
@@ -18,6 +19,26 @@ func NewDepartmentRepository(repo *repository.Repository) system.DepartmentRepos
|
||||
}
|
||||
}
|
||||
|
||||
func (r *departmentRepository) Initialize(ctx context.Context) error {
|
||||
var count int64
|
||||
if err := r.repo.DB(ctx).Model(&system.Department{}).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count == 0 {
|
||||
obj := system.Department{
|
||||
Name: "公司",
|
||||
ParentID: 0,
|
||||
ParentPath: ",0,",
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
return r.Create(ctx, &obj)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *departmentRepository) Create(ctx context.Context, obj *system.Department) error {
|
||||
return r.repo.DB(ctx).Create(obj).Error
|
||||
}
|
||||
|
||||
@@ -22,17 +22,18 @@ func (s *loginLogRepository) Create(ctx context.Context, obj *system.LoginLog) e
|
||||
return s.repo.DB(ctx).Create(obj).Error
|
||||
}
|
||||
|
||||
func (s *loginLogRepository) GetLatest(ctx context.Context, email string) (*system.LoginLog, error) {
|
||||
var log system.LoginLog
|
||||
func (s *loginLogRepository) GetLatest(ctx context.Context, email string) ([]*system.LoginLog, error) {
|
||||
var logs []*system.LoginLog
|
||||
err := s.repo.DB(ctx).
|
||||
Where("email = ?", email).
|
||||
Order("id DESC").
|
||||
First(&log).
|
||||
Limit(2).
|
||||
Find(&logs).
|
||||
Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &log, nil
|
||||
return logs, nil
|
||||
}
|
||||
|
||||
func (s *loginLogRepository) List(ctx context.Context, q dto.SearchDto) ([]*system.LoginLog, int64, error) {
|
||||
|
||||
@@ -17,8 +17,12 @@ func NewMenuRepository(repo *repository.Repository) system.MenuRepository {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *menuRepository) Create(ctx context.Context, obj *system.Menu) error {
|
||||
return r.repo.DB(ctx).Create(obj).Error
|
||||
func (r *menuRepository) Create(ctx context.Context, obj *system.Menu) (*system.Menu, error) {
|
||||
err := r.repo.DB(ctx).Create(obj).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj, nil
|
||||
}
|
||||
|
||||
func (r *menuRepository) Update(ctx context.Context, obj *system.Menu) error {
|
||||
|
||||
828
internal/erpserver/repository/system/menu_seed.go
Normal file
828
internal/erpserver/repository/system/menu_seed.go
Normal file
@@ -0,0 +1,828 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"management/internal/erpserver/model/system"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (r *menuRepository) Initialize(ctx context.Context) error {
|
||||
var count int64
|
||||
if err := r.repo.DB(ctx).Model(&system.Menu{}).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count > 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
sys, err := r.Create(ctx, &system.Menu{
|
||||
Name: "系统管理",
|
||||
DisplayName: "系统管理",
|
||||
Url: uuid.Must(uuid.NewRandom()).String(),
|
||||
Type: "node",
|
||||
ParentID: 0,
|
||||
ParentPath: ",0,",
|
||||
Avatar: "layui-icon layui-icon-set",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
accountPermission, err := r.Create(ctx, &system.Menu{
|
||||
Name: "账户权限",
|
||||
DisplayName: "账户权限",
|
||||
Url: uuid.Must(uuid.NewRandom()).String(),
|
||||
Type: "node",
|
||||
ParentID: sys.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", sys.ParentPath, sys.ID),
|
||||
Avatar: "layui-icon layui-icon-vercode",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
systemMenu, err := r.Create(ctx, &system.Menu{
|
||||
Name: "菜单管理",
|
||||
DisplayName: "菜单管理",
|
||||
Url: "/system/menu/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
systemRole, err := r.Create(ctx, &system.Menu{
|
||||
Name: "角色管理",
|
||||
DisplayName: "角色管理",
|
||||
Url: "/system/role/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
systemDepartment, err := r.Create(ctx, &system.Menu{
|
||||
Name: "部门管理",
|
||||
DisplayName: "部门管理",
|
||||
Url: "/system/department/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
systemUser, err := r.Create(ctx, &system.Menu{
|
||||
Name: "用户管理",
|
||||
DisplayName: "用户管理",
|
||||
Url: "/system/user/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "登陆日志",
|
||||
DisplayName: "登陆日志",
|
||||
Url: "/system/login_log/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "审计日志",
|
||||
DisplayName: "审计日志",
|
||||
Url: "/system/audit_log/list",
|
||||
Type: "menu",
|
||||
ParentID: accountPermission.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 菜单
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增",
|
||||
DisplayName: "新增",
|
||||
Url: "/system/menu/add",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增子菜单",
|
||||
DisplayName: "新增子菜单",
|
||||
Url: "/system/menu/add_children",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "编辑",
|
||||
DisplayName: "编辑",
|
||||
Url: "/system/menu/edit",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "layui-icon layui-icon-edit",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "保存",
|
||||
DisplayName: "保存",
|
||||
Url: "/system/menu/save",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "layui-icon layui-icon-ok",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "数据",
|
||||
DisplayName: "数据",
|
||||
Url: "/system/menu/data",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "刷新",
|
||||
DisplayName: "刷新",
|
||||
Url: "/system/menu/refresh_cache",
|
||||
Type: "btn",
|
||||
ParentID: systemMenu.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 角色
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增",
|
||||
DisplayName: "新增",
|
||||
Url: "/system/role/add",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "编辑",
|
||||
DisplayName: "编辑",
|
||||
Url: "/system/role/edit",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-edit",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "保存",
|
||||
DisplayName: "保存",
|
||||
Url: "/system/role/save",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-ok",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "数据",
|
||||
DisplayName: "数据",
|
||||
Url: "/system/role/data",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "刷新",
|
||||
DisplayName: "刷新",
|
||||
Url: "/system/role/refresh",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "重建父路径",
|
||||
DisplayName: "重建父路径",
|
||||
Url: "/system/role/rebuild_parent_path",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-danger pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "权限刷新",
|
||||
DisplayName: "权限刷新",
|
||||
Url: "/system/role/refresh_role_menus",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "设置权限",
|
||||
DisplayName: "设置权限",
|
||||
Url: "/system/role/set_menu",
|
||||
Type: "btn",
|
||||
ParentID: systemRole.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID),
|
||||
Avatar: "layui-icon layui-icon-set",
|
||||
Style: "pear-btn-danger pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 部门
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增",
|
||||
DisplayName: "新增",
|
||||
Url: "/system/department/add",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增子部门",
|
||||
DisplayName: "新增子部门",
|
||||
Url: "/system/department/add_children",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "编辑",
|
||||
DisplayName: "编辑",
|
||||
Url: "/system/department/edit",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-edit",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "保存",
|
||||
DisplayName: "保存",
|
||||
Url: "/system/department/save",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-ok",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "数据",
|
||||
DisplayName: "数据",
|
||||
Url: "/system/department/data",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "刷新",
|
||||
DisplayName: "刷新",
|
||||
Url: "/system/department/refresh",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "重建父路径",
|
||||
DisplayName: "重建父路径",
|
||||
Url: "/system/department/rebuild_parent_path",
|
||||
Type: "btn",
|
||||
ParentID: systemDepartment.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-danger pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 用户
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增",
|
||||
DisplayName: "新增",
|
||||
Url: "/system/user/add",
|
||||
Type: "btn",
|
||||
ParentID: systemUser.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "编辑",
|
||||
DisplayName: "编辑",
|
||||
Url: "/system/user/edit",
|
||||
Type: "btn",
|
||||
ParentID: systemUser.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID),
|
||||
Avatar: "layui-icon layui-icon-edit",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "基本资料",
|
||||
DisplayName: "基本资料",
|
||||
Url: "/system/user/profile",
|
||||
Type: "btn",
|
||||
ParentID: systemUser.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "保存",
|
||||
DisplayName: "保存",
|
||||
Url: "/system/user/save",
|
||||
Type: "btn",
|
||||
ParentID: systemUser.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID),
|
||||
Avatar: "layui-icon layui-icon-ok",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 基础数据
|
||||
basicData, err := r.Create(ctx, &system.Menu{
|
||||
Name: "基础数据",
|
||||
DisplayName: "基础数据",
|
||||
Url: uuid.Must(uuid.NewRandom()).String(),
|
||||
Type: "node",
|
||||
ParentID: sys.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", sys.ParentPath, sys.ID),
|
||||
Avatar: "layui-icon layui-icon-vercode",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 系统配置
|
||||
systemConfig, err := r.Create(ctx, &system.Menu{
|
||||
Name: "系统属性",
|
||||
DisplayName: "系统属性",
|
||||
Url: "/system/config/list",
|
||||
Type: "menu",
|
||||
ParentID: basicData.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", basicData.ParentPath, basicData.ID),
|
||||
Avatar: "",
|
||||
Style: "",
|
||||
Visible: true,
|
||||
IsList: true,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "新增",
|
||||
DisplayName: "新增",
|
||||
Url: "/system/config/add",
|
||||
Type: "btn",
|
||||
ParentID: systemConfig.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID),
|
||||
Avatar: "layui-icon layui-icon-add-1",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "编辑",
|
||||
DisplayName: "编辑",
|
||||
Url: "/system/config/edit",
|
||||
Type: "btn",
|
||||
ParentID: systemConfig.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID),
|
||||
Avatar: "layui-icon layui-icon-edit",
|
||||
Style: "pear-btn-primary pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "保存",
|
||||
DisplayName: "保存",
|
||||
Url: "/system/config/save",
|
||||
Type: "btn",
|
||||
ParentID: systemConfig.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID),
|
||||
Avatar: "layui-icon layui-icon-ok",
|
||||
Style: "pear-btn-primary pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "重置Pear",
|
||||
DisplayName: "重置Pear",
|
||||
Url: "/system/config/reset_pear",
|
||||
Type: "btn",
|
||||
ParentID: systemConfig.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-danger pear-btn-sm",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = r.Create(ctx, &system.Menu{
|
||||
Name: "刷新",
|
||||
DisplayName: "刷新",
|
||||
Url: "/system/config/refresh",
|
||||
Type: "btn",
|
||||
ParentID: systemConfig.ID,
|
||||
ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID),
|
||||
Avatar: "layui-icon layui-icon-refresh",
|
||||
Style: "pear-btn-xs",
|
||||
Visible: true,
|
||||
IsList: false,
|
||||
Status: 0,
|
||||
Sort: 6666,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -2,6 +2,8 @@ package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"management/internal/erpserver/model/dto"
|
||||
"management/internal/erpserver/model/system"
|
||||
@@ -18,6 +20,50 @@ func NewRoleRepository(repo *repository.Repository) system.RoleRepository {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *roleRepository) Initialize(ctx context.Context) (*system.Role, error) {
|
||||
var count int64
|
||||
if err := r.repo.DB(ctx).Model(&system.Role{}).Count(&count).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if count == 0 {
|
||||
obj := system.Role{
|
||||
Name: "Company",
|
||||
DisplayName: "公司",
|
||||
Vip: false,
|
||||
ParentID: 0,
|
||||
ParentPath: ",0,",
|
||||
Status: 0,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
if err := r.Create(ctx, &obj); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
obj1 := system.Role{
|
||||
Name: "SuperAdmin",
|
||||
DisplayName: "超级管理员",
|
||||
Vip: true,
|
||||
ParentID: obj.ID,
|
||||
ParentPath: fmt.Sprintf(",0,%d,", obj.ID),
|
||||
Status: 0,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
if err := r.Create(ctx, &obj1); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &obj1, nil
|
||||
}
|
||||
|
||||
var role system.Role
|
||||
err := r.repo.DB(ctx).Where("vip = ?", true).First(&role).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &role, nil
|
||||
}
|
||||
|
||||
func (r *roleRepository) Create(ctx context.Context, obj *system.Role) error {
|
||||
return r.repo.DB(ctx).Create(obj).Error
|
||||
}
|
||||
|
||||
@@ -2,10 +2,15 @@ package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"management/internal/erpserver/model/dto"
|
||||
"management/internal/erpserver/model/system"
|
||||
"management/internal/erpserver/repository"
|
||||
"management/internal/pkg/crypto"
|
||||
"management/internal/pkg/rand"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type userRepository struct {
|
||||
@@ -18,6 +23,49 @@ func NewUserRepository(repo *repository.Repository) system.UserRepository {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *userRepository) Initialize(ctx context.Context, departId, roleId int32) error {
|
||||
var count int64
|
||||
if err := s.repo.DB(ctx).Model(&system.User{}).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count == 0 {
|
||||
salt, err := rand.String(10)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
password := "secret"
|
||||
hashedPassword, err := crypto.BcryptHashPassword(password + salt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
initTime, err := time.ParseInLocation(time.DateTime, "0001-01-01 00:00:00", time.Local)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user := system.User{
|
||||
Uuid: uuid.Must(uuid.NewV7()),
|
||||
Email: "1185230223@qq.com",
|
||||
Username: "kenneth",
|
||||
HashedPassword: hashedPassword,
|
||||
Salt: salt,
|
||||
Avatar: "/statics/admin/images/avatar.jpg",
|
||||
Gender: 1,
|
||||
DepartmentID: departId,
|
||||
RoleID: roleId,
|
||||
Status: 0,
|
||||
ChangePasswordAt: initTime,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
return s.Create(ctx, &user)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *userRepository) Create(ctx context.Context, obj *system.User) error {
|
||||
return s.repo.DB(ctx).Create(obj).Error
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user