whx пре 2 месеци
родитељ
комит
fb5e153314
24 измењених фајлова са 885 додато и 340 уклоњено
  1. BIN
      virgo.wzfrontend/workark/public/assets/android_code.png
  2. BIN
      virgo.wzfrontend/workark/public/assets/ios_code.png
  3. BIN
      virgo.wzfrontend/workark/public/assets/wechat_code.jpg
  4. BIN
      virgo.wzfrontend/workark/public/favicon.ico
  5. 1 1
      virgo.wzfrontend/workark/src/api/property.js
  6. 60 0
      virgo.wzfrontend/workark/src/api/serve.js
  7. 11 0
      virgo.wzfrontend/workark/src/api/system.js
  8. 103 0
      virgo.wzfrontend/workark/src/components/website/productItem.vue
  9. 2 2
      virgo.wzfrontend/workark/src/components/work/organization/depart/edit.vue
  10. 124 124
      virgo.wzfrontend/workark/src/components/work/organization/manager/edit.vue
  11. 1 1
      virgo.wzfrontend/workark/src/components/work/organization/seal/detail.vue
  12. 106 106
      virgo.wzfrontend/workark/src/components/work/organization/seal/edit.vue
  13. 44 64
      virgo.wzfrontend/workark/src/components/work/organization/user/detail.vue
  14. 71 0
      virgo.wzfrontend/workark/src/components/work/serve/content/detail.vue
  15. 111 8
      virgo.wzfrontend/workark/src/components/work/serve/content/edit.vue
  16. 125 0
      virgo.wzfrontend/workark/src/layout/components/indexFoot.vue
  17. 1 1
      virgo.wzfrontend/workark/src/layout/components/topNav.vue
  18. 4 1
      virgo.wzfrontend/workark/src/layout/indexLayout.vue
  19. 57 6
      virgo.wzfrontend/workark/src/views/index.vue
  20. 1 1
      virgo.wzfrontend/workark/src/views/work/property/change.vue
  21. 1 1
      virgo.wzfrontend/workark/src/views/work/property/depreciation.vue
  22. 1 1
      virgo.wzfrontend/workark/src/views/work/property/inventory.vue
  23. 1 1
      virgo.wzfrontend/workark/src/views/work/property/register.vue
  24. 60 22
      virgo.wzfrontend/workark/src/views/work/serve/content.vue

BIN
virgo.wzfrontend/workark/public/assets/android_code.png


BIN
virgo.wzfrontend/workark/public/assets/ios_code.png


BIN
virgo.wzfrontend/workark/public/assets/wechat_code.jpg


BIN
virgo.wzfrontend/workark/public/favicon.ico


+ 1 - 1
virgo.wzfrontend/workark/src/api/property.js

@@ -34,7 +34,7 @@ export function getDevicePartListByQuery(data) {
 	})
 }
 /* 
- * 通过条件获取资产列表
+ * 导出资产列表
  * 
  * 
  */

+ 60 - 0
virgo.wzfrontend/workark/src/api/serve.js

@@ -0,0 +1,60 @@
+import request from '@/axios'
+
+/* 
+ * 通过条件获取服务列表
+ * 
+ * 
+ */
+export function getServeListByQuery(currPage, pageSize, data) {
+	return request({
+		url: `/api/workarkProduct/${currPage}/${pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 通过id获取服务详情
+ * 
+ * 
+ */
+export function getServeById(id) {
+	return request({
+		url: `/api/workarkProduct/${id}`,
+		method: 'get',
+	})
+}
+/* 
+ * 新增服务
+ * 
+ * 
+ */
+export function insertServe(data) {
+	return request({
+		url: `/api/workarkProduct`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑服务
+ * 
+ * 
+ */
+export function updateServe(data) {
+	return request({
+		url: `/api/workarkProduct/update`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除服务
+ * 
+ * 
+ */
+export function deleteServeById(id) {
+	return request({
+		url: `/api/workarkProduct/delete/${id}`,
+		method: 'delete'
+	})
+}

+ 11 - 0
virgo.wzfrontend/workark/src/api/system.js

@@ -108,4 +108,15 @@ export function getServeDepartmentBySign(sign) {
 		url: `/api/workarkProductLevel/getSign/${sign}`,
 		method: 'get'
 	})
+}
+/* 
+ * 删除资产目录
+ * 
+ * 
+ */
+export function getServeProductList(id) {
+	return request({
+		url: `/api/workarkProductLevel/getParentId/${id}`,
+		method: 'get'
+	})
 }

+ 103 - 0
virgo.wzfrontend/workark/src/components/website/productItem.vue

@@ -0,0 +1,103 @@
+<template>
+	<div class="product-item">
+		<div class="product-item-image">
+			<img :src="imageUrl(item.listDisplayImage)" :alt="item.name" />
+		</div>
+		<div class="product-content">
+			<div class="product-item-title hui-ellipsis">{{item.name}}</div>
+			<div class="space hui-ellipsis">{{item.intro}}</div>
+			<div class="pirce">
+				<span class="number">{{item.price}}</span>
+				<span class="unit"> 元/次</span>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['item'],
+		methods: {
+			imageUrl() {
+				let data = this.item.listDisplayImage;
+				if (!data) return 'https://assets.api.uizard.io/api/cdn/stream/c05650d2-192b-4a56-ae97-05638f53804c.png';
+				return JSON.parse(data)[0].url;
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.product-item {
+		width: 275px;
+		background: $--color-white;
+		border-radius: 8px;
+		box-sizing: border-box;
+		position: relative;
+		cursor: pointer;
+		box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.1);
+		overflow: hidden;
+		padding: 15px;
+		box-sizing: border-box;
+		margin-right: 20px;
+		margin-bottom: 20px;
+
+		.product-item-image {
+			width: 100%;
+			height: 180px;
+			overflow: hidden;
+			border-radius: 8px;
+		}
+
+		img {
+			width: 100%;
+			height: 100%;
+			border: 0;
+			vertical-align: top;
+			transition: all 0.7s;
+		}
+
+		&:nth-child(4n) {
+			margin-right: 0;
+		}
+
+		&:hover {
+			img {
+				transform: scale(1.05);
+			}
+		}
+
+		.product-content {
+			padding-top: 15px;
+		}
+
+		.product-item-title {
+			font-size: 16px;
+			font-weight: 600;
+			margin-bottom: 7px;
+		}
+
+		.space {
+			color: $--color-text-regular;
+			font-size: $--font-size-small;
+			margin-bottom: 3px;
+		}
+
+		.pirce {
+			color: $--color-danger;
+			display: flex;
+			align-items: end;
+
+			.number {
+				font-size: 20px;
+				font-weight: 600;
+				height: 20px;
+			}
+
+			.unit {
+				height: 15px;
+				font-size: 12px;
+			}
+		}
+	}
+</style>

+ 2 - 2
virgo.wzfrontend/workark/src/components/work/organization/depart/edit.vue

@@ -29,8 +29,8 @@
 		insertDepartment,
 		updateDepartment
 	} from '@/api/organization'
-	import upload from '@/components/common/upload'
-	import cc from '@/components/common/cc'
+	const upload = () => import('@/components/common/upload');
+	const cc = () => import('@/components/common/cc');
 	export default {
 		props: ['isUpdate', 'part', 'projectId'],
 		data() {

+ 124 - 124
virgo.wzfrontend/workark/src/components/work/organization/manager/edit.vue

@@ -1,125 +1,125 @@
-<template>
-	<div class="hui-flex hui-dialog">
-		<div class="hui-flex-box hui-dialog-content">
-			<el-form ref="informationForm" label-position="top" :model="informationForm">
-				<el-form-item label="组织代码">
-					<el-input type="text" :value="informationForm.organizationCode" disabled></el-input>
-				</el-form-item>
-				<el-form-item label="组织名称" prop="name">
-					<el-input type="text" v-model="informationForm.name"></el-input>
-				</el-form-item>
-				<el-form-item label="联系人" prop="contact">
-					<el-input type="text" v-model="informationForm.contact"></el-input>
-				</el-form-item>
-				<el-form-item label="联系方式" prop="contactTel">
-					<el-input type="text" v-model="informationForm.contactTel" disabled></el-input>
-				</el-form-item>
-				<el-form-item label="组织地址" prop="address">
-					<city v-model="informationForm.address"></city>
-				</el-form-item>
-				<el-form-item label="详细地址">
-					<el-input type="text" v-model="informationForm.detailAddress"></el-input>
-				</el-form-item>
-				<el-form-item label="公司简介" class="hui-textarea">
-					<el-input type="textarea" v-model="informationForm.introduction" placeholder="请输入公司简介"
-						resize="none">
-					</el-input>
-				</el-form-item>
-				<el-form-item label="LOGO" class="hui-textarea">
-					<upload ref="uploadLogo" :list="informationForm.logo" :maxLen="1" type="insert" text="上传LOGO">
-					</upload>
-				</el-form-item>
-				<el-form-item label="附件" class="hui-textarea">
-					<upload ref="upload" :list="informationForm.businessLicense" type="insert">
-					</upload>
-				</el-form-item>
-			</el-form>
-		</div>
-		<div class="hui-dialog-submit">
-			<el-button size="small" @click="$emit('callback')">取 消</el-button>
-			<el-button size="small" :loading="loading" type="primary" @click="submit">保 存</el-button>
-		</div>
-	</div>
-</template>
-
-<script>
-	import upload from '@/components/common/upload'
-	import city from '@/components/common/city'
-	import {
-		updateOrganization,
-	} from '@/api/organization'
-	export default {
-		data() {
-			return {
-				informationForm: {
-					organizationCode: '',
-					name: '',
-					contact: '',
-					contactTel: '',
-					address: [],
-					businessLicense: [],
-					logo: [],
-					detailAddress: '',
-					introduction: ''
-				},
-				isUpdate: true,
-				loading: false
-			}
-		},
-		mounted() {
-			let obj = JSON.parse(JSON.stringify(this.$store.getters.organization));
-			obj.address = obj['address'] ? JSON.parse(obj.address) : [];
-			obj.businessLicense = obj['businessLicense'] ? JSON.parse(obj.businessLicense) : [];
-			obj.logo = obj['logo'] ? [JSON.parse(obj.logo)] : [];
-			this.informationForm = Object.assign(this.informationForm, obj);
-		},
-		methods: {
-			submit() {
-				let postData = JSON.parse(JSON.stringify(this.informationForm));
-				postData['businessLicense'] = JSON.stringify(this.$refs.upload.fileList);
-				postData['address'] = JSON.stringify(postData.address);
-				postData['logo'] = this.$refs.uploadLogo.fileList.length === 0 ? '{}' : JSON.stringify(this.$refs
-					.uploadLogo.fileList[0]);
-				this.loading = true;
-				updateOrganization(postData).then(res => {
-					if (res.state) {
-						this.$message.success('操作成功');
-						this.$store.dispatch('app/changeOrganization', postData);
-						this.$emit('callback', 'init');
-					}
-					this.loading = false;
-				})
-			}
-		},
-		components: {
-			upload,
-			city
-		},
-	}
-</script>
-
-<style lang="scss">
-	.organization-information {
-		width: 100%;
-		height: 100%;
-
-		.hui-title {
-			.el-icon-edit-outline {
-				font-size: 18px;
-				cursor: pointer;
-				color: $--color-primary;
-				padding: 0 8px;
-			}
-		}
-
-		.el-form {
-			padding-top: 10px;
-			padding-right: 10px;
-		}
-
-		.work-people-user-information-submit {
-			padding: 10px;
-			text-align: right;
-		}
-	}
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="informationForm" label-position="top" :model="informationForm">
+				<el-form-item label="组织代码">
+					<el-input type="text" :value="informationForm.organizationCode" disabled></el-input>
+				</el-form-item>
+				<el-form-item label="组织名称" prop="name">
+					<el-input type="text" v-model="informationForm.name"></el-input>
+				</el-form-item>
+				<el-form-item label="联系人" prop="contact">
+					<el-input type="text" v-model="informationForm.contact"></el-input>
+				</el-form-item>
+				<el-form-item label="联系方式" prop="contactTel">
+					<el-input type="text" v-model="informationForm.contactTel" disabled></el-input>
+				</el-form-item>
+				<el-form-item label="组织地址" prop="address">
+					<city v-model="informationForm.address"></city>
+				</el-form-item>
+				<el-form-item label="详细地址">
+					<el-input type="text" v-model="informationForm.detailAddress"></el-input>
+				</el-form-item>
+				<el-form-item label="公司简介" class="hui-textarea">
+					<el-input type="textarea" v-model="informationForm.introduction" placeholder="请输入公司简介"
+						resize="none">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="LOGO" class="hui-textarea">
+					<upload ref="uploadLogo" :list="informationForm.logo" :maxLen="1" type="insert" text="上传LOGO">
+					</upload>
+				</el-form-item>
+				<el-form-item label="附件" class="hui-textarea">
+					<upload ref="upload" :list="informationForm.businessLicense" type="insert">
+					</upload>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" :loading="loading" type="primary" @click="submit">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	const upload = () => import('@/components/common/upload');
+	const city = () => import('@/components/common/city');
+	import {
+		updateOrganization,
+	} from '@/api/organization'
+	export default {
+		data() {
+			return {
+				informationForm: {
+					organizationCode: '',
+					name: '',
+					contact: '',
+					contactTel: '',
+					address: [],
+					businessLicense: [],
+					logo: [],
+					detailAddress: '',
+					introduction: ''
+				},
+				isUpdate: true,
+				loading: false
+			}
+		},
+		mounted() {
+			let obj = JSON.parse(JSON.stringify(this.$store.getters.organization));
+			obj.address = obj['address'] ? JSON.parse(obj.address) : [];
+			obj.businessLicense = obj['businessLicense'] ? JSON.parse(obj.businessLicense) : [];
+			obj.logo = obj['logo'] ? [JSON.parse(obj.logo)] : [];
+			this.informationForm = Object.assign(this.informationForm, obj);
+		},
+		methods: {
+			submit() {
+				let postData = JSON.parse(JSON.stringify(this.informationForm));
+				postData['businessLicense'] = JSON.stringify(this.$refs.upload.fileList);
+				postData['address'] = JSON.stringify(postData.address);
+				postData['logo'] = this.$refs.uploadLogo.fileList.length === 0 ? '{}' : JSON.stringify(this.$refs
+					.uploadLogo.fileList[0]);
+				this.loading = true;
+				updateOrganization(postData).then(res => {
+					if (res.state) {
+						this.$message.success('操作成功');
+						this.$store.dispatch('app/changeOrganization', postData);
+						this.$emit('callback', 'init');
+					}
+					this.loading = false;
+				})
+			}
+		},
+		components: {
+			upload,
+			city
+		},
+	}
+</script>
+
+<style lang="scss">
+	.organization-information {
+		width: 100%;
+		height: 100%;
+
+		.hui-title {
+			.el-icon-edit-outline {
+				font-size: 18px;
+				cursor: pointer;
+				color: $--color-primary;
+				padding: 0 8px;
+			}
+		}
+
+		.el-form {
+			padding-top: 10px;
+			padding-right: 10px;
+		}
+
+		.work-people-user-information-submit {
+			padding: 10px;
+			text-align: right;
+		}
+	}
 </style>

+ 1 - 1
virgo.wzfrontend/workark/src/components/work/organization/seal/detail.vue

@@ -23,7 +23,7 @@
 	import {
 		getSealDetailById
 	} from '@/api/organization'
-	import upload from '@/components/common/upload'
+	const upload = () => import('@/components/common/upload');
 	export default {
 		props: ['detailId'],
 		data() {

+ 106 - 106
virgo.wzfrontend/workark/src/components/work/organization/seal/edit.vue

@@ -1,107 +1,107 @@
-<template>
-	<div class="hui-flex hui-dialog">
-		<div class="hui-flex-box hui-dialog-content">
-			<el-form ref="sealForm" :model="sealForm" label-position="top">
-				<el-form-item label="印章名称">
-					<el-input type="text" v-model="sealForm.name" placeholder="请输入印章名称"></el-input>
-				</el-form-item>
-				<el-form-item label="印章类型" prop="type" :rules="[{required: true, message: '请选择印章类型'}]">
-					<el-select v-model="sealForm.type" placeholder="请选择印章类型">
-						<el-option :label="item.name" :value="item.id" v-for="(item,index) in $field.field.sealType"
-							:key="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="印章描述" class="hui-textarea">
-					<el-input type="textarea" v-model="sealForm.comment" placeholder="请输入印章描述" resize="none">
-					</el-input>
-				</el-form-item>
-				<el-form-item label="印章图片" class="hui-textarea">
-					<upload ref="upload" :list="responsibility" type="insert" :maxLen="1"></upload>
-				</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 {
-		insertSeal,
-		getSealDetailById,
-		updateSeal
-	} from '@/api/organization'
-	import upload from '@/components/common/upload'
-	export default {
-		props: ['isUpdate', 'detailId'],
-		data() {
-			return {
-				sealForm: {
-					name: '',
-					type: 1,
-					comment: ''
-				},
-				responsibility: [],
-				loading: false
-			}
-		},
-		mounted() {
-			if (this.isUpdate) {
-				getSealDetailById(this.detailId).then(res => {
-					if (res.state) {
-						let data = res.data;
-						this.sealForm['id'] = data.id;
-						this.sealForm['name'] = data.name;
-						this.sealForm['comment'] = data.comment;
-						this.sealForm['type'] = data.type;
-						let fileNode = data.fileNode;
-						let typeList = fileNode.name.split('.');
-						this.responsibility = [{
-							id: fileNode.id,
-							name: fileNode.name,
-							url: fileNode.node.url,
-							type: typeList[typeList.length - 1]
-						}];
-					}
-				})
-			} else {
-				this.sealForm['organizationId'] = this.$store.getters.organization.id;
-			}
-		},
-		methods: {
-			submit() {
-				this.loading = true;
-				let fileList = this.$refs.upload.fileList;
-				if (fileList.length < 1) {
-					this.loading = false;
-					this.$message.warning('请上传印章');
-				}
-				this.sealForm['fileNodeId'] = fileList[0].id;
-				if (this.isUpdate) {
-					updateSeal(this.sealForm).then(this.successFunc)
-				} else {
-					insertSeal(this.sealForm).then(this.successFunc)
-				}
-			},
-			successFunc(res) {
-				this.loading = false;
-				if (res.state) {
-					this.$message.success('操作成功');
-					this.$emit('callback', 'init');
-				}
-			}
-		},
-		components: {
-			upload
-		},
-	}
-</script>
-
-<style lang="scss">
-	.seal-form {
-		padding: 10px;
-	}
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="sealForm" :model="sealForm" label-position="top">
+				<el-form-item label="印章名称">
+					<el-input type="text" v-model="sealForm.name" placeholder="请输入印章名称"></el-input>
+				</el-form-item>
+				<el-form-item label="印章类型" prop="type" :rules="[{required: true, message: '请选择印章类型'}]">
+					<el-select v-model="sealForm.type" placeholder="请选择印章类型">
+						<el-option :label="item.name" :value="item.id" v-for="(item,index) in $field.field.sealType"
+							:key="item.id">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="印章描述" class="hui-textarea">
+					<el-input type="textarea" v-model="sealForm.comment" placeholder="请输入印章描述" resize="none">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="印章图片" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert" :maxLen="1"></upload>
+				</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 {
+		insertSeal,
+		getSealDetailById,
+		updateSeal
+	} from '@/api/organization'
+	const upload = () => import('@/components/common/upload');
+	export default {
+		props: ['isUpdate', 'detailId'],
+		data() {
+			return {
+				sealForm: {
+					name: '',
+					type: 1,
+					comment: ''
+				},
+				responsibility: [],
+				loading: false
+			}
+		},
+		mounted() {
+			if (this.isUpdate) {
+				getSealDetailById(this.detailId).then(res => {
+					if (res.state) {
+						let data = res.data;
+						this.sealForm['id'] = data.id;
+						this.sealForm['name'] = data.name;
+						this.sealForm['comment'] = data.comment;
+						this.sealForm['type'] = data.type;
+						let fileNode = data.fileNode;
+						let typeList = fileNode.name.split('.');
+						this.responsibility = [{
+							id: fileNode.id,
+							name: fileNode.name,
+							url: fileNode.node.url,
+							type: typeList[typeList.length - 1]
+						}];
+					}
+				})
+			} else {
+				this.sealForm['organizationId'] = this.$store.getters.organization.id;
+			}
+		},
+		methods: {
+			submit() {
+				this.loading = true;
+				let fileList = this.$refs.upload.fileList;
+				if (fileList.length < 1) {
+					this.loading = false;
+					this.$message.warning('请上传印章');
+				}
+				this.sealForm['fileNodeId'] = fileList[0].id;
+				if (this.isUpdate) {
+					updateSeal(this.sealForm).then(this.successFunc)
+				} else {
+					insertSeal(this.sealForm).then(this.successFunc)
+				}
+			},
+			successFunc(res) {
+				this.loading = false;
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		},
+		components: {
+			upload
+		},
+	}
+</script>
+
+<style lang="scss">
+	.seal-form {
+		padding: 10px;
+	}
 </style>

+ 44 - 64
virgo.wzfrontend/workark/src/components/work/organization/user/detail.vue

@@ -1,65 +1,45 @@
-<template>
-	<div class="hui-detail">
-		<div class="hui-detail-title">基础信息</div>
-		<div class="hui-detail-content">
-			<div class="hui-detail-item">
-				<div class="hui-detail-label">头像</div>
-				<div class="hui-detail-value">
-					<div style="width: 40px;height: 40px;border-radius: 4px;overflow: hidden;">
-						<avatar :user="user" :size="18"></avatar>
-					</div>
-				</div>
-			</div>
-			<div class="hui-detail-item">
-				<div class="hui-detail-label">名称</div>
-				<div class="hui-detail-value">{{user.name}}</div>
-			</div>
-			<div class="hui-detail-item">
-				<div class="hui-detail-label">性别</div>
-				<div class="hui-detail-value">{{user.sex == 'M'?'男':'女'}}</div>
-			</div>
-			<div class="hui-detail-item">
-				<div class="hui-detail-label">电话</div>
-				<div class="hui-detail-value">{{user.phone}}</div>
-			</div>
-			<div class="hui-detail-item">
-				<div class="hui-detail-label">部门</div>
-				<div class="hui-detail-value">{{user.partName}}</div>
-			</div>
-		</div>
-	</div>
-</template>
-
-<script>
-	import {
-		getOperationUserInfo
-	} from '@/api/loginRegister'
-	export default {
-		props: ['user'],
-		data() {
-			return {
-				type: 1,
-				operateUserInfo: {}
-			}
-		},
-		mounted() {
-			if (this.user.id) this.init();
-		},
-		methods: {
-			init() {
-				getOperationUserInfo({
-					projectId: this.$store.getters.project.id,
-					operateOrganizationId: this.$store.getters.organization.id,
-					userId: this.user.id
-				}).then(res => {
-					if (res.state) {
-						this.operateUserInfo = res.data || {}
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style>
+<template>
+	<div class="hui-detail">
+		<div class="hui-detail-title">基础信息</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">头像</div>
+				<div class="hui-detail-value">
+					<div style="width: 40px;height: 40px;border-radius: 4px;overflow: hidden;">
+						<avatar :user="user" :size="18"></avatar>
+					</div>
+				</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">名称</div>
+				<div class="hui-detail-value">{{user.name}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">性别</div>
+				<div class="hui-detail-value">{{user.sex == 'M'?'男':'女'}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">电话</div>
+				<div class="hui-detail-value">{{user.phone}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">部门</div>
+				<div class="hui-detail-value">{{user.partName}}</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['user'],
+		data() {
+			return {}
+		},
+		mounted() {},
+		methods: {}
+	}
+</script>
+
+<style>
 </style>

+ 71 - 0
virgo.wzfrontend/workark/src/components/work/serve/content/detail.vue

@@ -0,0 +1,71 @@
+<template>
+	<div class="hui-detail">
+		<div class="hui-detail-title">基础信息</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">服务名称</div>
+				<div class="hui-detail-value">{{detail.name}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">服务类型</div>
+				<div class="hui-detail-value">{{detail.type}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">价格(元)</div>
+				<div class="hui-detail-value">{{detail.price}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">服务介绍</div>
+				<div class="hui-detail-value">{{detail.intro}}</div>
+			</div>
+		</div>
+		<div class="hui-detail-title">展示图片</div>
+		<div class="hui-detail-content hui-detail-image">
+			<upload :list="detail.listDisplayImage ? JSON.parse(detail.listDisplayImage) : []" type="preview">
+			</upload>
+		</div>
+		<div class="hui-detail-title">服务配图</div>
+		<div class="hui-detail-content hui-detail-image">
+			<upload :list="detail.rotatingImages ? JSON.parse(detail.rotatingImages) : []" type="preview">
+			</upload>
+		</div>
+		<div class="hui-detail-title">详情配图</div>
+		<div class="hui-detail-content hui-detail-image">
+			<upload :list="detail.detailedImage ? JSON.parse(detail.detailedImage) : []" type="preview">
+			</upload>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getServeById
+	} from '@/api/serve'
+	const upload = () => import('@/components/common/upload');
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {}
+			}
+		},
+		mounted() {
+			if (this.detailId) this.init();
+		},
+		methods: {
+			init() {
+				getServeById(this.detailId).then(res => {
+					if (res.state) {
+						this.detail = res.data;
+					}
+				})
+			}
+		},
+		components: {
+			upload
+		}
+	}
+</script>
+
+<style>
+</style>

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

@@ -1,8 +1,111 @@
-<template>
-</template>
-
-<script>
-</script>
-
-<style>
-</style>
+<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.name" placeholder="请输入服务名称"></el-input>
+				</el-form-item>
+				<el-form-item label="服务类型">
+					<el-input type="text" v-model="form.type" placeholder="请输入服务类型">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="价格(元)">
+					<el-input type="text" v-model="form.price" @input="handleInput($event)" placeholder="请输入价格">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="服务介绍" class="hui-textarea">
+					<el-input type="textarea" v-model="form.intro" placeholder="请输入服务介绍" resize="none"></el-input>
+				</el-form-item>
+				<el-form-item label="展示图片" class="hui-textarea">
+					<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>
+				</el-form-item>
+				<el-form-item label="详情配图" class="hui-textarea">
+					<upload ref="detailedImage" :list="detailedImage" type="insert" :maxLen="15"></upload>
+				</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 {
+		insertServe,
+		updateServe,
+		getServeById
+	} from '@/api/serve'
+	const upload = () => import('@/components/common/upload');
+	export default {
+		props: ['isUpdate', 'detailId', 'productLevelId'],
+		data() {
+			return {
+				form: {
+					name: '',
+					type: 1,
+					price: '',
+					intro: ''
+				},
+				loading: false,
+				listDisplayImage: [],
+				rotatingImages: [],
+				detailedImage: []
+			}
+		},
+		mounted() {
+			if (this.isUpdate) {
+				getServeById(this.detailId).then(res => {
+					if (res.state) {
+						this.form = res.data;
+						if (this.form.listDisplayImage) this.listDisplayImage = JSON.parse(this.form
+							.listDisplayImage);
+						if (this.form.rotatingImages) this.rotatingImages = JSON.parse(this.form.rotatingImages);
+						if (this.form.detailedImage) this.detailedImage = JSON.parse(this.form.detailedImage);
+					}
+				})
+			} else {
+				this.form['productLevelId'] = this.productLevelId;
+				this.form['organizationId'] = this.$store.getters.organization.id;
+			}
+		},
+		components: {
+			upload
+		},
+		methods: {
+			handleInput(val) {
+				let dat = ("" + val)
+					.replace(/[^\d^\.]+/g, "")
+					.replace(/^0+(\d)/, "$1")
+					.replace(/^\./, "0.")
+					.match(/^\d*(\.?\d{0,2})/g)[0] || "";
+				this.form.price = dat;
+			},
+			submit() {
+				this.loading = true;
+				let postData = JSON.parse(JSON.stringify(this.form));
+				postData['listDisplayImage'] = JSON.stringify(this.$refs.listDisplayImage.fileList);
+				postData['rotatingImages'] = JSON.stringify(this.$refs.rotatingImages.fileList);
+				postData['detailedImage'] = JSON.stringify(this.$refs.detailedImage.fileList);
+				if (this.isUpdate) {
+					updateServe(postData).then(this.successFunc)
+				} else {
+					insertServe(postData).then(this.successFunc)
+				}
+			},
+			successFunc(res) {
+				this.loading = false;
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 125 - 0
virgo.wzfrontend/workark/src/layout/components/indexFoot.vue

@@ -0,0 +1,125 @@
+<template>
+	<footer id="tell" class="footer">
+		<div class="footer-box">
+			<div class="footer-content" v-if="type === 'all'">
+				<div class="footer-download">
+					<div class="footer-title">产品下载</div>
+					<div class="footer-qr">
+						<div class="qr-item">
+							<img src="/assets/android_code.png" alt="" />
+							<div class="qr-name">扫码下载安卓APP</div>
+						</div>
+						<div class="qr-item">
+							<img src="/assets/ios_code.png" alt="" />
+							<div class="qr-name">扫码下载苹果APP</div>
+						</div>
+						<div class="qr-item">
+							<img src="/assets/wechat_code.jpg" alt="" />
+							<div class="qr-name">关注公众号</div>
+						</div>
+					</div>
+				</div>
+				<div class="footer-tel">
+					<div class="footer-title">联系方式</div>
+					<div class="contact-information">
+						<p>业务咨询:18616333631</p>
+						<p>公司邮箱:youjiyun2016@163.com</p>
+						<p>公司地址:浙江省温州市鹿城区中关村信息谷温州创新中心1号楼4层405室</p>
+					</div>
+				</div>
+			</div>
+			<div class="foot-information">
+				<div style="margin-right: 30px;">Copyright © 2024 温州有极数据科技有限公司</div>
+				<a>浙ICP备2024128735号-1</a>
+			</div>
+		</div>
+	</footer>
+</template>
+
+<script>
+	export default {
+		props: ['type']
+	}
+</script>
+
+<style lang="scss">
+	.footer {
+		background: #212631;
+		min-width: 1200px;
+
+		.footer-box {
+			width: 1200px;
+			margin: 0 auto
+		}
+
+		.footer-content {
+			padding: 50px;
+			display: flex;
+			border-bottom: 1px solid rgba(255, 255, 255, .1)
+		}
+
+		.footer-title {
+			font-weight: 500;
+			font-size: 24px;
+			color: #fff;
+			line-height: 33px;
+			margin-bottom: 28px
+		}
+
+		.footer-download {
+			flex: 1;
+			width: 0
+		}
+
+		.footer-qr {
+			display: flex
+		}
+
+		.qr-item {
+			margin-right: 56px
+		}
+
+		.footer-qr img {
+			width: 130px;
+			height: 130px
+		}
+
+		.qr-name {
+			text-align: center;
+			font-size: 14px;
+			color: #98999d;
+			line-height: 20px;
+			margin-top: 10px
+		}
+
+		.contact-information {
+			font-weight: 400;
+			font-size: 14px;
+			color: #98999d;
+			line-height: 32px
+		}
+
+		.foot-information {
+			font-weight: 400;
+			font-size: 12px;
+			color: #98999d;
+			line-height: 17px;
+			display: flex;
+			align-items: center;
+			padding: 20px;
+			justify-content: center
+		}
+
+		.foot-information a {
+			color: #98999d;
+			margin-right: 30px
+		}
+
+		.foot-information img {
+			width: 14px;
+			height: 14px;
+			margin-left: 30px;
+			margin-right: 10px
+		}
+	}
+</style>

+ 1 - 1
virgo.wzfrontend/workark/src/layout/components/topNav.vue

@@ -5,7 +5,7 @@
 				<img src="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/2f7b4bfaf9e64817bc2cb46f3a632b01"
 					alt="logo.png" />
 			</div>
-			<div class="work-layout-label">WORKARK</div>
+			<div class="work-layout-label" @click="$router.push('/')">WORKARK</div>
 		</div>
 		<div class="work-layout-right">
 			<div class="work-layout-badge">

+ 4 - 1
virgo.wzfrontend/workark/src/layout/indexLayout.vue

@@ -2,11 +2,13 @@
 	<div class="website-layout">
 		<index-nav></index-nav>
 		<router-view :key="key" />
+		<index-foot type="all"></index-foot>
 	</div>
 </template>
 
 <script>
 	const indexNav = () => import('./components/indexNav');
+	const indexFoot = () => import('./components/indexFoot');
 	import {
 		removeToken
 	} from '@/uitls/auth';
@@ -64,7 +66,8 @@
 			}
 		},
 		components: {
-			indexNav
+			indexNav,
+			indexFoot
 		}
 	}
 </script>

+ 57 - 6
virgo.wzfrontend/workark/src/views/index.vue

@@ -6,21 +6,68 @@
 				<div class="main-title">WORKARK-寻找合适的服务</div>
 				<div class="main-sub-title">方便、快捷、精准</div>
 			</div>
-			<div class="high-seas">
-				<div class="title">公海房源</div>
+			<div class="product-box">
+				<div class="product-iview" v-for="item in list" :key="item.id">
+					<div class="title">{{item.name}}</div>
+					<div class="product-list">
+						<product-item v-for="(node,index) in item.productList" :key="index" :item="node"></product-item>
+					</div>
+				</div>
 			</div>
 		</div>
 	</div>
 </template>
 
 <script>
+	const productItem = () => import('@/components/website/productItem');
+	import {
+		getServeProductList
+	} from '@/api/system'
 	export default {
 		data() {
-			return {}
+			return {
+				list: []
+			}
 		},
 		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getServeProductList(-1).then(res => {
+					if (res.state) {
+						let list = this.mergeChildLists(res.data);
+						this.list = list.filter(node => node.productList.length > 0);
+					}
+				})
+			},
+			mergeChildLists(nodes) {
+				return nodes.map(node => {
+					// 创建新对象避免修改原数据
+					const newNode = {
+						...node
+					};
+					const listsToMerge = [];
+
+					// 递归收集所有子节点的 list
+					const collectLists = (currentNode) => {
+						if (currentNode.children) {
+							currentNode.children.forEach(child => {
+								if (child.productList) listsToMerge.push(child.productList);
+								collectLists(child); // 递归处理子节点
+							});
+						}
+					};
 
+					collectLists(newNode); // 从当前节点开始收集
+					newNode.productList = [...(newNode.productList || []), ...listsToMerge.flat()];
+					return newNode;
+				});
+			}
 		},
+		components: {
+			productItem
+		}
 	}
 </script>
 
@@ -58,7 +105,7 @@
 
 			.main-title {
 				font-weight: 500;
-				font-size: 36px;
+				font-size: 30px;
 				line-height: 50px;
 				margin-bottom: 12px;
 			}
@@ -72,8 +119,7 @@
 			}
 		}
 
-		.high-seas {
-			color: #191919;
+		.product-box {
 			margin-top: 80px;
 			padding-bottom: 200px;
 
@@ -84,5 +130,10 @@
 				margin-bottom: 30px;
 			}
 		}
+
+		.product-list {
+			display: flex;
+			flex-wrap: wrap;
+		}
 	}
 </style>

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/property/change.vue

@@ -138,7 +138,7 @@
 							node = Object.assign(node, JSON.parse(node.flowData));
 							if (node.operateDevice) node['assetNumber'] = node.operateDevice.assetNumber;
 							return node;
-						});;
+						});
 						this.totalCount = res.data.totalCount;
 					}
 				})

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/property/depreciation.vue

@@ -141,7 +141,7 @@
 							node = Object.assign(node, JSON.parse(node.flowData));
 							if (node.operateDevice) node['assetNumber'] = node.operateDevice.assetNumber;
 							return node;
-						});;
+						});
 						this.totalCount = res.data.totalCount;
 					}
 				})

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/property/inventory.vue

@@ -142,7 +142,7 @@
 							node = Object.assign(node, JSON.parse(node.flowData));
 							if (node.operateDevice) node['assetNumber'] = node.operateDevice.assetNumber;
 							return node;
-						});;
+						});
 						this.totalCount = res.data.totalCount;
 					}
 				})

+ 1 - 1
virgo.wzfrontend/workark/src/views/work/property/register.vue

@@ -166,7 +166,7 @@
 						this.tableData = res.data.dataList.map(node => {
 							node = Object.assign(node, JSON.parse(node.flowData));
 							return node;
-						});;
+						});
 						this.totalCount = res.data.totalCount;
 					}
 					this.tableLoading = false;

+ 60 - 22
virgo.wzfrontend/workark/src/views/work/serve/content.vue

@@ -10,37 +10,37 @@
 				</el-button>
 			</div>
 			<div class="hui-flex-box">
-				<el-table :data="tableData" row-key="id" height="100%">
+				<el-table :data="tableData" row-key="id" height="100%" v-loading="loading">
 					<el-table-column label="序号" width="50">
 						<template slot-scope="scope">
 							<div style="text-align: center;">{{scope.$index + 1}}</div>
 						</template>
 					</el-table-column>
 					<el-table-column label="服务名称" prop="name"></el-table-column>
-					<el-table-column label="变更类型" prop="type"></el-table-column>
-					<el-table-column label="资产编码" prop="assetNumber"></el-table-column>
-					<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
-					<el-table-column label="状态">
+					<el-table-column label="类型" prop="type"></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="上架状态" align="center">
 						<template slot-scope="scope">
-							<div v-if="!scope.row.state" class="hui-state">
-								<span class="hui-state-bage hui-state-primary"></span>
-								<span class="hui-state-label">待生成</span>
-							</div>
+							<el-switch v-model="scope.row.state" :active-value="1" :inactive-value="0"
+								@change="val=>updateItemFunc(val,scope.row)">
+							</el-switch>
 						</template>
 					</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="lookFlow(scope.row)">
+									@click="lookItem(scope.row)">
 									详情
 								</span>
 								<span class="table-operation" v-permission="'/work/property/change/update'"
-									v-if="!scope.row.projectFlowId" @click="updateFlow(scope.row)">
+									v-if="!scope.row.projectFlowId" @click="updateItem(scope.row)">
 									编辑
 								</span>
 								<span class="table-operation" v-permission="'/work/property/change/delete'"
-									v-if="!scope.row.projectFlowId" @click="deleteFlow(scope.row)">
+									v-if="!scope.row.projectFlowId" @click="deleteItem(scope.row)">
 									删除
 								</span>
 							</div>
@@ -59,17 +59,28 @@
 		</div>
 		<el-dialog :close-on-click-modal="false" :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="900px"
 			:append-to-body="true">
-			<edit v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId">
+			<edit v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:productLevelId="level.id">
 			</edit>
 		</el-dialog>
+		<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 edit = () => import('@/components/work/serve/content/edit');
+	const detail = () => import('@/components/work/serve/content/detail');
+
 	import {
 		getServeDepartmentBySign
 	} from '@/api/system'
+	import {
+		getServeListByQuery,
+		deleteServeById,
+		updateServe
+	} from '@/api/serve'
 	export default {
 		data() {
 			return {
@@ -81,7 +92,10 @@
 				isUpdate: false,
 				visible: false,
 				detailId: '',
-				level: {}
+				level: {},
+				filterOption: {},
+				loading: false,
+				drawer: false
 			}
 		},
 		mounted() {
@@ -95,11 +109,22 @@
 					this.init();
 				}
 			})
-
 		},
 		methods: {
 			init() {
-
+				let filterOption = {
+					organizationId: this.$store.getters.organization.id,
+					productLevelId: this.level.id
+				};
+				filterOption = Object.assign(filterOption, this.filterOption);
+				this.loading = true;
+				getServeListByQuery(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;
@@ -109,18 +134,30 @@
 				this.visible = true;
 				this.isUpdate = false;
 			},
-			lookFlow(val) {
+			lookItem(val) {
 				this.detailId = val.id;
 				this.drawer = true;
 			},
-			updateFlow(val) {
+			updateItem(val) {
 				this.detailId = val.id;
 				this.isUpdate = true;
 				this.visible = true;
 			},
-			deleteFlow(val) {
-				this.$confirm('确定要删除该流程?', () => {
-					deleteFlow(val.id).then(res => {
+			updateItemFunc(val, data) {
+				this.loading = true;
+				updateServe({
+					id: data.id,
+					state: val
+				}).then(res => {
+					if (res.state) {
+						this.$message.success('操作成功');
+						this.init();
+					}
+				})
+			},
+			deleteItem(val) {
+				this.$confirm('确定要删除服务?', () => {
+					deleteServeById(val.id).then(res => {
 						if (res.state) {
 							this.$message.success('操作成功');
 							this.init();
@@ -150,7 +187,8 @@
 			}
 		},
 		components: {
-			edit
+			edit,
+			detail
 		}
 	}
 </script>