Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

dcs 1 неделя назад
Родитель
Сommit
583c42dbac
55 измененных файлов с 584 добавлено и 55 удалено
  1. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/index.html
  2. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/css/8530.22a62f15.css
  3. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/9118.76d356f7.css
  4. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1031.be3e7f59.js
  5. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1291.8a9ada06.js
  6. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1528.94e706cc.js
  7. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.f04d6ace.js
  8. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/224.41131e87.js
  9. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2890.bd2d861b.js
  10. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2959.87938055.js
  11. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3031.77a3c0b1.js
  12. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3195.ff280ac6.js
  13. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3203.fac07b30.js
  14. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3225.c0bd38f2.js
  15. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/348.368ffe0d.js
  16. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3519.bd5fdc0d.js
  17. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3550.603d1472.js
  18. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/37.f54b72f6.js
  19. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.5c016ca7.js
  20. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3817.fe4cea76.js
  21. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/437.0a00a47c.js
  22. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4669.67cf9662.js
  23. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4849.b96aec58.js
  24. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4960.dca104cf.js
  25. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.84f07b51.js
  26. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5383.b80d9de6.js
  27. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5576.f8a06d61.js
  28. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5769.50bcbf4e.js
  29. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/592.04db92db.js
  30. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5996.d0a30684.js
  31. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6072.9739cdea.js
  32. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6077.19c5845b.js
  33. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6094.a026b02c.js
  34. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6802.c9072a16.js
  35. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6916.aaff51b1.js
  36. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7351.9f266386.js
  37. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/742.02f4b524.js
  38. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7519.9a1f6e9c.js
  39. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8000.9748afab.js
  40. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.74cb4005.js
  41. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8407.67642efa.js
  42. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8530.6a75b7f7.js
  43. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8949.a9dc7cae.js
  44. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9118.a4f0a0eb.js
  45. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9381.0618d7bb.js
  46. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/965.4428b0d8.js
  47. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9709.f70915f7.js
  48. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9750.df2d2b81.js
  49. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9820.2dc8750e.js
  50. 2 2
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ab81ab7b.js
  51. 47 0
      virgo.wzfrontend/workark/src/api/ai.js
  52. 421 0
      virgo.wzfrontend/workark/src/components/work/common/aiChat.vue
  53. 74 0
      virgo.wzfrontend/workark/src/components/work/common/websiteForm.vue
  54. 1 1
      virgo.wzfrontend/workark/src/components/work/serve/content/edit.vue
  55. 34 47
      virgo.wzfrontend/workark/src/views/work/oa/ai/website.vue

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/index.html


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/css/8530.22a62f15.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/9118.76d356f7.css


virgo.wzfrontend/src/main/resources/static/workark/static/js/1031.03d7b31a.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/1031.be3e7f59.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/1291.b93112d3.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/1291.8a9ada06.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/1528.c400fdc8.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/1528.94e706cc.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.e2b14e9e.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.f04d6ace.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/224.6b99203e.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/224.41131e87.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/2890.3a731400.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/2890.bd2d861b.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/2959.db34ed43.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/2959.87938055.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/3031.77a3c0b1.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3195.c81e35f8.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3195.ff280ac6.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3203.e12cd344.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3203.fac07b30.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3225.377eb28c.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3225.c0bd38f2.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/348.8599411c.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/348.368ffe0d.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3519.11f366b1.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3519.bd5fdc0d.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3550.c0a155f6.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3550.603d1472.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/37.097eb258.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/37.f54b72f6.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.828db882.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.5c016ca7.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/3817.fe01487a.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/3817.fe4cea76.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/437.619e148e.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/437.0a00a47c.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/4669.67cf9662.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/4849.16de8392.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/4849.b96aec58.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/4960.de0d47ba.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/4960.dca104cf.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.702e9e80.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.84f07b51.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5383.9f13b690.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5383.b80d9de6.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5576.54e124ff.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5576.f8a06d61.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5769.9df8b1bb.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5769.50bcbf4e.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/592.28fbb30d.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/592.04db92db.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5996.36560e37.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5996.d0a30684.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/6072.a589d66c.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/6072.9739cdea.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/6077.9ea030ff.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/6077.19c5845b.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/6094.da7c3154.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/6094.a026b02c.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/6802.7243291b.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/6802.c9072a16.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/6916.c216d7d7.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/6916.aaff51b1.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/7351.9563dc05.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/7351.9f266386.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/742.a2bb586d.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/742.02f4b524.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/7519.a236ab73.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/7519.9a1f6e9c.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/8000.ee5a1edd.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/8000.9748afab.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8083.74cb4005.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/8407.a50ca532.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/8407.67642efa.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8530.6a75b7f7.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/8949.f4a77ba4.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/8949.a9dc7cae.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/9118.a4f0a0eb.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/9381.ab5a24f8.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/9381.0618d7bb.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/965.d657aced.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/965.4428b0d8.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/9709.862dd20a.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/9709.f70915f7.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/9750.a2f1a273.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/9750.df2d2b81.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/9820.86c91baa.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/9820.2dc8750e.js


Разница между файлами не показана из-за своего большого размера
+ 2 - 2
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.ab81ab7b.js


+ 47 - 0
virgo.wzfrontend/workark/src/api/ai.js

@@ -0,0 +1,47 @@
+import request from '@/axios'
+/* 
+ * 获取dify文本数据
+ * 
+ * 
+ */
+export function getAIData(simpleUUID) {
+	return request({
+		url: `/api/ai/completion/${simpleUUID}`,
+		method: 'get',
+	})
+}
+/* 
+ * 生成dify文本数据
+ * 
+ * 
+ */
+export function createAIData(difyTypeId, data) {
+	return request({
+		url: `/api/ai/completion/run/${difyTypeId}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取dify文本数据状态
+ * 
+ * 
+ */
+export function getAIDataStatus(simpleUUID) {
+	return request({
+		url: `/api/ai/completion/${simpleUUID}`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取dify文本数据列表
+ * 
+ * 
+ */
+export function getAIDataList(data) {
+	return request({
+		url: `/api/ai/completion`,
+		method: 'post',
+		data: data
+	})
+}

+ 421 - 0
virgo.wzfrontend/workark/src/components/work/common/aiChat.vue

@@ -0,0 +1,421 @@
+<template>
+	<div class="ai-chat-container">
+		<div class="chat-body" ref="chatBody">
+			<div class="message ai-message">
+				<div class="message-header">
+					<div class="message-header-img">
+						<avatar :user="{
+							portrait:'https://file-node.oss-cn-shanghai.aliyuncs.com/youji/f9617c7f80da485cb3cc72b6accc62ed'
+						}"></avatar>
+					</div>
+					<div class="message-header-label">AI网站生成助手</div>
+				</div>
+				<div class="message-content">
+					<p>您好!我是AI网站生成助手,请点击按钮生成企业官网。</p>
+					<el-button size="mini" @click="visible = true" :disabled="messageList.length > 0"
+						style="margin-top: 10px;">
+						点击生成企业官网
+					</el-button>
+				</div>
+				<div class="message-time">
+					{{ formatTime(messageList.length === 0? new Date():messageList[0].date) }}
+				</div>
+			</div>
+			<div v-for="(message, index) in messageList" :key="index">
+				<div class="message user-message">
+					<div class="message-header">
+						<div class="message-header-img">
+							<avatar :user="user"></avatar>
+						</div>
+						<div class="message-header-label">{{user.userName}}</div>
+					</div>
+					<div class="message-content" v-html="returnUserInputs(message.inputs)"></div>
+					<div class="message-time">
+						{{ formatTime(message.date) }}
+					</div>
+				</div>
+				<div class="message ai-message" v-if="!loading || message.status !== 'running'"
+					style="margin-top: 15px;">
+					<div class="message-header">
+						<div class="message-header-img">
+							<avatar :user="{
+								portrait:'https://file-node.oss-cn-shanghai.aliyuncs.com/youji/f9617c7f80da485cb3cc72b6accc62ed'
+							}"></avatar>
+						</div>
+						<div class="message-header-label">AI网站生成助手</div>
+					</div>
+					<div class="message-content">
+						<div v-if="message.status === 'error'">
+							<p>服务器繁忙,请稍后重试</p>
+							<el-button size="mini" @click="reload(message)" :disabled="index !== messageList.length - 1"
+								style="margin-top: 10px;">
+								点击重试
+							</el-button>
+						</div>
+						<div class="ai-website-boxs" v-else>
+							<div class="ai-website-box" v-html="extractContentBetween(message.outputs)"></div>
+							<div class="ai-website-mask">
+								<el-button size="mini" type="primary" @click="preview(message)">
+									预览
+								</el-button>
+							</div>
+						</div>
+					</div>
+					<div class="message-time">
+						{{ formatTime(message.endDate) }}
+					</div>
+				</div>
+			</div>
+			<div v-if="loading" class="typing-indicator">
+				<div class="typing-dot"></div>
+				<div class="typing-dot"></div>
+				<div class="typing-dot"></div>
+				<span style="margin-left: 10px;">思考中...</span>
+			</div>
+		</div>
+		<div class="input-container">
+			<el-input type="textarea" v-model="newMessage" placeholder="给AI发送消息" resize="none" rows="2"
+				:autosize="{ minRows: 2, maxRows: 6 }" :disabled="!htmlCode">
+			</el-input>
+			<div class="input-button">
+				<el-button type="primary" size="mini" @click="sendMessage"
+					:disabled="!newMessage.trim() || loading || !htmlCode">
+					发送
+				</el-button>
+			</div>
+		</div>
+		<el-dialog :close-on-click-modal="false" title="生成网站" :visible.sync="visible" width="900px"
+			:append-to-body="true">
+			<website-form v-if="visible" @callback="callback"></website-form>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import websiteForm from '@/components/work/common/websiteForm.vue'
+	import {
+		getAIDataStatus,
+		getAIDataList,
+		createAIData
+	} from '@/api/ai'
+	export default {
+		components: {
+			websiteForm
+		},
+		data() {
+			return {
+				messageList: [],
+				newMessage: '',
+				loading: false,
+				darkMode: false,
+				visible: false,
+				timer: null,
+				formData: {
+					site_name: '网站名称',
+					site_type: '网站类型',
+					color_scheme: '布局风格',
+					layout_style: '主色调',
+					sections: '主要模块',
+					logo_url: 'LOGO'
+				},
+				user: {},
+				htmlCode: ''
+			}
+		},
+		mounted() {
+			this.user = this.$store.getters.user;
+			this.scrollToBottom();
+			this.init()
+		},
+		watch: {
+			messageList: {
+				deep: true,
+				handler() {
+					this.$nextTick(() => {
+						this.scrollToBottom();
+					});
+				}
+			}
+		},
+		beforeDestroy() {
+			this.clearTimer();
+		},
+		methods: {
+			init() {
+				getAIDataList({
+					userId: this.$store.getters.user.userId
+				}).then(res => {
+					if (res.state) {
+						this.messageList = res.data;
+						if (this.messageList.length > 0) {
+							let data = this.messageList[this.messageList.length - 1];
+							if (data.status === 'running') this.initStaus(data.simpleUUID);
+						}
+					}
+				})
+			},
+			initStaus(simpleUUlD) {
+				this.loading = true;
+				this.timer = setInterval(() => {
+					getAIDataStatus(simpleUUlD).then(res => {
+						if (res.state) {
+							let data = res.data;
+							if (!data) return;
+							if (data.status === 'succeeded' || data.status === 'error') {
+								this.clearTimer();
+								this.loading = false;
+								this.messageList[this.messageList.length - 1] = data;
+							}
+						}
+					})
+				}, 10000)
+			},
+			returnUserInputs(obj) {
+				if (!obj) return '';
+				let html = '';
+				let objs = JSON.parse(obj);
+				if (objs['site_name']) {
+					for (let key in objs) {
+						html += this.formData[key] + ':' + objs[key] + "<br />";
+					}
+				} else {
+					html = objs.adjustments;
+				}
+				return html;
+			},
+			clearTimer() {
+				if (!this.timer) return;
+				clearInterval(this.timer);
+				this.timer = null;
+			},
+			formatTime(date) {
+				return new Date(date).toLocaleTimeString([], {
+					hour: '2-digit',
+					minute: '2-digit'
+				});
+			},
+			scrollToBottom() {
+				const container = this.$refs.chatBody;
+				if (container) {
+					container.scrollTop = container.scrollHeight;
+				}
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			},
+			sendMessage() {
+				createAIData(3, {
+					detailed_html: this.htmlCode,
+					adjustments: this.newMessage
+				}).then(this.successFunc);
+			},
+			reload(message) {
+				if (!this.htmlCode) {
+					createAIData(3, JSON.parse(message.inputs)).then(this.successFunc);
+				} else {
+					createAIData(1, JSON.parse(message.inputs)).then(this.successFunc);
+				}
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.newMessage = '';
+					this.$message.success('操作成功');
+					this.init();
+				}
+			},
+			extractContentBetween(html) {
+				if (!html) return '';
+				// 使用正则表达式匹配 ```html 和 ``` 之间的内容
+				let regex = /```html([\s\S]*?)```/;
+				let match = html.match(regex);
+				let htmls = match && match[1] ? match[1].trim() : ''
+				return htmls;
+			},
+			preview(message) {
+				this.htmlCode = this.extractContentBetween(message.outputs);
+				this.$emit('previewWebSite', this.htmlCode);
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.ai-chat-container {
+		width: 100%;
+		max-width: 900px;
+		height: 100%;
+		background: white;
+		border-radius: 16px;
+		box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+	}
+
+	.ai-website-boxs {
+		width: 185px;
+		height: 108px;
+		overflow: hidden;
+		cursor: pointer;
+		position: relative;
+
+		&:hover .ai-website-mask {
+			display: flex;
+		}
+	}
+
+	.ai-website-mask {
+		background: rgba(0, 0, 0, 0.1);
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		display: none;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.ai-website-box {
+		width: 1850px;
+		height: 1080px;
+		overflow: hidden;
+		transform: scale(0.1);
+		transform-origin: 0 0;
+	}
+
+	/* 聊天内容区域 */
+	.chat-body {
+		flex: 1;
+		padding: 20px;
+		overflow-y: auto;
+		background: #f8fafc;
+		display: flex;
+		flex-direction: column;
+		gap: 15px;
+	}
+
+	.message {
+		max-width: 90%;
+		padding: 12px 16px;
+		border-radius: 18px;
+		position: relative;
+		animation: fadeIn 0.3s ease;
+		line-height: 1.5;
+	}
+
+	.user-message {
+		background: $--color-primary;
+		color: white;
+		margin-left: auto;
+		border-bottom-right-radius: 4px;
+	}
+
+	.ai-message {
+		background: #ffffff;
+		border: 1px solid #e9ecef;
+		margin-right: auto;
+		border-bottom-left-radius: 4px;
+	}
+
+	.message-header {
+		display: flex;
+		align-items: center;
+		margin-bottom: 5px;
+		font-weight: 500;
+	}
+
+	.message-header-img {
+		width: 30px;
+		height: 30px;
+		border-radius: 30px;
+		overflow: hidden;
+		margin-right: 5px;
+	}
+
+	.message-header-label {
+		flex: 1;
+		width: 0;
+		overflow: hidden;
+	}
+
+	.message-time {
+		font-size: 0.7rem;
+		opacity: 0.7;
+		margin-top: 5px;
+		text-align: right;
+	}
+
+	/* 加载指示器 */
+	.typing-indicator {
+		display: flex;
+		align-items: center;
+		padding: 12px 16px;
+		background: white;
+		border: 1px solid #e9ecef;
+		border-radius: 18px;
+		width: fit-content;
+		margin-bottom: 15px;
+		border-bottom-left-radius: 4px;
+	}
+
+	.typing-dot {
+		width: 8px;
+		height: 8px;
+		background: #6c757d;
+		border-radius: 50%;
+		margin: 0 3px;
+		animation: typing 1.4s infinite;
+	}
+
+	.typing-dot:nth-child(1) {
+		animation-delay: 0s;
+	}
+
+	.typing-dot:nth-child(2) {
+		animation-delay: 0.2s;
+	}
+
+	.typing-dot:nth-child(3) {
+		animation-delay: 0.4s;
+	}
+
+	/* 输入区域 */
+	.input-container {
+		padding: 10px;
+		background: #f8f9fa;
+		border-top: 1px solid #e9ecef;
+	}
+
+	.input-button {
+		margin-top: 10px;
+		text-align: right;
+	}
+
+	/* 动画 */
+	@keyframes fadeIn {
+		from {
+			opacity: 0;
+			transform: translateY(10px);
+		}
+
+		to {
+			opacity: 1;
+			transform: translateY(0);
+		}
+	}
+
+	@keyframes typing {
+
+		0%,
+		60%,
+		100% {
+			transform: translateY(0);
+		}
+
+		30% {
+			transform: translateY(-5px);
+		}
+	}
+</style>

+ 74 - 0
virgo.wzfrontend/workark/src/components/work/common/websiteForm.vue

@@ -0,0 +1,74 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form :model="form" label-position="top">
+				<el-form-item label="网站名称">
+					<el-input type="text" v-model="form.site_name" placeholder="请输入网站名称"></el-input>
+				</el-form-item>
+				<el-form-item label="网站类型">
+					<el-input type="text" v-model="form.site_type" placeholder="请输入网站类型"></el-input>
+				</el-form-item>
+				<el-form-item label="布局风格">
+					<el-input type="text" v-model="form.layout_style" placeholder="请输入布局风格"></el-input>
+				</el-form-item>
+				<el-form-item label="主色调">
+					<el-color-picker v-model="form.color_scheme"></el-color-picker>
+				</el-form-item>
+				<el-form-item label="LOGO" class="hui-textarea">
+					<upload ref="listDisplayImage" :list="listDisplayImage" type="insert" :maxLen="1"></upload>
+				</el-form-item>
+				<el-form-item label="主要模块" class="hui-textarea">
+					<el-input type="textarea" v-model="form.sections" placeholder="请输入主要模块" resize="none">
+					</el-input>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		createAIData
+	} from '@/api/ai'
+	const upload = () => import('@/components/common/upload');
+	export default {
+		data() {
+			return {
+				form: {
+					site_name: '',
+					site_type: '',
+					color_scheme: '',
+					layout_style: '',
+					sections: ''
+				},
+				loading: false,
+				listDisplayImage: []
+			}
+		},
+		components: {
+			upload
+		},
+		methods: {
+			submit() {
+				this.loading = true;
+				let postData = JSON.parse(JSON.stringify(this.form));
+				let fileBox = this.$refs.listDisplayImage.fileList;
+				if (fileBox && fileBox.length > 0) postData['logo_url'] = fileBox[0].url;
+				createAIData(2, postData).then(this.successFunc)
+			},
+			successFunc(res) {
+				this.loading = false;
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 1 - 1
virgo.wzfrontend/workark/src/components/work/serve/content/edit.vue

@@ -23,7 +23,7 @@
 					<custom-data ref="customData" :list="customList" :option="option"></custom-data>
 				</el-form-item>
 				<el-form-item label="列表展示图" class="hui-textarea">
-					<upload ref="listDisplayImage" :list="listDisplayImage" type="insert" :maxLen="15"></upload>
+					<upload ref="listDisplayImage" :list="listDisplayImage" type="insert" :maxLen="1"></upload>
 				</el-form-item>
 				<el-form-item label="商品配图" class="hui-textarea">
 					<upload ref="rotatingImages" :list="rotatingImages" type="insert" :maxLen="15"></upload>

+ 34 - 47
virgo.wzfrontend/workark/src/views/work/oa/ai/website.vue

@@ -4,51 +4,20 @@
 			<div class="website-form-title">
 				网站信息
 			</div>
-			<div class="hui-flex-box website-form-content">
-				<el-form :model="form" label-position="top">
-					<el-form-item label="企业名称" prop="company_name" :rules="[{required: true, message: '请输入企业名称'}]">
-						<el-input type="text" v-model="form.company_name" placeholder="请输入企业名称"></el-input>
-					</el-form-item>
-					<el-form-item label="企业简称">
-						<el-input type="text" v-model="form.company_sub_name" placeholder="请输入企业简称"></el-input>
-					</el-form-item>
-					<el-form-item label="企业目标">
-						<el-input type="text" v-model="form.target" placeholder="请输入企业目标"></el-input>
-					</el-form-item>
-					<el-form-item label="主营业务">
-						<el-input type="text" v-model="form.business_scope" placeholder="请输入主营业务"></el-input>
-					</el-form-item>
-					<el-form-item label="核心优势">
-						<el-input type="text" v-model="form.key_features" placeholder="请输入核心优势"></el-input>
-					</el-form-item>
-					<el-form-item label="联系方式">
-						<el-input type="text" v-model="form.contact_info" placeholder="请输入联系方式"></el-input>
-					</el-form-item>
-					<el-form-item label="行业领域">
-						<el-input type="text" v-model="form.industry_sector" placeholder="请输入行业领域"></el-input>
-					</el-form-item>
-					<el-form-item label="成立地点与时间">
-						<el-input type="text" v-model="form.time_place" placeholder="请输入成立地点与时间"></el-input>
-					</el-form-item>
-					<el-form-item label="整体风格">
-						<el-input type="text" v-model="form.all_style" placeholder="请输入整体风格"></el-input>
-					</el-form-item>
-				</el-form>
-			</div>
-			<div class="hui-drawer-submit">
-				<el-button type="primary" size="mini">立即生成</el-button>
+			<div class="hui-flex-box">
+				<ai-chat @previewWebSite="previewWebSite"></ai-chat>
 			</div>
 		</div>
 		<div class="website-show hui-flex">
 			<div class="website-form-title">
-				<span>网站展示</span>
+				<span>网站展示</span>
 				<span></span>
 			</div>
 			<div class="hui-flex-box">
 				<div class="no-empty" v-if="!websiteHtml">
-					<el-empty description="暂无AI生成网站"></el-empty>
+					<el-empty description="预览网站"></el-empty>
 				</div>
-				<div v-else v-html="websiteHtml"></div>
+				<div class="html-box" v-else v-html="websiteHtml"></div>
 			</div>
 			<div class="hui-drawer-submit">
 				<el-button type="primary" size="mini" :disabled="!websiteHtml">保存</el-button>
@@ -59,22 +28,28 @@
 </template>
 
 <script>
+	import {
+		getAIData
+	} from '@/api/ai'
+	import aiChat from '@/components/work/common/aiChat.vue'
 	export default {
+		components: {
+			aiChat
+		},
 		data() {
 			return {
-				form: {
-					company_name: '',
-					company_sub_name: '',
-					business_scope: '',
-					key_features: '',
-					contact_info: '',
-					industry_sector: '',
-					time_place: '',
-					all_style: '',
-					target: ''
-				},
 				websiteHtml: ''
 			}
+		},
+		mounted() {
+		},
+		methods: {
+			previewWebSite(html) {
+				this.websiteHtml = html;
+			},
+			handleSend() {
+
+			}
 		}
 	}
 </script>
@@ -83,6 +58,18 @@
 	.ai-website {
 		flex-direction: row;
 
+		.html-box {
+			width: 100%;
+			overflow: hidden;
+		}
+
+		.iframe-class {
+			width: 100%;
+			height: 100%;
+			border: none;
+			overflow: hidden;
+		}
+
 		.website-form-title {
 			height: 44px;
 			line-height: 44px;