collabdocchat 2.4.4 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/bin/cli.js +1 -1
  2. package/package.json +4 -2
  3. package/scripts/cleanup-scripts.js +140 -0
  4. package/scripts/fix-startup-issues.js +136 -0
  5. package/scripts/start-app.js +11 -5
  6. package/scripts/start-simple.js +96 -0
  7. package/server/index.js +4 -0
  8. package/server/index.js.bak +97 -0
  9. package/server/models/Document.js +5 -0
  10. package/server/models/KnowledgeBase.js +259 -254
  11. package/server/models/Poll.js +97 -0
  12. package/server/routes/ai.js +391 -327
  13. package/server/routes/audit.js +61 -0
  14. package/server/routes/documents.js +74 -5
  15. package/server/routes/export.js +171 -10
  16. package/server/routes/files.js +27 -4
  17. package/server/routes/knowledge.js +31 -22
  18. package/server/routes/messages.js +142 -0
  19. package/server/routes/polls.js +241 -0
  20. package/server/routes/tasks.js +1 -0
  21. package/server/routes/workflows.js +27 -0
  22. package/server/utils/auditLogger.js +268 -238
  23. package/src/pages/admin-dashboard.js +1431 -335
  24. package/src/pages/admin-dashboard.js.audit-optimize.bak +4134 -0
  25. package/src/pages/admin-dashboard.js.bak +4041 -0
  26. package/src/pages/admin-dashboard.js.broken.bak +4099 -0
  27. package/src/pages/admin-dashboard.js.comprehensive.bak +4099 -0
  28. package/src/pages/admin-dashboard.js.escape.bak +4099 -0
  29. package/src/pages/admin-dashboard.js.final-final-fix.bak +4099 -0
  30. package/src/pages/admin-dashboard.js.final-fix.bak +4099 -0
  31. package/src/pages/admin-dashboard.js.final.bak +4099 -0
  32. package/src/pages/admin-dashboard.js.indent-fix.bak +4099 -0
  33. package/src/pages/admin-dashboard.js.last-fix.bak +4099 -0
  34. package/src/pages/admin-dashboard.js.line595-fix.bak +4099 -0
  35. package/src/pages/admin-dashboard.js.pre-manual-fix.bak +4099 -0
  36. package/src/pages/admin-dashboard.js.syntax.bak +4099 -0
  37. package/src/pages/admin-dashboard.js.test.bak +4099 -0
  38. package/src/pages/optimized-task-detail-original.js +838 -0
  39. package/src/pages/optimized-task-detail.js +324 -22
  40. package/src/pages/optimized-task-detail.js.bak +1162 -0
  41. package/src/pages/poll-detail-enhanced.js +394 -0
  42. package/src/pages/update-poll-display.js +380 -0
  43. package/src/pages/user-dashboard.js +1860 -1006
  44. package/src/services/api.js +326 -265
  45. package/src/services/auth.js +54 -54
  46. package/src/services/websocket.js +88 -80
  47. package/scripts/add-button-hover.js +0 -56
  48. package/scripts/add-missing-functions.js +0 -66
  49. package/scripts/add-more-features.js +0 -427
  50. package/scripts/add-user-functions.js +0 -201
  51. package/scripts/auto-publish.js +0 -63
  52. package/scripts/beautify-buttons.js +0 -45
  53. package/scripts/beautify-ui.js +0 -267
  54. package/scripts/check-encoding.js +0 -41
  55. package/scripts/check-syntax.js +0 -54
  56. package/scripts/find-buttons.js +0 -20
  57. package/scripts/find-duplicate.js +0 -35
  58. package/scripts/find-sidebar-buttons.js +0 -21
  59. package/scripts/fix-help.js +0 -274
  60. package/scripts/fix-issues-step1.js +0 -73
  61. package/scripts/fix-issues-step2.js +0 -93
  62. package/scripts/fix-issues-step3.js +0 -155
  63. package/scripts/fix-issues-step4.js +0 -150
  64. package/scripts/fix-optimized-views.js +0 -37
  65. package/scripts/fix-ports.js +0 -77
  66. package/scripts/fix-settings.js +0 -258
  67. package/scripts/fix-user-dashboard.js +0 -62
  68. package/scripts/fix-workflow.js +0 -110
  69. package/scripts/refactor-step1.js +0 -32
  70. package/scripts/refactor-step2.js +0 -255
  71. package/scripts/refactor-step3.js +0 -137
  72. package/scripts/refactor-step4.js +0 -183
  73. package/scripts/refactor-step5.js +0 -181
  74. package/scripts/refactor-step6.js +0 -254
  75. package/scripts/refactor-step7.js +0 -291
  76. package/scripts/remove-bom.js +0 -69
  77. package/scripts/remove-quill-from-user-dashboard.js +0 -49
  78. package/scripts/remove-quill-imports-only.js +0 -32
  79. package/scripts/update-port-user.js +0 -21
  80. package/scripts/update-port.js +0 -22
  81. package/src/pages/simplified-workflows.js +0 -652
  82. package/src/utils/ai-assistant.js +0 -1384
@@ -1,54 +1,54 @@
1
- const API_URL = 'http://localhost:8765/api';
2
-
3
- export class AuthService {
4
- async login(username, password) {
5
- const response = await fetch(`${API_URL}/auth/login`, {
6
- method: 'POST',
7
- headers: { 'Content-Type': 'application/json' },
8
- body: JSON.stringify({ username, password })
9
- });
10
-
11
- if (!response.ok) {
12
- const error = await response.json();
13
- throw new Error(error.message);
14
- }
15
-
16
- return await response.json();
17
- }
18
-
19
- async register(username, password) {
20
- const response = await fetch(`${API_URL}/auth/register`, {
21
- method: 'POST',
22
- headers: { 'Content-Type': 'application/json' },
23
- body: JSON.stringify({ username, password })
24
- });
25
-
26
- if (!response.ok) {
27
- const error = await response.json();
28
- throw new Error(error.message);
29
- }
30
-
31
- return await response.json();
32
- }
33
-
34
- async getCurrentUser() {
35
- const token = localStorage.getItem('token');
36
- const response = await fetch(`${API_URL}/auth/me`, {
37
- headers: { 'Authorization': `Bearer ${token}` }
38
- });
39
-
40
- if (!response.ok) {
41
- throw new Error('获取用户信息失败');
42
- }
43
-
44
- const data = await response.json();
45
- return data.user;
46
- }
47
-
48
- logout() {
49
- localStorage.removeItem('token');
50
- window.location.reload();
51
- }
52
- }
53
-
54
-
1
+ const API_URL = 'http://localhost:8765/api';
2
+
3
+ export class AuthService {
4
+ async login(username, password) {
5
+ const response = await fetch(`${API_URL}/auth/login`, {
6
+ method: 'POST',
7
+ headers: { 'Content-Type': 'application/json' },
8
+ body: JSON.stringify({ username, password })
9
+ });
10
+
11
+ if (!response.ok) {
12
+ const error = await response.json();
13
+ throw new Error(error.message);
14
+ }
15
+
16
+ return await response.json();
17
+ }
18
+
19
+ async register(username, password) {
20
+ const response = await fetch(`${API_URL}/auth/register`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify({ username, password })
24
+ });
25
+
26
+ if (!response.ok) {
27
+ const error = await response.json();
28
+ throw new Error(error.message);
29
+ }
30
+
31
+ return await response.json();
32
+ }
33
+
34
+ async getCurrentUser() {
35
+ const token = localStorage.getItem('token');
36
+ const response = await fetch(`${API_URL}/auth/me`, {
37
+ headers: { 'Authorization': `Bearer ${token}` }
38
+ });
39
+
40
+ if (!response.ok) {
41
+ throw new Error('获取用户信息失败');
42
+ }
43
+
44
+ const data = await response.json();
45
+ return data.user;
46
+ }
47
+
48
+ logout() {
49
+ localStorage.removeItem('token');
50
+ window.location.reload();
51
+ }
52
+ }
53
+
54
+
@@ -1,80 +1,88 @@
1
- export class WebSocketService {
2
- constructor() {
3
- this.ws = null;
4
- this.listeners = new Map();
5
- }
6
-
7
- connect(token) {
8
- this.ws = new WebSocket('ws://localhost:8765');
9
-
10
- this.ws.onopen = () => {
11
- console.log('✅ WebSocket 连接成功');
12
- this.send({ type: 'auth', token });
13
- };
14
-
15
- this.ws.onmessage = (event) => {
16
- const data = JSON.parse(event.data);
17
- this.notifyListeners(data.type, data);
18
- };
19
-
20
- this.ws.onerror = (error) => {
21
- console.error('❌ WebSocket 错误:', error);
22
- };
23
-
24
- this.ws.onclose = () => {
25
- console.log('🔌 WebSocket 连接关闭');
26
- setTimeout(() => this.connect(token), 3000);
27
- };
28
- }
29
-
30
- send(data) {
31
- if (this.ws && this.ws.readyState === WebSocket.OPEN) {
32
- this.ws.send(JSON.stringify(data));
33
- }
34
- }
35
-
36
- on(event, callback) {
37
- if (!this.listeners.has(event)) {
38
- this.listeners.set(event, []);
39
- }
40
- this.listeners.get(event).push(callback);
41
- }
42
-
43
- off(event, callback) {
44
- if (this.listeners.has(event)) {
45
- const callbacks = this.listeners.get(event);
46
- const index = callbacks.indexOf(callback);
47
- if (index > -1) {
48
- callbacks.splice(index, 1);
49
- }
50
- }
51
- }
52
-
53
- notifyListeners(event, data) {
54
- if (this.listeners.has(event)) {
55
- this.listeners.get(event).forEach(callback => callback(data));
56
- }
57
- }
58
-
59
- joinGroup(groupId) {
60
- this.send({ type: 'join_group', groupId });
61
- }
62
-
63
- sendChatMessage(groupId, username, content) {
64
- this.send({ type: 'chat_message', groupId, username, content });
65
- }
66
-
67
- syncDocument(documentId, content, cursorPosition) {
68
- this.send({ type: 'document_sync', documentId, content, cursorPosition });
69
- }
70
-
71
- respondToCall(groupId, username) {
72
- this.send({ type: 'call_response', groupId, username });
73
- }
74
-
75
- sendTyping(documentId, username, isTyping) {
76
- this.send({ type: 'typing', documentId, username, isTyping });
77
- }
78
- }
79
-
80
-
1
+ export class WebSocketService {
2
+ constructor() {
3
+ this.ws = null;
4
+ this.listeners = new Map();
5
+ }
6
+
7
+ connect(token) {
8
+ this.ws = new WebSocket('ws://localhost:8765');
9
+
10
+ this.ws.onopen = () => {
11
+ console.log('✅ WebSocket 连接成功');
12
+ this.send({ type: 'auth', token });
13
+ };
14
+
15
+ this.ws.onmessage = (event) => {
16
+ const data = JSON.parse(event.data);
17
+ this.notifyListeners(data.type, data);
18
+ };
19
+
20
+ this.ws.onerror = (error) => {
21
+ console.error('❌ WebSocket 错误:', error);
22
+ };
23
+
24
+ this.ws.onclose = () => {
25
+ console.log('🔌 WebSocket 连接关闭');
26
+ setTimeout(() => this.connect(token), 3000);
27
+ };
28
+ }
29
+
30
+ send(data) {
31
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
32
+ this.ws.send(JSON.stringify(data));
33
+ }
34
+ }
35
+
36
+ on(event, callback) {
37
+ if (!this.listeners.has(event)) {
38
+ this.listeners.set(event, []);
39
+ }
40
+ this.listeners.get(event).push(callback);
41
+ }
42
+
43
+ off(event, callback) {
44
+ if (this.listeners.has(event)) {
45
+ const callbacks = this.listeners.get(event);
46
+ const index = callbacks.indexOf(callback);
47
+ if (index > -1) {
48
+ callbacks.splice(index, 1);
49
+ }
50
+ }
51
+ }
52
+
53
+ notifyListeners(event, data) {
54
+ if (this.listeners.has(event)) {
55
+ this.listeners.get(event).forEach(callback => callback(data));
56
+ }
57
+ }
58
+
59
+ joinGroup(groupId) {
60
+ this.send({ type: 'join_group', groupId });
61
+ }
62
+
63
+ sendChatMessage(groupId, username, content) {
64
+ this.send({ type: 'chat_message', groupId, username, content });
65
+ }
66
+
67
+ syncDocument(documentId, content, cursorPosition) {
68
+ this.send({ type: 'document_sync', documentId, content, cursorPosition });
69
+ }
70
+
71
+ respondToCall(groupId, username) {
72
+ this.send({ type: 'call_response', groupId, username });
73
+ }
74
+
75
+ sendTyping(documentId, username, isTyping) {
76
+ this.send({ type: 'typing', documentId, username, isTyping });
77
+ }
78
+
79
+ sendWhiteboardDraw(groupId, drawData) {
80
+ this.send({ type: 'whiteboard_draw', groupId, ...drawData });
81
+ }
82
+
83
+ sendWhiteboardClear(groupId) {
84
+ this.send({ type: 'whiteboard_clear', groupId });
85
+ }
86
+ }
87
+
88
+
@@ -1,56 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { fileURLToPath } from 'url';
4
-
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = path.dirname(__filename);
7
-
8
- const filePath = path.join(__dirname, '../src/pages/admin-dashboard.js');
9
-
10
- console.log('添加按钮悬停效果...');
11
- let content = fs.readFileSync(filePath, 'utf8');
12
-
13
- // 查找设置按钮的点击事件位置
14
- const settingsBtnPattern = /document\.getElementById\('settingsBtn'\)\.addEventListener\('click', \(\) => \{/;
15
-
16
- if (settingsBtnPattern.test(content)) {
17
- // 在设置按钮点击事件之前添加悬停效果
18
- const hoverEffects = `
19
- // 设置和帮助按钮悬停效果
20
- const settingsBtn = document.getElementById('settingsBtn');
21
- const helpBtn = document.getElementById('helpBtn');
22
-
23
- settingsBtn.addEventListener('mouseenter', () => {
24
- settingsBtn.style.transform = 'translateY(-2px)';
25
- settingsBtn.style.boxShadow = '0 4px 12px rgba(102, 126, 234, 0.5)';
26
- });
27
- settingsBtn.addEventListener('mouseleave', () => {
28
- settingsBtn.style.transform = 'translateY(0)';
29
- settingsBtn.style.boxShadow = '0 2px 8px rgba(102, 126, 234, 0.3)';
30
- });
31
-
32
- helpBtn.addEventListener('mouseenter', () => {
33
- helpBtn.style.transform = 'translateY(-2px)';
34
- helpBtn.style.boxShadow = '0 4px 12px rgba(240, 147, 251, 0.5)';
35
- });
36
- helpBtn.addEventListener('mouseleave', () => {
37
- helpBtn.style.transform = 'translateY(0)';
38
- helpBtn.style.boxShadow = '0 2px 8px rgba(240, 147, 251, 0.3)';
39
- });
40
-
41
- `;
42
-
43
- content = content.replace(
44
- settingsBtnPattern,
45
- hoverEffects + "document.getElementById('settingsBtn').addEventListener('click', () => {"
46
- );
47
-
48
- console.log('✅ 悬停效果已添加');
49
- } else {
50
- console.log('⚠️ 未找到设置按钮点击事件');
51
- }
52
-
53
- fs.writeFileSync(filePath, content, 'utf8');
54
-
55
- console.log('\n✅ 完成!按钮现在有悬停动画效果');
56
-
@@ -1,66 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { fileURLToPath } from 'url';
4
-
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = path.dirname(__filename);
7
-
8
- const filePath = path.join(__dirname, '../src/pages/admin-dashboard.js');
9
-
10
- console.log('读取文件...');
11
- let content = fs.readFileSync(filePath, 'utf8');
12
-
13
- // 找到最后一个 renderView('groups'); 之前插入新函数
14
- const insertPoint = content.lastIndexOf(" renderView('groups');");
15
-
16
- if (insertPoint === -1) {
17
- console.error('❌ 找不到插入点');
18
- process.exit(1);
19
- }
20
-
21
- const newFunctions = `
22
- // 知识库管理
23
- async function renderKnowledgeView(container) {
24
- if (!currentGroup) {
25
- container.innerHTML = '<div class="empty-state">请先选择一个群组</div>';
26
- return;
27
- }
28
- container.innerHTML = '<div class="empty-state">知识库功能开发中...</div>';
29
- }
30
-
31
- // 工作流管理
32
- async function renderWorkflowView(container) {
33
- if (!currentGroup) {
34
- container.innerHTML = '<div class="empty-state">请先选择一个群组</div>';
35
- return;
36
- }
37
- container.innerHTML = '<div class="empty-state">工作流功能开发中...</div>';
38
- }
39
-
40
- // 备份管理
41
- async function renderBackupView(container) {
42
- container.innerHTML = '<div class="empty-state">备份功能开发中...</div>';
43
- }
44
-
45
- // AI助手
46
- async function renderAIView(container) {
47
- container.innerHTML = '<div class="empty-state">AI助手功能开发中...</div>';
48
- }
49
-
50
- // 数据导出
51
- async function renderExportView(container) {
52
- container.innerHTML = '<div class="empty-state">数据导出功能开发中...</div>';
53
- }
54
-
55
- `;
56
-
57
- const before = content.substring(0, insertPoint);
58
- const after = content.substring(insertPoint);
59
-
60
- content = before + newFunctions + after;
61
-
62
- console.log('写入文件...');
63
- fs.writeFileSync(filePath, content, 'utf8');
64
-
65
- console.log('✅ 完成!已添加缺失的函数');
66
-