--- notion-id: 1d2ca4d7-cb7b-80df-907f-e6972cb0a5ea --- 注意:wiz_kb_user_role查看团队任务 尝试添加 权限100是作者 1000是读者 0是管理员 > [!tip] 💡 > 批量转移用户需要导出`wiz_user`,`wiz_kb` 这两个表才能实现登录 [进阶查询语句](进阶查询语句.md) [进阶](进阶.md) [为知笔记忘记密码](为知笔记忘记密码.md) [为知笔记数据库关系](为知笔记数据库关系.md) [笔记同步团队人员](笔记同步团队人员.md) [查询笔记文章](查询笔记文章.md) 查询已加入团队的账户【继续优化】 ```shell SELECT wiz_kb.KB_NAME, wiz_user.DISPLAYNAME, wiz_user.EMAIL FROM wiz_kb_user_role JOIN wiz_kb ON wiz_kb_user_role.KB_GUID = wiz_kb.KB_GUID JOIN wiz_user ON wiz_kb_user_role.USER_GUID = wiz_user.USER_GUID; ``` ```sql SELECT -- 将 BINARY 类型的 KB_GUID 转换为格式化的字符串,带有 '-' 符号 CONCAT( SUBSTRING(HEX(wiz_tag.KB_GUID), 1, 8), '-', -- 取前8个字符并加上第一个 '-' SUBSTRING(HEX(wiz_tag.KB_GUID), 9, 4), '-', -- 取接下来的4个字符并加上第二个 '-' SUBSTRING(HEX(wiz_tag.KB_GUID), 13, 4), '-', -- 取接下来的4个字符并加上第三个 '-' SUBSTRING(HEX(wiz_tag.KB_GUID), 17, 4), '-', -- 取接下来的4个字符并加上第四个 '-' SUBSTRING(HEX(wiz_tag.KB_GUID), 21, 12) -- 取最后的12个字符 ) AS KB_GUID_Formated, -- 将格式化后的字符串命名为 KB_GUID_Formated wk.KB_NAME, -- 选择 wizasent.wiz_kb 表中的 KB_NAME 字段 wiz_tag.TAG_NAME -- 选择 wiz_tag 表中的 TAG_NAME 字段 FROM wiz_tag -- 从 wiz_tag 表中开始查询 LEFT JOIN wizasent.wiz_kb wk -- 使用 LEFT JOIN 连接 wizasent.wiz_kb 表,别名为 wk ON LOWER(CONCAT( SUBSTRING(HEX(wiz_tag.KB_GUID), 1, 8), '-', -- 格式化 wiz_tag.KB_GUID SUBSTRING(HEX(wiz_tag.KB_GUID), 9, 4), '-', SUBSTRING(HEX(wiz_tag.KB_GUID), 13, 4), '-', SUBSTRING(HEX(wiz_tag.KB_GUID), 17, 4), '-', SUBSTRING(HEX(wiz_tag.KB_GUID), 21, 12) )) = LOWER(wk.KB_GUID); -- 将格式化后的 KB_GUID 转换为小写,并与 wizasent.wiz_kb.KB_GUID 的小写值进行比较 ``` 单点系统 ```shell const express = require('express'); const axios = require('axios').default; const app = express(); // ===== 配置区 ===== const API_URL = 'http://192.168.1.100'; // 为知笔记服务器地址 const OAUTH_SETTINGS = { clientId: 'xxx', // 你在为知后台拿到的 clientId clientSecret: 'xxx', // 你在为知后台拿到的 clientSecret }; // ===== 第一步:获取 accessToken ===== async function getAccessToken() { const { clientId, clientSecret } = OAUTH_SETTINGS; const url = `${API_URL}/as/oauth/token?clientId=${clientId}&clientSecret=${clientSecret}`; const response = await axios.get(url); const { data } = response; if (!data || data.returnCode !== 200) { throw new Error('获取 accessToken 失败'); } return data.result.accessToken; } // ===== 第二步:获取一次性登录链接 ===== async function getLoginUrl(userEmail) { const accessToken = await getAccessToken(); const url = `${API_URL}/as/oauth/service/login_url?accessToken=${accessToken}&userId=${encodeURIComponent(userEmail)}`; const response = await axios.get(url); const { data } = response; if (!data || data.returnCode !== 200) { throw new Error('获取一次性登录链接失败'); } return data.result; } // ===== ERP 按钮点击接口 ===== app.get('/wiz-login', async (req, res) => { try { // 假设 ERP 已经有当前登录用户的邮箱 // 生产环境中,请从登录态取真实邮箱,而不是写死 const currentUserEmail = 'alice@example.com'; const loginUrl = await getLoginUrl(currentUserEmail); // 直接跳转到为知笔记 res.redirect(loginUrl); } catch (err) { console.error(err); res.status(500).send('单点登录失败,请联系管理员'); } }); app.listen(3000, () => { console.log('ERP → 为知 SSO 服务已启动,访问 http://localhost:3000/wiz-login 体验'); }); ```