const connection = require('../sql'); class PagesService { async listCount(keyword, userId, projectId) { let statement = ''; if (projectId) { statement = ` SELECT count(p.id) total FROM pages p LEFT JOIN pages_role pr ON p.project_id = pr.page_id and pr.user_id = ${userId} WHERE (p.name like COALESCE(CONCAT('%',?,'%'), p.name) OR ? IS NULL) AND p.project_id = ${projectId} AND (pr.page_id IS NOT NULL OR p.user_id = ${userId})`; } else { statement = ` SELECT count(p.id) as total FROM pages p LEFT JOIN pages_role pr ON p.project_id = pr.page_id and pr.user_id = ${userId} WHERE ( (p.name like COALESCE(CONCAT('%',?,'%'), p.name) OR ? IS NULL) AND p.user_id = ${userId} ) AND (pr.page_id IS NOT NULL OR p.user_id = ${userId}) `; } const [result] = await connection.execute(statement, [keyword || null, keyword || null]); return result[0]; } async list(pageNum, pageSize, keyword, userId, projectId) { const offset = (+pageNum - 1) * pageSize + ''; const limit = pageSize; let statement = ''; if (projectId) { statement = ` SELECT p.id, p.name, p.user_id as userId, p.remark, p.app_type as appType, p.is_public as isPublic, p.is_edit as isEdit, p.preview_img as previewImg, p.stg_publish_id as stgPublishId, p.pre_publish_id as prePublishId, p.prd_publish_id as prdPublishId, p.stg_state as stgState, p.pre_state as preState, p.prd_state as prdState, p.project_id as projectId, p.updated_at as updatedAt, SUBSTRING_INDEX(p.user_name, '@', 1) as userName FROM pages p LEFT JOIN pages_role pr ON p.project_id = pr.page_id and pr.user_id = ${userId} WHERE (p.name like COALESCE(CONCAT('%',?,'%'), p.name) OR ? IS NULL) AND p.project_id = ${projectId} AND (pr.page_id IS NOT NULL OR p.user_id = ${userId}) ORDER BY p.updated_at DESC LIMIT ${offset},${limit};`; } else { statement = ` SELECT p.id, p.name, p.user_id as userId, p.remark, p.app_type as appType, p.is_public as isPublic, p.is_edit as isEdit, p.preview_img as previewImg, p.stg_publish_id as stgPublishId, p.pre_publish_id as prePublishId, p.prd_publish_id as prdPublishId, p.stg_state as stgState, p.pre_state as preState, p.prd_state as prdState, p.project_id as projectId, p.updated_at as updatedAt, SUBSTRING_INDEX(p.user_name, '@', 1) as userName FROM pages p LEFT JOIN pages_role pr ON pr.user_id = ${userId} and pr.page_id = p.id WHERE (p.name like COALESCE(CONCAT('%',?,'%'), p.name) OR ? IS NULL) AND (p.user_id = ${userId} OR pr.page_id IS NOT NULL) ORDER BY p.updated_at DESC LIMIT ${offset},${limit};`; } const [result] = await connection.execute(statement, [keyword || null, keyword || null]); return result; } // 根据模板项目ID查询页面ID async getPageIdsByProjectId(projectId) { const statement = ` SELECT id FROM pages WHERE project_id = ?; `; const [result] = await connection.execute(statement, [projectId]); return result; } // 查询项目总条数:mars-admin async getPageCount(isTemplate, userId) { let statement = ` SELECT count(id) total FROM pages WHERE 1 = 1 `; if (isTemplate !== '') { statement += ` and is_template = ${isTemplate}`; } if (userId) { statement += ` and user_id = ${userId}`; } const [result] = await connection.execute(statement, []); return result[0]; } // 查询页面总条数:mars-admin async getPageList(pageNum, pageSize, isTemplate, userId) { const offset = (+pageNum - 1) * pageSize + ''; let statement = ` SELECT id, name, user_id as userId, user_name as userName, remark, app_type as appType, is_template as isTemplate, is_public as isPublic, is_edit as isEdit, preview_img as previewImg, project_id as projectId, updated_at as updatedAt, created_at as createdAt FROM pages WHERE 1 = 1 `; if (isTemplate !== '') { statement += ` and is_template = ${isTemplate}`; } if (userId) { statement += ` and user_id = ${userId}`; } statement += ` LIMIT ${offset}, ${pageSize}`; const [result] = await connection.execute(statement, []); return result; } // 查询页面模板总条数 async listPageTemplateCount(keyword) { const statement = "SELECT COUNT(`id`) total FROM pages WHERE (name like COALESCE(CONCAT('%',?,'%'), name) OR ? IS NULL) AND is_public = 3;"; const [result] = await connection.execute(statement, [keyword || null, keyword || null]); return result[0]; } // 查询页面模板 async listPageTemplate(pageNum, pageSize, keyword) { const offset = (+pageNum - 1) * pageSize + ''; const statement = ` SELECT id, name, user_id as userId, remark, app_type as appType, is_public as isPublic, is_edit as isEdit, preview_img as previewImg, stg_publish_id as stgPublishId, stg_state as stgState, project_id as projectId, updated_at as updatedAt, SUBSTRING_INDEX(user_name, '@', 1) as userName FROM pages WHERE (name like COALESCE(CONCAT('%',?,'%'), name) OR ? IS NULL) AND is_public = 3 ORDER BY updated_at DESC LIMIT ?,?;`; const [result] = await connection.execute(statement, [keyword || null, keyword || null, offset, pageSize]); return result; } async getPageInfoById(id) { const statement = ` SELECT id, name, user_id as userId, user_name as userName, remark, app_type as appType, is_public as isPublic, is_edit as isEdit, preview_img as previewImg, page_data as pageData, stg_publish_id as stgPublishId, pre_publish_id as prePublishId, prd_publish_id as prdPublishId, stg_state as stgState, pre_state as preState, prd_state as prdState, project_id as projectId, updated_at as updatedAt, SUBSTRING_INDEX(user_name, '@', 1) as userName FROM pages WHERE id = ?; `; const [result] = await connection.execute(statement, [id]); return result; } async getPageSimpleById(id) { const statement = 'SELECT user_id as userId, app_type as appType, is_public as isPublic, is_edit as isEdit,project_id projectId FROM pages WHERE id = ?;'; const [result] = await connection.execute(statement, [id]); return result; } async createPage(name, userId, userName, remark = '', pageData = '', projectId = 0, appType) { const statement = 'INSERT INTO pages (name, user_id, user_name, app_type, remark, page_data, project_id) VALUES (?, ?, ?, ?, ?, ?, ?);'; const [result] = await connection.execute(statement, [name, userId, userName, appType || 1, remark, pageData, projectId]); return result; } async deletePage(pageId, userId) { const statement = 'DELETE FROM pages WHERE id = ? and user_id = ?;'; const [result] = await connection.execute(statement, [pageId, userId]); return result; } // 删除项目下所有页面 async deletePageByProjectId(projectId, userId) { const statement = 'DELETE FROM pages WHERE project_id = ? and user_id = ?;'; const [result] = await connection.execute(statement, [projectId, userId]); return result; } // 解除项目下页面列表归属 async updatePageForProjectId(projectId) { const statement = 'update pages set project_id = null where project_id = ?'; const [result] = await connection.execute(statement, [projectId]); return result; } //state=> 1: 未保存 2: 已保存 3: 已发布 4: 已回滚 async updatePageInfo(id, name, remark, pageData, previewImg, projectId, isPublic) { let statement = `UPDATE pages SET stg_state=2, pre_state=2, prd_state=2`; let sql_params = []; if (name) { statement += `, name = ?`; sql_params.push(name); } if (remark != null) { statement += `, remark = ?`; sql_params.push(remark); } if (previewImg) { statement += `, preview_img = ?`; sql_params.push(previewImg); } if (pageData) { statement += `, page_data = ?`; sql_params.push(pageData); } if (projectId) { statement += `, project_id = ?`; sql_params.push(projectId); } if (isPublic) { statement += `, is_public = ?`; sql_params.push(isPublic); } statement += ` WHERE id = ?;`; sql_params.push(id); const [result] = await connection.execute(statement, sql_params); return result; } //state=> 1: 未保存 2: 已保存 3: 已发布 4: 已回滚 async updatePageState(lastPublishId, id, env, previewImg) { let statement = `UPDATE pages SET ${env}_state=3, ${env}_publish_id = ?`; let sql_params = [lastPublishId]; if (previewImg) { statement += `, preview_img = ?`; sql_params.push(previewImg); } statement += ` WHERE id = ?;`; sql_params.push(id); const [result] = await connection.execute(statement, sql_params); return result; } async updateLastPublishId(pageId, lastPublishId, env) { const statement = `UPDATE pages SET ${env}_state=4, ${env}_publish_id = ? WHERE id = ?;`; const [result] = await connection.execute(statement, [lastPublishId, pageId]); return result; } // 根据页面模板id查询页面信息 async getPageByTemplateId(id) { const statement = ` SELECT p.project_id projectId, p.name, p.remark, p.app_type, p.page_data pageData FROM pages p LEFT JOIN templates t on p.id = t.union_id WHERE t.id = ?; `; const [result] = await connection.execute(statement, [id]); return result[0]; } // 根据项目模板id查询关联的菜单页面列表 async getPagesById(id) { const statement = ` SELECT id, name, app_type as appType, page_data pageData, stg_state stgState, remark FROM pages WHERE id = ? `; const [result] = await connection.execute(statement, [id]); return result[0]; } // 设置模板以后,更新项目标识 async updatePageTemplate(id, status) { const statement = 'UPDATE pages SET is_template = ? WHERE id = ?;'; const [result] = await connection.execute(statement, [status, id]); return result; } // 注销用户所有页面 async deleteAllPage(userId, userName) { const statement = 'DELETE FROM pages WHERE user_id = ? and user_name = ?;'; const [result] = await connection.execute(statement, [userId, userName]); return result; } } module.exports = new PagesService();