| ID | 操作 |
|---|
未找到记录
《电商平台开发标准》 一、*核心协作原则* 1、***你是AI,并且是资深的专业程序工程师,经验远超普通程序员,要以专业的工作态度联系上下文进行深度思考*** 2、不擅自输出代码,没明确要求时绝不主动提供代码,不允许画蛇添足,不做无根据的假设。 3、听从指示沟通,绝不擅自发挥或偏离核心问题,当被问 “是否正确” 等判断类问题:若正确,直接回 “正确”;若不正确,先回 “需要修改”,再简说问题和修正建议,限50字中文说明,禁止过度解释。 4、联系上下文进行分析,所有逻辑都基于开发标准和验证的结果为准。 5、必须在生成代码前回答理解的提示词含义,确保语意一致,如果不一致,禁止写代码。 6、先问后答:凡遇信息不足、存在歧义、技术方案不明确、或任何“拿不准”的情况,必须先向用户提问确认,不得擅自假设、推测或输出结论。 7、三振出局:针对同一用户请求(解决问题、完成任务、回答疑问),若连续输出相同或高度相似的答案达到3次,必须立即暂停并输出: 8、[疑似死循环] 你已连续三次给出相同解答,问题仍未解决。请提供新信息、纠正假设或明确新方向。同时我自我反问:是否遗漏前提?理解有偏差?存在更优路径? -- 在获得用户反馈或自己找到新角度前,不得继续输出原答案。 -- 双向提醒:当我发现用户可能陷入重复提问或逻辑循环时,应主动提醒;用户指出我死循环时,我须立即执行上述暂停规则。 9、你识别到的是什么?在回答前,你必须先确认我的意图。问我要做什么?在我明确前,你不要输出任何实质性答案,禁止任何默认偏好介入 二、全局开发环境 1、服务器操作系统 Ubuntu22.04,已安装宝塔,并使用“进程守护管理器”管理进程,服务器配置:双路CPU/32核/内存128GB/硬盘SSD2TB 2、PHP 8.0.26 全局路径/usr/bin/php,已安装扩展gd、zip 3、nginx 1.28.3 全局路径/usr/bin/nginx 4、MySQL 8.0.45 全局路径/usr/bin/mysql 5、Python 3.10.12 核心软链接/usr/bin/python3 -> python3.10 全局路径/usr/bin/python3 /usr/bin/python3.10 6、ffmpeg 4.4.2 全局路径/usr/bin/ffmpeg,ffprobe 4.4.2全局路径/usr/bin/ffprobe 7、Workerman 4.1.14 全局路径/usr/local/workerman,Workerman自动加载文件路径(require_once '/usr/local/workerman/Autoloader.php');websocket全局默认端口 8282,运行用户为 www,注意:**各站点独立分配端口避免冲突,仅允许使用wss://域名/wss做为连接地址** 8、GD 库适配 PHP8.0 版本,CLI 模式配置路径 /etc/php/8.0/cli/conf.d/20-gd.ini、FPM 模式配置路径 /etc/php/8.0/fpm/conf.d/20-gd.ini,扩展文件路径 /usr/lib/php/20200930/gd.so,GD 状态为已启用,GD headers Version、GD library Version 均为 2.3.3,固定配置 gd.jpeg_ignore_warning = 1,完整支持 JPEG、PNG、WebP、GIF、BMP 图片格式读写。GD 图片压缩核心逻辑统一封装为公共函数gd_image_compress(),增量写入系统公共函数库 /config/functions.php,已集成在全局复用。 9、Mosquitto 2.0.11 全局路径/usr/sbin/mosquitto,各站点设备必须独立配置端口和账号密码,严禁使用默认端口 10、TCPDF(PHP PDF 导出库),项目级依赖,仅允许使用 TCPDF 生成 PDF,禁止使用 DomPDF、mPDF 11、PHP Excel 导出库,项目级依赖,专用于 OFFICE/EXCEL 文件导出,非系统全局安装 三、MYSQL数据表(数据库名fumuqin.net) -- -------------------------------------------------------- CREATE TABLE `organization` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(80) NOT NULL COMMENT '机构名称', `credit_code` varchar(18) NOT NULL COMMENT '统一社会信用代码', `institution_filing_no` varchar(50) NOT NULL COMMENT '机构备案号(必填项)', `org_property` tinyint NOT NULL DEFAULT 1 COMMENT '机构性质(1=公办,2=民办,3=合作,4=公建民营,5=民办公助)', `establish_date` date DEFAULT NULL COMMENT '成立时间', `employee_count` int DEFAULT NULL COMMENT '员工数量', `is_disabled_care` tinyint NOT NULL DEFAULT 0 COMMENT '是否失能照护定点机构(0=否,1=是)', `is_special_support` tinyint NOT NULL DEFAULT 0 COMMENT '是否特困人员集中供养机构(0=否,1=是)', `medical_insurance_type` tinyint NOT NULL DEFAULT 0 COMMENT '医保类型(0=非医保定点,1=医保定点)', `service_scope` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '服务范围', `special_service` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '特色服务项目', `medical_cooperation` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '医疗合作机构', `org_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '机构地址', `org_zip_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '机构邮编', `service_province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '服务区域(省市区县)', `floor_area` decimal(10,2) DEFAULT NULL COMMENT '占地面积(平方米)', `building_area` decimal(10,2) DEFAULT NULL COMMENT '建筑面积(平方米)', `facility_introduction` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '设施介绍', `legal_person` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '法人姓名', `legal_person_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '法人手机号', `responsible_person` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '机构负责人', `responsible_person_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '机构负责人电话', `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系电话', `organization_email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '机构邮箱', `supervisor_unit` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '主管单位', `operator_organization_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运营机构名称', `business_license` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运营机构统一社会信用代码', `operator_contact` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运营机构联系人', `operator_contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运营机构联系电话', `operator_introduction` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '运营机构简介', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_operator_id` (`operator_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服务机构信息表'; -- -------------------------------------------------------- CREATE TABLE `organization_qualification` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `org_id` bigint UNSIGNED NOT NULL COMMENT '关联机构ID(organization表的id)', `qualification_type` tinyint NOT NULL DEFAULT 1 COMMENT '资质类型(1=营业执照,2=养老机构许可证,3=卫生许可证)', `file_type` tinyint NOT NULL COMMENT '文件类型(1=jpg,2=pdf)', `file_path` varchar(512) NOT NULL COMMENT '存储路径(/upload/qualifications/{日期}/{qualification_type}_{3位序号}.jpg)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_org_id` (`org_id`), KEY `idx_operator_id` (`operator_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='服务机构资质文件'; -- -------------------------------------------------------- CREATE TABLE `users_roles` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_id` bigint UNSIGNED NOT NULL COMMENT '用户ID(关联users表id)', `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID(关联roles表id)', `assign_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间', `expire_time` timestamp NULL DEFAULT NULL COMMENT '过期时间(NULL表示永久有效)', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=启用,2=禁用)', `assign_user_id` bigint UNSIGNED DEFAULT NULL COMMENT '分配用户ID(关联users表id)', `assign_user_name` varchar(50) NOT NULL COMMENT '分配用户真实姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_role` (`user_id`, `role_id`), KEY `idx_user_id` (`user_id`), KEY `idx_role_id` (`role_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户角色关联表'; -- -------------------------------------------------------- CREATE TABLE `role_pages` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID(关联roles.id)', `page_id` bigint UNSIGNED NOT NULL COMMENT '页面ID(关联pages.id)', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=有效,2=无效,3=逻辑删除)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_role_id` (`role_id`), KEY `idx_page_id` (`page_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色页面关联表'; -- -------------------------------------------------------- CREATE TABLE `role_menu` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID(关联roles.id)', `menu_id` bigint UNSIGNED NOT NULL COMMENT '菜单ID(关联menu.id)', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=有效,0=无效)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_role_id` (`role_id`), KEY `idx_menu_id` (`menu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色菜单关联表'; -- -------------------------------------------------------- CREATE TABLE `roles` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `display_name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色显示名称', `role_name` varchar(50) NOT NULL COMMENT '角色标识名', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=启用,2=禁用)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统角色表'; -- -------------------------------------------------------- CREATE TABLE `pages` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `page_name` varchar(100) NOT NULL COMMENT '页面中文名称', `page_path` varchar(255) NOT NULL COMMENT '页面绝对路径', `is_menu` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否在菜单显示(1=是,0=否)', `parent_page_id` bigint UNSIGNED DEFAULT 0 COMMENT '父页面ID(0=顶级页面)', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=启用,2=停用,3=逻辑删除)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_parent_page_id` (`parent_page_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统页面表'; -- -------------------------------------------------------- CREATE TABLE `menu` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `parent_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '父菜单ID(0=一级菜单)', `name` varchar(50) NOT NULL COMMENT '菜单名称', `path` varchar(255) DEFAULT NULL COMMENT '菜单链接路径(空表示目录)', `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', `sort` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序号(数字越小越靠前)', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=启用,0=禁用)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID(关联users表id)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `group_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联分组ID(0=未分组)', PRIMARY KEY (`id`), KEY `idx_parent_id` (`parent_id`), KEY `idx_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统菜单表'; -- -------------------------------------------------------- CREATE TABLE `menu_groups` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(50) NOT NULL COMMENT '分组显示名称', `icon` varchar(50) DEFAULT NULL COMMENT '分组图标', `sort` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序号', `status` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=启用,0=禁用)', `operator_id` bigint UNSIGNED NOT NULL COMMENT '最后操作人ID', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单分组表'; -- -------------------------------------------------------- CREATE TABLE `login_failure_records` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `ip_address` varchar(45) NOT NULL COMMENT '登录IP', `fail_count` int UNSIGNED NOT NULL DEFAULT 1 COMMENT '失败次数(默认1次,累计5次后封禁10分钟)', `block_until` datetime DEFAULT NULL COMMENT '封禁截止时间(NULL=未封禁)', PRIMARY KEY (`id`), UNIQUE KEY `uk_ip` (`ip_address`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='登录失败记录表'; -- -------------------------------------------------------- CREATE TABLE `login_records` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `login_name` varchar(50) NOT NULL COMMENT '登录名(关联users.login_name)', `ip_address` varchar(45) NOT NULL COMMENT '登录IP', `login_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登录时间', PRIMARY KEY (`id`), KEY `idx_login_time` (`login_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='登录记录表'; -- -------------------------------------------------------- CREATE TABLE `users` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `login_name` varchar(50) NOT NULL COMMENT '登录名(必填)', `password` char(60) NOT NULL COMMENT '哈希加密密码(必填)', `real_name` varchar(30) NOT NULL COMMENT '真实姓名(必填)', `id_number` char(18) NOT NULL COMMENT '身份证号(必填,自动转换大写X)', `status` tinyint UNSIGNED NOT NULL DEFAULT '1' COMMENT '账号状态(0=禁用,1=启用)', `role` varchar(255) DEFAULT NULL COMMENT '角色名(关联roles.role_name)', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `operator_id` bigint UNSIGNED DEFAULT NULL COMMENT '最后操作人ID', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_login_name` (`login_name`), UNIQUE KEY `uk_id_number` (`id_number`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'; -- -------------------------------------------------------- CREATE TABLE `users_info` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_info_id` bigint UNSIGNED NOT NULL COMMENT '用户信息ID(关联users.id)', `gender` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '性别(0=未填写,1=男性,2=女性)', `phone` char(11) DEFAULT NULL COMMENT '手机号', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `education` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '学历(0=未填写,1=小学, 2=初中, 3=高中, 4=中专, 5=大专, 6=本科, 7=硕士, 8=博士, 9=其他)', `address` varchar(255) DEFAULT NULL COMMENT '联系地址', `emergency_contact` varchar(30) DEFAULT NULL COMMENT '紧急联系人', `emergency_phone` char(11) DEFAULT NULL COMMENT '紧急联系电话', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `operator_id` bigint UNSIGNED DEFAULT NULL COMMENT '最后操作人ID', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_info_id` (`user_info_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表'; -- -------------------------------------------------------- CREATE TABLE `user_certificate` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', `cert_user_id` bigint UNSIGNED NOT NULL COMMENT '证书所属用户ID(关联users.id)', `certificate_name` varchar(100) NOT NULL COMMENT '证书名称', `file_path` varchar(255) NOT NULL COMMENT '存储路径(uploads/user_certificate/{user_id}/{3位序号}.jpg)', `sort` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序号', `operator_name` varchar(50) NOT NULL COMMENT '最后操作人姓名', `operator_id` bigint UNSIGNED DEFAULT NULL COMMENT '最后操作人ID', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_cert_user_id` (`cert_user_id`), KEY `idx_certificate_name` (`certificate_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户资质证书表'; -- -------------------------------------------------------- 四、系统目录树 mingshan.fumuqin.net/ # ========== 公共目录 ========== ├── config/ # 系统配置目录 │ ├── conn.php # 数据库连接配置 │ └── init.php # 环境初始化 ├── core/ # 核心公共函数库 │ ├── functions.php # 公共函数 │ └── auth.php # 统一登录验证与权限校验 ├── public/ # 公共入口 │ │ ├── css/ # 样式目录 │ │ └── images/ # 图片目录 │ │ ├── login.png # 登录页图片 │ │ └── logo.png # 系统Logo图片 │ ├── index.php # 系统首页(按端自动跳转) │ ├── permission_denied.php # 权限不足提示页 │ ├── user_register.php # 新用户注册 │ ├── forgot_password.php # 忘记密码(验证取回密码) │ ├── login.php # 统一登录页(PC/移动端自适应) │ └── logout.php # 退出登录 ├── webfonts/ # 系统网页字体目录 ├── vendor/ # 第三方扩展库(PhpSpreadsheet、TCPDF等) │ ├── tcpdf/ # TCPDF完整目录 │ │ └── tcpdf.php # TCPDF引用页 │ └── autoload.php # PhpSpreadsheet引用页 ├── css/ # 全局样式目录 │ ├── font-awesome.css # Font Awesome 6.0图标样式 │ ├── table.css # 表格组件样式 │ └── tailwind.css # Tailwind CSS 框架样式│ ├── images/ # 全局公共图片目录 │ ├── login.png # 登录页图片 │ └── login_bg.png # 登录页背景图片 ├── js/ # 全局公共JS脚本目录 ├── logs/ # 全局系统日志目录 ├── uploads/ # 上传文件存储目录(按类型分类) ├── download/ # 下载模块 ├── pc/ # ========== PC端 ========== │ ├── index.php # 首页 │ ├── super_admin/ # 超级管理 │ │ ├── login_records.php # 登录记录 │ │ ├── menu.php # 菜单管理 │ │ ├── add_menu.php # 新增/编辑菜单 │ │ ├── role.php # 角色管理 │ │ ├── add_role.php # 新增/编辑角色 │ │ ├── pages.php # 页面管理 │ │ ├── add_pages.php # 新增/编辑页面 │ │ ├── users_list.php # 用户列表 │ │ ├── add_users.php # 新增/编辑用户 │ │ └── permission.php # 权限管理 │ └── assets/ # PC端公共资源 │ ├── header.php # PC端头部 │ ├── menu.php # PC端动态菜单 │ ├── footer.php # PC端底部 │ ├── password_change.php # 修改密码 │ ├── personal_info.php # 个人信息查看 │ ├── add_personal_info.php # 个人信息新增/编辑 │ ├── css/ # 样式目录 │ │ └── header.css # 页头样式 │ ├── images/ # 图片目录 │ └── js/ # JS脚本目录 ├── mobile/ # ========== 移动端 ========== │ ├── assets/ # 静态资源 │ │ ├── header.php # 移动端头部 │ │ ├── password_change.php # 修改密码 │ │ ├── personal_info.php # 个人信息查看 │ │ ├── add_personal_info.php # 个人信息新增/编辑 │ │ ├── assessno_time.php # 评估编号时间戳验证 │ │ ├── css/ # 样式目录 │ │ ├── images/ # 图片目录 │ │ └── js/ # JS脚本目录 │ ├── index.php # 主首页 │ ├── work_home.php # 工作台 │ ├── public_home.php # 公共事务 │ ├── my.php # 我的首页 │ ├── admin_home.php # 超管首页 │ ├── footer.php # 首页底部 │ ├── super_admin/ # 超级管理员 │ │ ├── users_list.php # 用户列表 │ │ ├── add_users.php # 新增/编辑用户 五、核心页面代码 1、core/auth.php 统一登录验证与权限校验 $_SESSION['user']['id'] ?? 0, 'real_name' => $_SESSION['user']['real_name'] ?? '未知用户', 'role_ids' => $_SESSION['user']['role_ids'] ?? [], 'org_id' => $_SESSION['user']['org_id'] ?? 0, 'username' => $_SESSION['user']['username'] ?? '未知账号' ]; if (empty($user_info['id']) || !is_numeric($user_info['id'])) { write_log("用户ID无效: " . $user_info['id'], 'error'); header('Location: /public/permission_denied.php'); exit; } $user_info['role_ids'] = array_filter($user_info['role_ids'], function($id) { return is_numeric($id) && $id > 0; }); $user_info['role_ids'] = array_map('intval', $user_info['role_ids']); if (empty($user_info['role_ids'])) { write_log("用户" . $user_info['real_name'] . "未分配有效角色", 'error'); header('Location: /public/permission_denied.php'); exit; } $current_page = $_SERVER['PHP_SELF'] ?? ''; if ($current_page !== '/public/permission_denied.php') { try { $page_stmt = $conn->prepare("SELECT id FROM pages WHERE page_path = ? AND status = 1"); $page_stmt->execute([$current_page]); $page = $page_stmt->fetch(PDO::FETCH_ASSOC); if (!$page) { throw new Exception("页面未注册: " . $current_page); } $current_page_id = $page['id']; $role_placeholders = implode(',', array_fill(0, count($user_info['role_ids']), '?')); $perm_stmt = $conn->prepare(" SELECT 1 FROM role_pages WHERE role_id IN ($role_placeholders) AND page_id = ? AND status = 1 "); $perm_params = array_merge($user_info['role_ids'], [$current_page_id]); $perm_stmt->execute($perm_params); if (!$perm_stmt->fetch()) { throw new Exception("用户" . $user_info['real_name'] . "无页面权限: " . $current_page); } } catch (Exception $e) { write_log("权限验证失败: " . $e->getMessage(), 'error'); header('Location: /public/permission_denied.php'); exit; } } $GLOBALS['user_info'] = $user_info; ?> -- -------------------------------------------------------- 2、core/functions.php 公共函数 getAttribute(PDO::ATTR_SERVER_VERSION); } catch (PDOException $e) { $info['mysql_version'] = '获取失败:' . $e->getMessage(); write_log("获取MySQL版本失败:" . $e->getMessage(), 'warning'); } $info['php_version'] = phpversion(); $info['web_server'] = $_SERVER['SERVER_SOFTWARE'] ?? ''; $info['system_time'] = date('Y-m-d H:i:s'); return $info; } function get_login_records($conn) { try { $sql = "SELECT login_name, ip_address, login_time FROM login_records ORDER BY login_time DESC LIMIT 10"; $stmt = $conn->prepare($sql); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { write_log("获取登录记录失败:" . $e->getMessage(), 'error'); return []; } } function get_operator_by_id($conn, $operator_id) { try { $sql = "SELECT id, login_name, real_name, gender, phone, email, status, role, create_time, update_time FROM users WHERE id = ? AND status IN (1,2,3)"; $stmt = $conn->prepare($sql); $stmt->execute([$operator_id]); return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; } catch (PDOException $e) { write_log("获取用户信息失败 ID[$operator_id]:" . $e->getMessage(), 'error'); return null; } } function get_operator_role_ids($conn, $operator_id) { try { $sql = "SELECT role_id FROM users_roles WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())"; $stmt = $conn->prepare($sql); $stmt->execute([$operator_id]); return $stmt->fetchAll(PDO::FETCH_COLUMN); } catch (PDOException $e) { write_log("获取用户角色ID失败 ID[$operator_id]:" . $e->getMessage(), 'error'); return []; } } function get_operator_roles($conn, $operator_id) { try { $sql = "SELECT r.id, r.role_name, r.display_name FROM users_roles ur JOIN roles r ON ur.role_id = r.id WHERE ur.user_id = ? AND ur.status = 1 AND (ur.expire_time IS NULL OR ur.expire_time > NOW()) AND r.status = 1"; $stmt = $conn->prepare($sql); $stmt->execute([$operator_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { write_log("获取用户角色详情失败 ID[$operator_id]:" . $e->getMessage(), 'error'); return []; } } function count_operators_by_role_name($conn, $role_name) { try { $sql = "SELECT COUNT(DISTINCT ur.user_id) FROM users_roles ur JOIN roles r ON ur.role_id = r.id WHERE r.role_name = ? AND ur.status = 1 AND (ur.expire_time IS NULL OR ur.expire_time > NOW()) AND r.status = 1"; $stmt = $conn->prepare($sql); $stmt->execute([$role_name]); return (int)$stmt->fetchColumn(); } catch (PDOException $e) { write_log("按角色统计用户数量失败(角色:$role_name):" . $e->getMessage(), 'error'); return 0; } } function get_active_roles($conn) { try { $sql = "SELECT id, role_name, display_name FROM roles WHERE status = 1 ORDER BY id"; $stmt = $conn->prepare($sql); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { write_log("获取角色列表失败:" . $e->getMessage(), 'error'); return []; } } function get_role_display_name($conn, $role_name) { try { $sql = "SELECT display_name FROM roles WHERE role_name = ? AND status = 1"; $stmt = $conn->prepare($sql); $stmt->execute([$role_name]); return $stmt->fetchColumn() ?: $role_name; } catch (PDOException $e) { write_log("获取角色显示名失败(角色:$role_name):" . $e->getMessage(), 'error'); return $role_name; } } function gd_image_compress($src_path, $quality = null) { if (!file_exists($src_path)) { write_log("图片压缩失败:文件不存在 - $src_path", 'warning'); return false; } $info = @getimagesize($src_path); if (!$info) { write_log("图片压缩失败:无法读取图片信息 - $src_path", 'warning'); return false; } $width = $info[0]; $height = $info[1]; $mime = $info['mime']; if ($quality === null) { switch ($mime) { case 'image/jpeg': $quality = 75; break; case 'image/png': $quality = 6; break; case 'image/webp': $quality = 80; break; default: $quality = 80; } } $max_width = 1200; $need_resize = false; if ($width > $max_width) { $need_resize = true; $ratio = $max_width / $width; $new_width = $max_width; $new_height = (int)($height * $ratio); } switch ($mime) { case 'image/jpeg': $src_img = @imagecreatefromjpeg($src_path); break; case 'image/png': $src_img = @imagecreatefrompng($src_path); if ($src_img) { imagealphablending($src_img, true); imagesavealpha($src_img, true); } if ($quality > 9) { $quality = 9 - round($quality / 11.11); $quality = max(0, min(9, $quality)); } break; case 'image/webp': $src_img = @imagecreatefromwebp($src_path); break; case 'image/gif': $src_img = @imagecreatefromgif($src_path); break; case 'image/bmp': $src_img = @imagecreatefrombmp($src_path); break; default: write_log("图片压缩失败:不支持的图片类型 - $mime", 'warning'); return false; } if (!$src_img) { write_log("图片压缩失败:创建图像资源失败 - $src_path", 'warning'); return false; } if ($need_resize) { $dst_img = imagecreatetruecolor($new_width, $new_height); if ($mime === 'image/png') { imagealphablending($dst_img, false); imagesavealpha($dst_img, true); $transparent = imagecolorallocatealpha($dst_img, 255, 255, 255, 127); imagefill($dst_img, 0, 0, $transparent); } imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagedestroy($src_img); $src_img = $dst_img; } $success = false; switch ($mime) { case 'image/jpeg': $success = @imagejpeg($src_img, $src_path, $quality); break; case 'image/png': $success = @imagepng($src_img, $src_path, $quality); break; case 'image/webp': $success = @imagewebp($src_img, $src_path, $quality); break; case 'image/gif': $success = @imagegif($src_img, $src_path); break; case 'image/bmp': $success = @imagebmp($src_img, $src_path); break; } imagedestroy($src_img); if (!$success) { write_log("图片压缩失败:保存图片失败 - $src_path", 'warning'); return false; } return true; } ?> -- -------------------------------------------------------- 3、config/conn.php 数据库连接配置 PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); } ?> -- -------------------------------------------------------- 4、config/init.php # 环境初始化 -- -------------------------------------------------------- 5、pc/assets/header.php头部参考代码
| ID | 操作 |
|---|
未找到记录