diff --git a/new-digital-agriculture-screen/auto-imports.d.ts b/new-digital-agriculture-screen/auto-imports.d.ts new file mode 100644 index 0000000..369aad4 --- /dev/null +++ b/new-digital-agriculture-screen/auto-imports.d.ts @@ -0,0 +1,75 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const effectScope: typeof import('vue')['effectScope'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const h: typeof import('vue')['h'] + const inject: typeof import('vue')['inject'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const toRaw: typeof import('vue')['toRaw'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const unref: typeof import('vue')['unref'] + const useAttrs: typeof import('vue')['useAttrs'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useId: typeof import('vue')['useId'] + const useLink: typeof import('vue-router')['useLink'] + const useModel: typeof import('vue')['useModel'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSlots: typeof import('vue')['useSlots'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/new-digital-agriculture-screen/components.d.ts b/new-digital-agriculture-screen/components.d.ts new file mode 100644 index 0000000..ca0fa36 --- /dev/null +++ b/new-digital-agriculture-screen/components.d.ts @@ -0,0 +1,53 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module 'vue' { + export interface GlobalComponents { + BaseBg: typeof import('./src/components/baseBg.vue')['default'] + CenterMap: typeof import('./src/components/centerMap.vue')['default'] + 'CenterMap copy': typeof import('./src/components/centerMap copy.vue')['default'] + CodeDialog: typeof import('./src/components/code-dialog/index.vue')['default'] + Components: typeof import('./src/components/index.js')['default'] + copy: typeof import('./src/components/centerMap copy.vue')['default'] + CurrentTime: typeof import('./src/components/currentTime.vue')['default'] + CustomBack: typeof import('./src/components/customBack.vue')['default'] + CustomCarouselPicture: typeof import('./src/components/custom-carousel-picture/index.vue')['default'] + CustomEchartBar: typeof import('./src/components/custom-echart-bar/index.vue')['default'] + CustomEchartBubble: typeof import('./src/components/custom-echart-bubble/index.vue')['default'] + CustomEchartColumnLine: typeof import('./src/components/custom-echart-column-line/index.vue')['default'] + CustomEchartHyalineCake: typeof import('./src/components/custom-echart-hyaline-cake/index.vue')['default'] + CustomEchartLine: typeof import('./src/components/custom-echart-line/index.vue')['default'] + CustomEchartLineLine: typeof import('./src/components/custom-echart-line-line/index.vue')['default'] + CustomEchartMaps: typeof import('./src/components/custom-echart-maps/index.vue')['default'] + CustomEchartMixin: typeof import('./src/components/custom-echart-mixin/index.vue')['default'] + CustomEchartPictorialBar: typeof import('./src/components/custom-echart-pictorial-bar/index.vue')['default'] + CustomEchartPie: typeof import('./src/components/custom-echart-pie/index.vue')['default'] + CustomEchartPie3d: typeof import('./src/components/custom-echart-pie-3d/index.vue')['default'] + CustomEchartPieGauge: typeof import('./src/components/custom-echart-pie-gauge/index.vue')['default'] + CustomEchartRadar: typeof import('./src/components/custom-echart-radar/index.vue')['default'] + CustomEchartScatterBlister: typeof import('./src/components/custom-echart-scatter-blister/index.vue')['default'] + CustomEchartTriangle: typeof import('./src/components/custom-echart-triangle/index.vue')['default'] + CustomEchartWaterDroplet: typeof import('./src/components/custom-echart-water-droplet/index.vue')['default'] + CustomEchartWordCloud: typeof import('./src/components/custom-echart-word-cloud/index.vue')['default'] + CustomIframe: typeof import('./src/components/custom-iframe/index.vue')['default'] + CustomImportExcel: typeof import('./src/components/custom-import-excel/index.vue')['default'] + CustomProgress: typeof import('./src/components/customProgress.vue')['default'] + CustomRankList: typeof import('./src/components/custom-rank-list/index.vue')['default'] + CustomRichEditor: typeof import('./src/components/custom-rich-editor/index.vue')['default'] + CustomScrollBoard: typeof import('./src/components/custom-scroll-board/index.vue')['default'] + CustomScrollTitle: typeof import('./src/components/custom-scroll-title/index.vue')['default'] + CustomTableOperate: typeof import('./src/components/custom-table-operate/index.vue')['default'] + CustomTableTree: typeof import('./src/components/custom-table-tree/index.vue')['default'] + NewHyalineCake: typeof import('./src/components/custom-echart-hyaline-cake/new-hyaline-cake.vue')['default'] + NewPie: typeof import('./src/components/custom-echart-hyaline-cake/new-pie.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SubTop: typeof import('./src/components/subTop.vue')['default'] + SvgIcon: typeof import('./src/components/svg-icon/index.vue')['default'] + UpFile: typeof import('./src/components/custom-rich-editor/upFile.js')['default'] + } +} diff --git a/new-digital-agriculture-screen/src/assets/images/trace/maprl.png b/new-digital-agriculture-screen/src/assets/images/trace/maprl.png new file mode 100644 index 0000000..ac392ac Binary files /dev/null and b/new-digital-agriculture-screen/src/assets/images/trace/maprl.png differ diff --git a/new-digital-agriculture-screen/src/components/custom-echart-bar/index.vue b/new-digital-agriculture-screen/src/components/custom-echart-bar/index.vue index 4ae9afc..953d518 100644 --- a/new-digital-agriculture-screen/src/components/custom-echart-bar/index.vue +++ b/new-digital-agriculture-screen/src/components/custom-echart-bar/index.vue @@ -2,8 +2,8 @@
diff --git a/new-digital-agriculture-screen/src/views/business/components/businessTwo.vue b/new-digital-agriculture-screen/src/views/business/components/businessTwo.vue index 8d9005c..2263684 100644 --- a/new-digital-agriculture-screen/src/views/business/components/businessTwo.vue +++ b/new-digital-agriculture-screen/src/views/business/components/businessTwo.vue @@ -1,5 +1,5 @@ diff --git a/new-digital-agriculture-screen/src/views/land/components/basicInfo.vue b/new-digital-agriculture-screen/src/views/land/components/basicInfo.vue index ae246de..196197f 100644 --- a/new-digital-agriculture-screen/src/views/land/components/basicInfo.vue +++ b/new-digital-agriculture-screen/src/views/land/components/basicInfo.vue @@ -33,26 +33,27 @@ const props = defineProps({ .basic { width: 100%; margin-top: 10px; - height: 100%; + height: 95%; border: 2px solid #01fefd; border-radius: 16px; backdrop-filter: blur(2px); display: flex; flex-direction: column; - justify-content: space-between; + justify-content: flex-start; color: #ffffff; padding: 20px; .line { display: flex; justify-content: space-between; text-align: left; - line-height: 20px; + line-height: 50px; .title { - font-size: 16px; + font-size: 14px; width: 40%; + color: #ddd; } .values { - font-size: 20px; + font-size: 16px; width: 60%; } } diff --git a/new-digital-agriculture-screen/src/views/land/components/landOne.vue b/new-digital-agriculture-screen/src/views/land/components/landOne.vue index 8c7cf27..b510852 100644 --- a/new-digital-agriculture-screen/src/views/land/components/landOne.vue +++ b/new-digital-agriculture-screen/src/views/land/components/landOne.vue @@ -23,6 +23,7 @@ const state = reactive({ containLabel: true, }, tooltip: { + show: true, trigger: 'axis', axisPointer: { type: 'shadow', diff --git a/new-digital-agriculture-screen/src/views/trace/components/detectionCharts.vue b/new-digital-agriculture-screen/src/views/trace/components/detectionCharts.vue index 4ec0555..8bf6c36 100644 --- a/new-digital-agriculture-screen/src/views/trace/components/detectionCharts.vue +++ b/new-digital-agriculture-screen/src/views/trace/components/detectionCharts.vue @@ -22,45 +22,59 @@
+
+
溯源信息
+
+
+ +
+
+
新鲜番茄
+
检测通过
+
+
+
+
权威检测
-
- 产品名称 - {{ info.productName }} -
-
- 产品批次号 - {{ info.productCode }} -
-
- 产品规格 - {{ info.specs }} -
-
- 产品类型 - {{ info.productType }} -
-
- 生产厂家 - {{ info.info && info.info.manufacturer }} -
-
- 生产时间 - {{ info.info && info.info.productTime }} -
-
- 终端零售店 - {{ info.info && info.info.shop }} +
+ {{ item.title }} + {{ item.name }}
-
+
- -
检测报告
+ + +
+
+
产地信息
+
+
+
+ +
+
+
临沧市耿马县耿马镇
+
+
+
+
仓储环节
+
+
+ {{ item.title }} + {{ item.name }} +
+
+
物流环节
+
+
+ {{ item.title }} + {{ item.name }}
@@ -82,6 +96,44 @@ onMounted(() => { }); let list = ref([]); +let list1 = ref([ + { title: '报告编号', name: 'H1212457' }, + { title: '送检单位', name: '水果综合种植基地' }, + { title: '送检日期', name: '2021-12-11' }, + { title: '送样人', name: '李宏微' }, + { title: '联系方式', name: '19876782134' }, + { title: '样品数量', name: '1000克' }, + { title: '样品名称', name: '新鲜番茄' }, + { title: '检测单位', name: '农残检测中心' }, + { title: '检测类型', name: '农残检测' }, + { title: '检测方法', name: '食品快速检测法' }, + { title: '评判标准', name: 'GB/T5009.199-2003' }, + { title: '检测结果', name: '合格' }, +]); + +let list2 = ref([ + { title: '仓库位置', name: '耿马县耿马村仓储站' }, + { title: '仓储数量', name: '5吨' }, + { title: '入库时间', name: '2021-12-11' }, + { title: '仓库类型', name: '冷藏仓库' }, + { title: '批次编号', name: 'AP20211212001' }, + { title: '出库时间', name: '2021-12-15' }, +]); + +let list3 = ref([ + { title: '运输批次', name: '第一批次' }, + { title: '运输工具', name: '冷藏车' }, + { title: '运输路线', name: '耿马县一昆明市' }, + { title: '运输数量', name: '4吨' }, + { title: '运输时间', name: '2021-12-15 5:30~12-16 8:30' }, + { title: '', name: '' }, + { title: '运输批次', name: '第二批次' }, + { title: '运输工具', name: '小型运载卡车' }, + { title: '运输路线', name: '耿马县一四排乡' }, + { title: '运输数量', name: '1吨' }, + { title: '运输时间', name: '2021-12-15 5:30~12-16 7:30' }, +]); + const classOptions = { singleHeight: 48, }; @@ -103,7 +155,7 @@ function handleCloseInfo() { .label { display: grid; grid-template-columns: 25% 40% 18% 17%; - background-color: rgba(53, 208, 192, 0.3); + background-color: rgba(70, 109, 109, 0.8); color: #ffffff; height: 30px; line-height: 30px; @@ -162,6 +214,58 @@ function handleCloseInfo() { z-index: 9999; transition: all 0.8s cubic-bezier(0.58, 0.15, 0.4, 1.42); font-size: 18px; + .detection_text { + font-size: 25px; + margin-bottom: 20px; + } + .traceability_info { + .traceability_info_box { + justify-content: space-evenly; + padding: 10px; + display: flex; + margin: 20px 0px; + background-color: rgba(70, 109, 109, 0.8); + border-radius: 10px; + .traceability_info_box_image { + width: 130px; + height: 75px; + } + .traceability_info_box_images { + width: 100%; + height: 150px; + } + + .traceability_info_box_title { + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + height: 75px; + } + .traceability_info_box_titles { + margin-top: 10px; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: start; + } + .traceability_info_right { + font-size: 23px; + color: #fff; + } + .traceability_info_rights { + font-size: 15px; + color: #fff; + } + .traceability_info_right_bottom { + padding: 5px 20px; + border-radius: 40px; + background-color: rgba(0, 0, 0, 0.2); + color: #04ed8c; + font-size: 17px; + } + } + } ._label { color: #01fefd; } @@ -207,7 +311,6 @@ function handleCloseInfo() { } } .route_box { - padding: 0 34px; > div { position: relative; padding-bottom: 16px; diff --git a/sub-government-affairs-service/src/layouts/component/Header/index.vue b/sub-government-affairs-service/src/layouts/component/Header/index.vue index 3ad7fdb..3f80024 100644 --- a/sub-government-affairs-service/src/layouts/component/Header/index.vue +++ b/sub-government-affairs-service/src/layouts/component/Header/index.vue @@ -1,10 +1,3 @@ - @@ -41,6 +118,8 @@ import { getAssetsFile } from '@/utils/index.js'; import { getMonitorList } from '@/apis/brand'; const activeTab = ref('onSale'); +const dialogVisible = ref(false); +const traceData = ref(null); const tabLabels = { onSale: '在售中', @@ -83,10 +162,52 @@ const products = ref([ // 根据当前 Tab 过滤 const filteredProducts = computed(() => products.value.filter((p) => p.status === activeTab.value)); -// 操作回调 -const onInspect = (p) => { - console.log('抽查商品', p); -}; +// 点击抽查后,根据 id 单独拉取或赋值 traceData +function onInspect(id) { + console.log('查看产品:', id); + // 这里用硬编码模拟请求,实际中可换成接口调用:getTraceById(id).then(res=> traceData.value = res) + const mock = { + productName: '无土栽培土豆', + quantity: '200KG', + producer: '北大荒技术有限公司', + origin: '耿马县孟定镇下坝村', + productionDate: '2025-1-2', + traceCode: '10.5487542154785XSE254.1040201', + traceCount: 30, + base: { + address: '耿马县孟定镇下坝村', + location: '东经102° · 北纬24°', + area: 12000, + climate: '亚热带高原季风型,温和多雨', + soil: '红壤', + }, + farmingRecords: [ + { date: '2024/1/2', operation: '播种 20250102批土豆种', operator: '张小东' }, + { date: '2024/2/2', operation: '施肥 氮肥', operator: '张小东' }, + { date: '2024/3/2', operation: '浇水', operator: '张小东' }, + { date: '2024/4/2', operation: '采摘', operator: '张小东' }, + ], + packaging: { + company: '瑞禾农产品包装公司', + type: '纸箱', + person: '王大福', + time: '2025-1-2 14:00:47', + }, + logistics: { + storageType: '冷藏', + temperature: '2°C', + shipFrom: '北京市朝阳区解放路24号', + shipTo: '上海市黄浦区南京路36号', + }, + trade: { + time: '2025-1-2 14:00:47', + buyer: '刘小花', + }, + img: 'images/brand/product6.png', + }; + traceData.value = mock; + dialogVisible.value = true; +} const onRevoke = (p) => { console.log('取消授权', p); }; @@ -191,5 +312,31 @@ const statusClass = (tab) => { } } } + + .trace-record { + position: relative; + padding-right: 160px; /* 给图片预留空间 */ + } + .trace-record .section { + margin-bottom: 16px; + } + .trace-record h3 { + margin-bottom: 8px; + font-size: 18px; + color: #409eff; + border-left: 4px solid #409eff; + padding-left: 8px; + } + .trace-img { + position: absolute; + top: 16px; + right: 16px; + width: 128px; + text-align: center; + } + .trace-img img { + width: 100%; + border-radius: 4px; + } } diff --git a/sub-operation-service/src/views/brand/index.vue b/sub-operation-service/src/views/brand/index.vue index 70ff13e..34fea47 100644 --- a/sub-operation-service/src/views/brand/index.vue +++ b/sub-operation-service/src/views/brand/index.vue @@ -3,16 +3,20 @@ - + 申请图标 使用申请 - - - 授权管理 - + + + 授权记录 + 品牌制度 + @@ -29,20 +33,27 @@