|
|
@ -327,7 +327,6 @@ export default {
|
|
|
|
wordSpacing: ''
|
|
|
|
wordSpacing: ''
|
|
|
|
},
|
|
|
|
},
|
|
|
|
previewStyle: {},
|
|
|
|
previewStyle: {},
|
|
|
|
messages: [], // 聊天记录
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
mounted() {
|
|
|
@ -395,10 +394,6 @@ export default {
|
|
|
|
displayMessage(text, sender) {
|
|
|
|
displayMessage(text, sender) {
|
|
|
|
const messagesDiv = document.getElementById('messages');
|
|
|
|
const messagesDiv = document.getElementById('messages');
|
|
|
|
|
|
|
|
|
|
|
|
// 移除 messages 中的按钮
|
|
|
|
|
|
|
|
const previousButtonsMessage = messagesDiv.querySelectorAll('.preview-buttons');
|
|
|
|
|
|
|
|
previousButtonsMessage.forEach(buttons => buttons.remove());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const messageDiv = document.createElement('div');
|
|
|
|
const messageDiv = document.createElement('div');
|
|
|
|
messageDiv.className = 'message';
|
|
|
|
messageDiv.className = 'message';
|
|
|
|
// 使用 pre 元素来格式化显示 text
|
|
|
|
// 使用 pre 元素来格式化显示 text
|
|
|
@ -412,28 +407,84 @@ export default {
|
|
|
|
// TODO 从返回文本中提取出css部分
|
|
|
|
// TODO 从返回文本中提取出css部分
|
|
|
|
preElement.textContent = `文心一言:\n` + preElement.textContent;
|
|
|
|
preElement.textContent = `文心一言:\n` + preElement.textContent;
|
|
|
|
messageDiv.style.backgroundColor = '#bdc3c7';
|
|
|
|
messageDiv.style.backgroundColor = '#bdc3c7';
|
|
|
|
|
|
|
|
// 预览生成的样式
|
|
|
|
|
|
|
|
this.previewStyleAtMessages(text);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// messagesDiv.scrollTop = messagesDiv.scrollHeight;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
// 发送消息
|
|
|
|
|
|
|
|
sendMessage() {
|
|
|
|
|
|
|
|
const userInput = document.getElementById('userInput');
|
|
|
|
|
|
|
|
const messageText = userInput.value;
|
|
|
|
|
|
|
|
if (messageText.trim() === '') return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 构造聊天历史
|
|
|
|
|
|
|
|
let chatHistory = [];
|
|
|
|
|
|
|
|
const messages = document.getElementById('messages').children;
|
|
|
|
|
|
|
|
for (let i = 0; i < messages.length; i++) {
|
|
|
|
|
|
|
|
if (i%4==0){
|
|
|
|
|
|
|
|
chatHistory.push({ Role: 'user', Content: messages[i].textContent });
|
|
|
|
|
|
|
|
}else if (i%4==1){
|
|
|
|
|
|
|
|
const assistantResponse = messages[i].textContent.replaceAll('文心一言:\n', '');
|
|
|
|
|
|
|
|
chatHistory.push({ Role: 'assistant', Content: assistantResponse });
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(chatHistory);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Display user's message
|
|
|
|
|
|
|
|
this.displayMessage(messageText, 'user');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 向后端调用API并接受response
|
|
|
|
|
|
|
|
// 根据messages的内容构造聊天历史列表
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
// const chat_history = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
axios({
|
|
|
|
|
|
|
|
url: 'http://localhost:14514/admin/ai_layout/style_generate',
|
|
|
|
|
|
|
|
method: 'POST',
|
|
|
|
|
|
|
|
data: {
|
|
|
|
|
|
|
|
user_input: userInput.value,
|
|
|
|
|
|
|
|
...(chatHistory.length > 0 && { chat_history: chatHistory }),
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.then(response => {
|
|
|
|
|
|
|
|
console.log(response);
|
|
|
|
|
|
|
|
this.displayMessage(response.data.data, 'ai')
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.catch(error => {
|
|
|
|
|
|
|
|
console.error('Error:', error);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
userInput.value = '';
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
// 预览生成的样式
|
|
|
|
|
|
|
|
previewStyleAtMessages(style) {
|
|
|
|
|
|
|
|
const messagesDiv = document.getElementById('messages');
|
|
|
|
// preview区域
|
|
|
|
// preview区域
|
|
|
|
const previewWrapper = document.createElement('div');
|
|
|
|
const previewWrapper = document.createElement('div');
|
|
|
|
previewWrapper.style.border = '1px solid #ccc';
|
|
|
|
previewWrapper.style.border = '1px solid #ccc';
|
|
|
|
previewWrapper.style.display = 'flow-root';
|
|
|
|
previewWrapper.style.display = 'flow-root';
|
|
|
|
|
|
|
|
messagesDiv.appendChild(previewWrapper);
|
|
|
|
|
|
|
|
|
|
|
|
// 添加一个标识 'preview' 的元素
|
|
|
|
// 添加一个标识 'preview' 的元素
|
|
|
|
const previewLabel = document.createElement('div');
|
|
|
|
const previewLabel = document.createElement('div');
|
|
|
|
previewLabel.textContent = 'preview';
|
|
|
|
previewLabel.textContent = 'preview';
|
|
|
|
previewWrapper.appendChild(previewLabel);
|
|
|
|
previewWrapper.appendChild(previewLabel);
|
|
|
|
|
|
|
|
|
|
|
|
// 应用生成的样式到预览内容
|
|
|
|
// 应用生成的样式到预览内容
|
|
|
|
const previewStyle = document.createElement('style');
|
|
|
|
const previewStyle = document.createElement('style');
|
|
|
|
// 对返回文本进行处理
|
|
|
|
// 对返回文本进行处理
|
|
|
|
// 提取其中css代码,以css开头,但不需要’css‘,最后一个}结尾
|
|
|
|
// 提取其中css代码,以css开头,但不需要’css‘,最后一个}结尾
|
|
|
|
const cssRegex = /css([\s\S]*)\}/;
|
|
|
|
const cssRegex = /```css\n([\s\S]*?)```/;
|
|
|
|
const cssMatch = cssRegex.exec(text);
|
|
|
|
const cssMatch = cssRegex.exec(style);
|
|
|
|
|
|
|
|
let cssText; // 提取的出的原始css代码,用于保存到后端或进一步处理
|
|
|
|
|
|
|
|
// 如果有多个css代码,只提取第一个
|
|
|
|
if (cssMatch) {
|
|
|
|
if (cssMatch) {
|
|
|
|
previewStyle.textContent = cssMatch[0].replace('css', '');
|
|
|
|
cssText = cssMatch[0].replace('css', '').replaceAll('```', '');
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
previewStyle.textContent = text;
|
|
|
|
cssText = style;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
previewStyle.textContent = previewStyle.textContent.replace(/\.ck-content/g, '');
|
|
|
|
previewStyle.textContent = cssText.replace(/\.ck-content/g, '');
|
|
|
|
document.head.appendChild(previewStyle);
|
|
|
|
previewWrapper.appendChild(previewStyle);
|
|
|
|
|
|
|
|
|
|
|
|
// 预览的内容
|
|
|
|
// 预览的内容
|
|
|
|
let previewElement;
|
|
|
|
let previewElement;
|
|
|
@ -441,18 +492,25 @@ export default {
|
|
|
|
const styleRegex = /\.ck-content\s+([a-z]+)\.([a-z-]+)\s*\{/g;
|
|
|
|
const styleRegex = /\.ck-content\s+([a-z]+)\.([a-z-]+)\s*\{/g;
|
|
|
|
let match;
|
|
|
|
let match;
|
|
|
|
const classNames = [];
|
|
|
|
const classNames = [];
|
|
|
|
while ((match = styleRegex.exec(text)) !== null) {
|
|
|
|
while ((match = styleRegex.exec(cssText)) !== null) {
|
|
|
|
if (!previewElement) {
|
|
|
|
if (!previewElement) {
|
|
|
|
previewElement = document.createElement(match[1]);
|
|
|
|
previewElement = document.createElement(match[1]);
|
|
|
|
previewElement.textContent = 'AaBbCcDdEeFf';
|
|
|
|
// previewElement.textContent = 'AaBbCcDdEeFf';
|
|
|
|
|
|
|
|
const previewText = document.createElement('p');
|
|
|
|
|
|
|
|
previewText.textContent = 'AaBbCcDd';
|
|
|
|
|
|
|
|
previewElement.appendChild(previewText);
|
|
|
|
previewWrapper.appendChild(previewElement);
|
|
|
|
previewWrapper.appendChild(previewElement);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
classNames.push(match[2]);
|
|
|
|
|
|
|
|
|
|
|
|
// className后加一个随机数表明是新的class
|
|
|
|
|
|
|
|
const newClassName = match[2]+"_"+Math.floor(Math.random()*1000);
|
|
|
|
|
|
|
|
previewStyle.textContent = previewStyle.textContent.replaceAll(match[2], newClassName);
|
|
|
|
|
|
|
|
classNames.push(newClassName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (previewElement) {
|
|
|
|
if (previewElement) {
|
|
|
|
previewElement.className = classNames.join(' ');
|
|
|
|
previewElement.className = classNames.join(' ');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
messagesDiv.appendChild(previewWrapper);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建按钮容器
|
|
|
|
// 创建按钮容器
|
|
|
|
const buttonsMessageDiv = document.createElement('div');
|
|
|
|
const buttonsMessageDiv = document.createElement('div');
|
|
|
@ -479,6 +537,7 @@ export default {
|
|
|
|
classes: classNames
|
|
|
|
classes: classNames
|
|
|
|
};
|
|
|
|
};
|
|
|
|
console.log(styleDefinition);
|
|
|
|
console.log(styleDefinition);
|
|
|
|
|
|
|
|
console.log(cssText);// 保存的css代码
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// 创建 clear 按钮
|
|
|
|
// 创建 clear 按钮
|
|
|
|
const clearButton = document.createElement('el-button');
|
|
|
|
const clearButton = document.createElement('el-button');
|
|
|
@ -492,48 +551,12 @@ export default {
|
|
|
|
while (messagesDiv.firstChild) {
|
|
|
|
while (messagesDiv.firstChild) {
|
|
|
|
messagesDiv.removeChild(messagesDiv.firstChild);
|
|
|
|
messagesDiv.removeChild(messagesDiv.firstChild);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 清除添加的style
|
|
|
|
|
|
|
|
document.head.removeChild(previewStyle);
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// 显示按钮
|
|
|
|
// 显示按钮
|
|
|
|
buttonsMessageDiv.appendChild(saveButton);
|
|
|
|
buttonsMessageDiv.appendChild(saveButton);
|
|
|
|
buttonsMessageDiv.appendChild(clearButton);
|
|
|
|
buttonsMessageDiv.appendChild(clearButton);
|
|
|
|
messagesDiv.appendChild(buttonsMessageDiv);
|
|
|
|
messagesDiv.appendChild(buttonsMessageDiv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// messagesDiv.scrollTop = messagesDiv.scrollHeight;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
sendMessage() {
|
|
|
|
|
|
|
|
const userInput = document.getElementById('userInput');
|
|
|
|
|
|
|
|
const messageText = userInput.value;
|
|
|
|
|
|
|
|
if (messageText.trim() === '') return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Display user's message
|
|
|
|
|
|
|
|
this.displayMessage(messageText, 'user');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 向后端调用API并接受response
|
|
|
|
|
|
|
|
// 根据messages的内容构造聊天历史列表
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
chat_history = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
axios({
|
|
|
|
|
|
|
|
url:'http://localhost:14514/admin/ai_layout/style_generate',
|
|
|
|
|
|
|
|
method: 'POST',
|
|
|
|
|
|
|
|
data:{
|
|
|
|
|
|
|
|
user_input: userInput.value
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.then(response => {
|
|
|
|
|
|
|
|
// let formatedResponse = response.data.response;
|
|
|
|
|
|
|
|
// this.displayMessage(formatedResponse, 'ai');
|
|
|
|
|
|
|
|
console.log(response);
|
|
|
|
|
|
|
|
this.displayMessage(response.data.data,'ai')
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.catch(error => {
|
|
|
|
|
|
|
|
console.error('Error:', error);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
userInput.value = '';
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
components: {
|
|
|
|
components: {
|
|
|
|
// 导入组件
|
|
|
|
// 导入组件
|
|
|
|