whx 1 tydzień temu
rodzic
commit
3f33ea8ee1

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

@@ -69,3 +69,15 @@ export function getHtmlData(data) {
 		data: data
 	})
 }
+/* 
+ * 更新html代码
+ * 
+ * 
+ */
+export function updateHtmlData(data) {
+	return request({
+		url: `/api/ai/htmlCode/update`,
+		method: 'put',
+		data: data
+	})
+}

+ 48 - 5
virgo.wzfrontend/workark/src/components/work/common/aiChat.vue

@@ -12,8 +12,7 @@
 				</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 size="mini" @click="visible = true" style="margin-top: 10px;">
 						点击生成企业官网
 					</el-button>
 				</div>
@@ -79,6 +78,9 @@
 				:autosize="{ minRows: 2, maxRows: 6 }" :disabled="!htmlCode">
 			</el-input>
 			<div class="input-button">
+				<el-button size="mini" @click="selectProduct" :disabled="loading || !htmlCode">
+					添加商品
+				</el-button>
 				<el-button type="primary" size="mini" @click="sendMessage"
 					:disabled="!newMessage.trim() || loading || !htmlCode">
 					发送
@@ -89,11 +91,24 @@
 			:append-to-body="true">
 			<website-form v-if="visible" @callback="callback"></website-form>
 		</el-dialog>
+		<el-dialog :close-on-click-modal="false" title="选择商品" :visible.sync="visibles" width="900px"
+			:append-to-body="true">
+			<div class="hui-flex hui-content hui-dialog">
+				<select-product ref="selectProduct" v-if="visibles"></select-product>
+				<div class="hui-dialog-submit">
+					<el-button size="small" @click="visibles = false">取 消</el-button>
+					<el-button size="small" type="primary" @click="sureProduct" :loading="productLoading">
+						确定
+					</el-button>
+				</div>
+			</div>
+		</el-dialog>
 	</div>
 </template>
 
 <script>
 	import websiteForm from '@/components/work/common/websiteForm.vue'
+	const selectProduct = () => import('@/components/work/common/selectProduct');
 	import {
 		getAIDataStatus,
 		getAIDataList,
@@ -101,7 +116,8 @@
 	} from '@/api/ai'
 	export default {
 		components: {
-			websiteForm
+			websiteForm,
+			selectProduct
 		},
 		data() {
 			return {
@@ -127,7 +143,9 @@
 				},
 				user: {},
 				htmlCode: '',
-				simpleUUID: ''
+				simpleUUID: '',
+				visibles: false,
+				productLoading: false
 			}
 		},
 		mounted() {
@@ -256,7 +274,32 @@
 				this.htmlCode = htmls;
 				this.simpleUUID = simpleUUID;
 				return htmls;
-			}
+			},
+			selectProduct() {
+				this.visibles = true;
+			},
+			sureProduct() {
+				let form = this.$refs.selectProduct.form;
+				let currentRow = this.$refs.selectProduct.currentRow;
+				if (currentRow.length === 0) return this.$message.warning('请至少选择一个商品');
+				createAIData(4, {
+					detailed_html: this.htmlCode,
+					model_name: form.modelName,
+					json_data: currentRow.map(node => {
+						return {
+							id: node.id,
+							name: node.name,
+							subtitme: node.subtitle,
+							img: this.imageUrl(node),
+							unit: '次'
+						}
+					})
+				}).then(this.successFunc);
+			},
+			imageUrl(data) {
+				if (data && JSON.parse(data)[0]) return JSON.parse(data)[0].url;
+				return 'https://assets.api.uizard.io/api/cdn/stream/c05650d2-192b-4a56-ae97-05638f53804c.png';
+			},
 		}
 	}
 </script>

+ 105 - 0
virgo.wzfrontend/workark/src/components/work/common/selectProduct.vue

@@ -0,0 +1,105 @@
+<template>
+	<div class="hui-flex hui-content">
+		<div class="hui-flex-box hui-flex hui-table">
+			<el-form :model="form" label-position="left">
+				<el-form-item label="模块名称">
+					<el-input type="text" v-model="form.modelName" placeholder="请输入模块名称"></el-input>
+				</el-form-item>
+			</el-form>
+			<div class="hui-flex-box">
+				<el-table :data="tableData" row-key="id" height="100%" v-loading="loading"
+					@selection-change="handleSelectionChange">
+					<el-table-column type="selection" width="55">
+					</el-table-column>
+					<el-table-column label="商品名称" prop="name"></el-table-column>
+					<el-table-column label="价格" prop="price"></el-table-column>
+					<el-table-column label="创建时间" prop="createTime"></el-table-column>
+					<el-table-column label="创建时间" prop="updateTime"></el-table-column>
+					<el-table-column label="操作" width="150">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" v-permission="'/work/property/change/detail'"
+									@click="lookItem(scope.row)">
+									详情
+								</span>
+							</div>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<el-empty description="暂无数据"></el-empty>
+					</template>
+				</el-table>
+			</div>
+			<div class="hui-content-pagination">
+				<el-pagination :pager-count="9" layout="prev, pager, next" :page-size="pageSize" :total="totalCount"
+					@current-change="currentChange" background>
+				</el-pagination>
+			</div>
+		</div>
+		<el-drawer title="商品详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer" :detailId="detailId"></detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	const detail = () => import('@/components/work/serve/content/detail');
+	import {
+		getServeListByQueryAndPage
+	} from '@/api/serve'
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				detailId: '',
+				filterOption: {},
+				loading: false,
+				drawer: false,
+				currentRow: [],
+				form: {
+					modelName: '商品列表'
+				}
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				let filterOption = {
+					organizationId: this.$store.getters.organization.id,
+					state: 1
+				};
+				filterOption = Object.assign(filterOption, this.filterOption);
+				this.loading = true;
+				getServeListByQueryAndPage(this.currPage, this.pageSize, filterOption).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+					this.loading = false;
+				})
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			lookItem(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			handleSelectionChange(row) {
+				this.currentRow = row;
+			}
+		},
+		components: {
+			detail
+		}
+	}
+</script>
+
+<style>
+</style>

+ 57 - 0
virgo.wzfrontend/workark/src/components/work/common/websiteUpload.vue

@@ -0,0 +1,57 @@
+<template>
+	<div class="datacenter-upload">
+		<el-upload :action="action" name="uploadFile" ref="upload" :headers="headers" :on-success="successFile"
+			:before-upload="beforeUpload" :on-error="errorUpload" :show-file-list="false" :on-progress="progress">
+			<div class="bim-update-button">
+				<i class="el-icon-plus"></i>
+			</div>
+		</el-upload>
+	</div>
+</template>
+
+<script>
+	import config from '@/config';
+	import {
+		getToken
+	} from '@/uitls/auth';
+	export default {
+		data() {
+			return {
+				action: '',
+				headers: {}
+			};
+		},
+		created() {
+			this.action = config.baseURL + '/file/filenode/-1';
+			this.headers.token = getToken();
+		},
+		methods: {
+			beforeUpload() {
+				this.$loading();
+			},
+			progress(e) {
+				let percent = e.percent >= 100 ? 99 : parseInt(e.percent)
+				this.$loading({
+					percent: (percent + '%')
+				});
+			},
+			reloadUpload() {
+				this.$refs['upload'].$children[0].$refs.input.click();
+			},
+			errorUpload() {
+				this.$loading.close();
+				this.$message.error('上传失败');
+			},
+			successFile(response) {
+				this.$message.success('上传成功');
+				let data = response.data;
+				this.$emit('reload', data.node.url);
+				this.$loading.close();
+			},
+		}
+	};
+</script>
+
+<style lang="scss">
+	.datacenter-upload {}
+</style>

+ 6 - 5
virgo.wzfrontend/workark/src/components/work/finace/contract/selectContract.vue

@@ -6,7 +6,8 @@
 			</contract-upload>
 		</div>
 		<div class="hui-flex-box">
-			<el-table ref="elTable" :data="tableData" height="100%" v-loading="loading"@current-change="handleCurrentChange">
+			<el-table ref="elTable" :data="tableData" height="100%" v-loading="loading"
+				@current-change="handleCurrentChange">
 				<el-table-column width="35" v-if="type === 'filter'">
 					<template slot-scope="scope">
 						<el-radio class="radio" :label="scope.row" v-model="currentRow">{{""}}</el-radio>
@@ -69,13 +70,13 @@
 				getOrganizationContract(this.$store.getters.organization.id).then(res => {
 					this.loading = false;
 					if (res.state) {
-						this.tableData = res.data;
+						this.tableData = res.data;
 						if (this.type === 'filter') this.currentRow = this.tableData[0];
 					}
 				})
-			},
-			handleCurrentChange(row) {
-				this.currentRow = row;
+			},
+			handleCurrentChange(row) {
+				this.currentRow = row;
 			},
 			upload(id) {
 				this.contractId = id;

+ 99 - 9
virgo.wzfrontend/workark/src/views/work/oa/ai/website.vue

@@ -11,19 +11,30 @@
 		<div class="website-show hui-flex">
 			<div class="website-form-title">
 				<span>网站展示</span>
-				<span></span>
+				<website-upload ref="upload" v-show="false" @reload="successFunc">
+				</website-upload>
 			</div>
 			<div class="hui-flex-box">
 				<div class="no-empty" v-if="!websiteUrl">
 					<el-empty description="请先预览网站"></el-empty>
 				</div>
 				<div class="html-box" v-else v-loading="loading">
-					<iframe :src="websiteUrl" width="100%" height="100%" frameborder="0" @load="onloadIframe">
+					<iframe ref="iframeDom" :src="websiteUrl" width="100%" height="100%" frameborder="0"
+						@load="onloadIframe">
 					</iframe>
 				</div>
 			</div>
 			<div class="hui-drawer-submit">
-				<el-button type="primary" size="mini" :disabled="!websiteUrl" @click="submit">发布</el-button>
+				<el-button size="mini" :disabled="!websiteUrl" @click="cancelIframe" v-if="iframeEdit">取消</el-button>
+				<el-button type="primary" size="mini" :disabled="!websiteUrl" @click="saveIframe" v-if="iframeEdit">
+					保存
+				</el-button>
+				<el-button type="primary" size="mini" :disabled="!websiteUrl" @click="editIframe" v-if="!iframeEdit">
+					编辑
+				</el-button>
+				<el-button type="primary" size="mini" :disabled="!websiteUrl" @click="submit" v-if="!iframeEdit">
+					发布
+				</el-button>
 			</div>
 		</div>
 	</div>
@@ -33,38 +44,49 @@
 	import {
 		getAIData,
 		saveHtmlData,
-		getHtmlData
+		getHtmlData,
+		updateHtmlData
 	} from '@/api/ai'
 	import aiChat from '@/components/work/common/aiChat.vue'
+	import websiteUpload from '@/components/work/common/websiteUpload.vue'
+	import config from '@/config'
 	export default {
 		components: {
-			aiChat
+			aiChat,
+			websiteUpload
 		},
 		data() {
 			return {
 				websiteUrl: '',
 				loading: false,
-				simpleUUID: ''
+				simpleUUID: '',
+				iframeEdit: false,
+				imageELement: null,
+				htmlData: {}
 			}
 		},
 		mounted() {},
 		methods: {
 			async previewWebSite(html, simpleUUID) {
 				if (this.simpleUUID === simpleUUID) return;
+				this.iframeEdit = false;
 				this.loading = true;
 				this.simpleUUID = simpleUUID;
 				let htmlData = await getHtmlData({
 					simpleUUID: simpleUUID
 				})
 				if (!htmlData.state) return this.websiteUrl = '';
-				if (htmlData.data.length > 0) return this.websiteUrl =
-					`https://workark.com/api/enterprise/${simpleUUID}`
+				if (htmlData.data.length > 0) {
+					this.htmlData = htmlData.data[0];
+					return this.websiteUrl = `${config.baseURL}/api/enterprise/${simpleUUID}`
+				}
 				let saveData = await saveHtmlData({
 					data: html,
 					simpleUUID: simpleUUID
 				})
 				if (!saveData.state) return this.websiteUrl = '';
-				this.websiteUrl = `https://workark.com/api/enterprise/${simpleUUID}`;
+				this.htmlData = saveData.data;
+				return this.websiteUrl = `${config.baseURL}/api/enterprise/${simpleUUID}`
 			},
 			submit() {
 				this.$confirm('是否发布该官网?', () => {
@@ -79,6 +101,74 @@
 			},
 			onloadIframe() {
 				this.loading = false;
+
+			},
+			cancelIframe() {
+				const iframe = this.$refs.iframeDom;
+				iframe.contentWindow.location.reload();
+				this.iframeEdit = false;
+			},
+			saveIframe() {
+				const iframe = this.$refs.iframeDom;
+				const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
+				const a = iframeDoc.querySelectorAll('a');
+				a.forEach(element => {
+					element.href = element.oldHref;
+					element.removeAttribute('oldHref');
+				});
+				const allElements = iframeDoc.querySelectorAll('*');
+				allElements.forEach(element => {
+					element.removeAttribute('contentEditable');
+				});
+				const img = iframeDoc.querySelectorAll('img');
+				img.forEach(element => {
+					element.style.cursor = 'pointer';
+					element.onclick = null;
+				});
+				const iframeDocs = iframe.contentDocument || iframe.contentWindow.document;
+				const htmlContent = iframeDocs.documentElement.outerHTML;
+				updateHtmlData({
+					data: htmlContent,
+					id: this.htmlData.id
+				}).then(res => {
+					if (res.state) {
+						this.$message.success('操作成功');
+						this.iframeEdit = false;
+					}
+				})
+			},
+			editIframe() {
+				let _self = this;
+				const iframe = _self.$refs.iframeDom;
+				if (iframe.contentDocument) {
+					const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
+					//编辑时a标签不要跳转
+					const a = iframeDoc.querySelectorAll('a');
+					a.forEach(element => {
+						element.oldHref = element.href;
+						element.href = 'javascript:void(0);'
+					});
+					// 获取页面所有元素
+					const allElements = iframeDoc.querySelectorAll('*');
+					// 为每个元素设置contenteditable=true
+					allElements.forEach(element => {
+						if (element.nodeName !== 'IMG') element.contentEditable = 'true';
+					});
+					// 获取页面所有元素
+					const img = iframeDoc.querySelectorAll('img');
+					// 为每个元素设置contenteditable=true
+					img.forEach(element => {
+						element.style.cursor = 'pointer';
+						element.onclick = function() {
+							_self.imageELement = this;
+							_self.$refs.upload.reloadUpload();
+						}
+					});
+					_self.iframeEdit = true;
+				}
+			},
+			successFunc(url) {
+				if (this.imageELement) this.imageELement.src = url;
 			},
 			handleSend() {