Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/admin/controller/borrow/BorrowApp.php
#	app/admin/controller/borrow/BorrowApplication.php
#	app/admin/controller/borrow/BorrowApply.php
#	app/admin/controller/borrow/BorrowTools.php
#	app/admin/controller/borrow/BorrowUseing.php
#	package.json
#	uniapp/package.json
#	web/index.html
#	web/package.json
#	web/src/lang/backend/zh-cn/dashboard.ts
#	web/src/layouts/frontend/Home.vue
#	web/src/layouts/frontend/Yiqi.vue
#	web/src/main.ts
#	web/src/views/backend/borrow/borrowApplication/popupForm.vue
#	web/src/views/backend/borrow/borrowApply/index.vue
#	web/src/views/backend/borrow/borrowApply/popupForm.vue
#	web/src/views/backend/borrow/borrowRecord/popupForm.vue
#	web/src/views/backend/borrow/borrowUseing/popupForm.vue
#	web/src/views/backend/borrow/common/assetSelection.vue
#	web/src/views/backend/borrow/common/assetSelectionRecord.vue
#	web/src/views/backend/dashboard.vue
#	web/src/views/backend/notification/index/popupForm.vue
#	web/src/views/frontend/index.vue
yzx vor 6 Monaten
Ursprung
Commit
3d2f3301db
45 geänderte Dateien mit 789 neuen und 89 gelöschten Zeilen
  1. 3 0
      web/.vscode/extensions.json
  2. 14 0
      web/.vscode/settings.json
  3. 3 0
      web/index.html
  4. BIN
      web/src/Build/B.data
  5. 9 0
      web/src/Build/B.framework.js
  6. 0 0
      web/src/Build/B.loader.js
  7. BIN
      web/src/Build/B.wasm
  8. BIN
      web/src/TemplateData/MemoryProfiler.png
  9. BIN
      web/src/TemplateData/favicon.ico
  10. BIN
      web/src/TemplateData/fullscreen-button.png
  11. BIN
      web/src/TemplateData/progress-bar-empty-dark.png
  12. BIN
      web/src/TemplateData/progress-bar-empty-light.png
  13. BIN
      web/src/TemplateData/progress-bar-full-dark.png
  14. BIN
      web/src/TemplateData/progress-bar-full-light.png
  15. 16 0
      web/src/TemplateData/style.css
  16. BIN
      web/src/TemplateData/unity-logo-dark.png
  17. BIN
      web/src/TemplateData/unity-logo-light.png
  18. BIN
      web/src/TemplateData/webgl-logo.png
  19. BIN
      web/src/TemplateData/webmemd-icon.png
  20. BIN
      web/src/assets/TemplateData/MemoryProfiler.png
  21. BIN
      web/src/assets/TemplateData/favicon.ico
  22. BIN
      web/src/assets/TemplateData/fullscreen-button.png
  23. BIN
      web/src/assets/TemplateData/progress-bar-empty-dark.png
  24. BIN
      web/src/assets/TemplateData/progress-bar-empty-light.png
  25. BIN
      web/src/assets/TemplateData/progress-bar-full-dark.png
  26. BIN
      web/src/assets/TemplateData/progress-bar-full-light.png
  27. 16 0
      web/src/assets/TemplateData/style.css
  28. BIN
      web/src/assets/TemplateData/unity-logo-dark.png
  29. BIN
      web/src/assets/TemplateData/unity-logo-light.png
  30. BIN
      web/src/assets/TemplateData/webgl-logo.png
  31. BIN
      web/src/assets/TemplateData/webmemd-icon.png
  32. BIN
      web/src/assets/bottom.png
  33. BIN
      web/src/assets/hh.png
  34. BIN
      web/src/assets/jj.png
  35. BIN
      web/src/assets/sxt.png
  36. BIN
      web/src/assets/tb.png
  37. BIN
      web/src/assets/xf.png
  38. BIN
      web/src/assets/y.png
  39. BIN
      web/src/assets/yg.png
  40. 162 0
      web/src/components/ReEcharts/lend.vue
  41. 205 0
      web/src/components/mixins/editor/wang.vue
  42. 1 1
      web/src/lang/backend/zh-cn/dashboard.ts
  43. 314 51
      web/src/layouts/frontend/Home.vue
  44. 20 20
      web/src/layouts/frontend/Yiqi.vue
  45. 26 17
      web/src/views/frontend/index.vue

+ 3 - 0
web/.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+    "recommendations": ["vue.volar", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
+}

+ 14 - 0
web/.vscode/settings.json

@@ -0,0 +1,14 @@
+{
+    "[json]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode"
+    },
+    "[jsonc]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode"
+    },
+    "[typescript]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode"
+    },
+    "[vue]": {
+        "editor.defaultFormatter": "esbenp.prettier-vscode"
+    }
+}

+ 3 - 0
web/index.html

@@ -9,6 +9,9 @@
     <body>
         <div id="app"></div>
         <script type="module" src="/src/main.ts"></script>
+      <!-- <script src="./src/Build/B.framework.js"></script>
+      <script src="./src/Build/B.loader.js"></script> -->
+
     </body>
 </html>
 <style>

BIN
web/src/Build/B.data


Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 0
web/src/Build/B.framework.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
web/src/Build/B.loader.js


BIN
web/src/Build/B.wasm


BIN
web/src/TemplateData/MemoryProfiler.png


BIN
web/src/TemplateData/favicon.ico


BIN
web/src/TemplateData/fullscreen-button.png


BIN
web/src/TemplateData/progress-bar-empty-dark.png


BIN
web/src/TemplateData/progress-bar-empty-light.png


BIN
web/src/TemplateData/progress-bar-full-dark.png


BIN
web/src/TemplateData/progress-bar-full-light.png


+ 16 - 0
web/src/TemplateData/style.css

@@ -0,0 +1,16 @@
+body { padding: 0; margin: 0 }
+#unity-container { position: absolute }
+#unity-container.unity-desktop { left: 50%; top: 50%; transform: translate(-50%, -50%) }
+#unity-container.unity-mobile { position: fixed; width: 100%; height: 100% }
+#unity-canvas { background: #231F20 }
+.unity-mobile #unity-canvas { width: 100%; height: 100% }
+#unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none }
+#unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center }
+#unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; margin-left: 6.5px; background: url('progress-bar-empty-dark.png') no-repeat center }
+#unity-progress-bar-full { width: 0%; height: 18px; margin-top: 10px; background: url('progress-bar-full-dark.png') no-repeat center }
+#unity-footer { position: relative }
+.unity-mobile #unity-footer { display: none }
+#unity-webgl-logo { float:left; width: 204px; height: 38px; background: url('webgl-logo.png') no-repeat center }
+#unity-build-title { float: right; margin-right: 10px; line-height: 38px; font-family: arial; font-size: 18px }
+#unity-fullscreen-button { cursor:pointer; float: right; width: 38px; height: 38px; background: url('fullscreen-button.png') no-repeat center }
+#unity-warning { position: absolute; left: 50%; top: 5%; transform: translate(-50%); background: white; padding: 10px; display: none }

BIN
web/src/TemplateData/unity-logo-dark.png


BIN
web/src/TemplateData/unity-logo-light.png


BIN
web/src/TemplateData/webgl-logo.png


BIN
web/src/TemplateData/webmemd-icon.png


BIN
web/src/assets/TemplateData/MemoryProfiler.png


BIN
web/src/assets/TemplateData/favicon.ico


BIN
web/src/assets/TemplateData/fullscreen-button.png


BIN
web/src/assets/TemplateData/progress-bar-empty-dark.png


BIN
web/src/assets/TemplateData/progress-bar-empty-light.png


BIN
web/src/assets/TemplateData/progress-bar-full-dark.png


BIN
web/src/assets/TemplateData/progress-bar-full-light.png


+ 16 - 0
web/src/assets/TemplateData/style.css

@@ -0,0 +1,16 @@
+body { padding: 0; margin: 0 }
+#unity-container { position: absolute }
+#unity-container.unity-desktop { left: 50%; top: 50%; transform: translate(-50%, -50%) }
+#unity-container.unity-mobile { position: fixed; width: 100%; height: 100% }
+#unity-canvas { background: #231F20 }
+.unity-mobile #unity-canvas { width: 100%; height: 100% }
+#unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none }
+#unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center }
+#unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; margin-left: 6.5px; background: url('progress-bar-empty-dark.png') no-repeat center }
+#unity-progress-bar-full { width: 0%; height: 18px; margin-top: 10px; background: url('progress-bar-full-dark.png') no-repeat center }
+#unity-footer { position: relative }
+.unity-mobile #unity-footer { display: none }
+#unity-webgl-logo { float:left; width: 204px; height: 38px; background: url('webgl-logo.png') no-repeat center }
+#unity-build-title { float: right; margin-right: 10px; line-height: 38px; font-family: arial; font-size: 18px }
+#unity-fullscreen-button { cursor:pointer; float: right; width: 38px; height: 38px; background: url('fullscreen-button.png') no-repeat center }
+#unity-warning { position: absolute; left: 50%; top: 5%; transform: translate(-50%); background: white; padding: 10px; display: none }

BIN
web/src/assets/TemplateData/unity-logo-dark.png


BIN
web/src/assets/TemplateData/unity-logo-light.png


BIN
web/src/assets/TemplateData/webgl-logo.png


BIN
web/src/assets/TemplateData/webmemd-icon.png


BIN
web/src/assets/bottom.png


BIN
web/src/assets/hh.png


BIN
web/src/assets/jj.png


BIN
web/src/assets/sxt.png


BIN
web/src/assets/tb.png


BIN
web/src/assets/xf.png


BIN
web/src/assets/y.png


BIN
web/src/assets/yg.png


+ 162 - 0
web/src/components/ReEcharts/lend.vue

@@ -0,0 +1,162 @@
+<template>
+    <div style="color: #fff;">
+        <div id="main" style="width: 100%;height: 20vw;"></div>
+    </div>
+
+    <div>
+    </div>
+</template>
+
+<script>
+import { ref, onMounted, onUnmounted } from 'vue';
+import * as echarts from 'echarts'
+
+
+//初始化函数
+
+export default {
+    // name: 'AutoSwitchTabs',  
+    setup() {
+        //图表
+        function init() {
+            // console.log(111)
+            // 基于准备好的dom,初始化echarts实例
+            let Chart = echarts.init(document.getElementById("main"), "dark");
+
+
+            var barWidth = '14px';
+            var dataMax = [{
+                name: '水准仪',
+                max: 500
+            },
+            {
+                name: 'RTK',
+                max: 500
+            },
+            {
+                name: '全站仪',
+                max: 500
+            },
+            {
+                name: '无人机',
+                max: 500
+            },
+            {
+                name: '配件及其他',
+                max: 500
+            }
+            ]
+            // 绘制图表
+
+            //温湿度
+            var options = {
+                backgroundColor: "transparent",
+                color: ["#3BB8FF", "#7460EE"],
+                tooltip: {
+                    show: true,
+                },
+                legend: {
+                    data: ["科研", "教学"],
+                    icon: '',
+                    top: '20',
+                    textStyle: {
+                        color: "#fff",
+                        fontSize: 14,
+                    },
+                    // itemWidth: 20,
+                    // itemHeight: 7,
+                    // itemGap: 35,
+                    color: "#fff",
+                    // selectedMode: false,
+                },
+                radar: {
+                    // 名称
+                    name: {
+                        textStyle: {
+                            fontSize: 15, // 设置字体大小
+                            color: '#fff' // 设置字体颜色
+                        }
+                    },
+                    // 轴线上的文本标签
+                    axisLabel: {
+                        textStyle: {
+                            fontSize: 14, // 设置字体大小
+                            color: '#00FF00' // 设置字体颜色
+                        }
+                    },
+                    splitNumber: 5, // 圈数
+                    radius: '70%',
+                    center: ["50%", "50%"], // 中心点
+
+                    indicator: dataMax, // 配置各个维度的最大值
+                    shape: 'polygon', // 配置雷达图最外层的图形 circle polygon
+                    //  axisLine: {
+                    //     lineStyle: {
+                    //       color: "transparent",
+                    //     },
+                    //   },
+                    splitLine: {
+                        lineStyle: {
+                            color: "#fff",
+                            width: 1,
+                            type: "dotted",
+                        },
+                    },
+                    splitArea: {
+                        areaStyle: {
+                            color: "transparent",
+                        },
+                    },
+                },
+                series: [{
+                    type: 'radar', // radar 此图表时一个雷达图
+                    //  symbolSize: 20,
+                    label: { // 设置标签的样式
+                        show: true // 显示数值
+                    },
+                    lineStyle: {
+
+                        width: 2
+                    },
+
+                    areaStyle: {
+                        normal: {
+                            shadowBlur: 13,
+                            shadowColor: 'rgba(0,0,0,.5)',
+                            shadowOffsetX: 0,
+                            shadowOffsetY: 10,
+                            opacity: '0.7'
+                        }
+                    }, // 将每一个产品的雷达图形成阴影的面积
+                    data: [
+                    {
+                        name: '教学',
+                        value: [419, 290,191, 160, 92]
+                    },{
+                        name: '科研',
+                        value: [286, 174, 93, 86, 95]
+                    },
+                    
+                    ]
+                }]
+            };
+
+            // 渲染图表
+            Chart.setOption(options);
+
+
+
+
+        }
+
+
+        // 组件挂载后启动定时器  
+        onMounted(() => {
+            init();
+        });
+
+
+
+    }
+};
+</script>

+ 205 - 0
web/src/components/mixins/editor/wang.vue

@@ -0,0 +1,205 @@
+<template>
+    <div v-if="state.mounted" :style="style" class="ba-editor wangeditor">
+        <Toolbar class="wangeditor-toolbar" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" />
+        <Editor
+            :style="state.editorStyle"
+            v-model="state.value"
+            :defaultConfig="state.editorConfig"
+            :mode="mode"
+            @onCreated="handleCreated"
+            @onChange="handleChange"
+            v-bind="$attrs"
+        />
+    </div>
+</template>
+
+<script setup lang="ts">
+import '@wangeditor/editor/dist/css/style.css' // 引入 css
+import { onBeforeUnmount, reactive, shallowRef, onMounted, CSSProperties, watch } from 'vue'
+import { IEditorConfig, IToolbarConfig, i18nChangeLanguage } from '@wangeditor/editor'
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+import { useConfig } from '/@/stores/config'
+import { fileUpload } from '/@/api/common'
+import NProgress from 'nprogress'
+
+interface Props {
+    // 编辑区高度
+    height?: string
+    mode?: 'default' | 'simple'
+    placeholder?: string
+    modelValue: string | null
+    // https://www.wangeditor.com/v5/toolbar-config.html#getconfig
+    toolbarConfig?: Partial<IToolbarConfig>
+    // https://www.wangeditor.com/v5/editor-config.html#placeholder
+    editorConfig?: Partial<IEditorConfig>
+    // 编辑区style
+    editorStyle?: CSSProperties
+    // 整体的style
+    style?: CSSProperties
+    // 图片和文件上传到服务器而不是云存储
+    fileForceLocal?: boolean
+}
+
+type VideoInsertFnType = (url: string) => void
+type ImgInsertFnType = (url: string, alt: string, href: string) => void
+
+const props = withDefaults(defineProps<Props>(), {
+    height: '320px',
+    mode: 'default',
+    placeholder: '请输入内容...',
+    modelValue: '',
+    toolbarConfig: () => {
+        return {
+            excludeKeys: ['|'],
+        }
+    },
+    editorConfig: () => {
+        return {}
+    },
+    editorStyle: () => {
+        {
+            return {}
+        }
+    },
+    style: () => {
+        return {}
+    },
+    fileForceLocal: false,
+})
+
+const config = useConfig()
+const editorRef = shallowRef()
+const emits = defineEmits<{
+    (e: 'update:modelValue', value: string): void
+}>()
+
+const state: {
+    mounted: boolean
+    value: string
+    editorConfig: Partial<IEditorConfig>
+    editorStyle: CSSProperties
+} = reactive({
+    mounted: false,
+    value: !props.modelValue ? '<p></p>' : props.modelValue,
+    editorConfig: props.editorConfig,
+    editorStyle: props.editorStyle,
+})
+
+onMounted(() => {
+    i18nChangeLanguage(config.lang.defaultLang == 'zh-cn' ? 'zh-CN' : config.lang.defaultLang)
+    state.editorConfig.placeholder = props.placeholder
+
+    // 图片上传配置
+    state.editorConfig.MENU_CONF = {}
+    state.editorConfig.MENU_CONF['uploadImage'] = {
+        fieldName: 'file',
+        maxFileSize: 10 * 1024 * 1024, // 10M
+        async customUpload(file: File, insertFn: ImgInsertFnType) {
+            NProgress.configure({ showSpinner: true, trickle: false })
+            NProgress.start()
+            let fd = new FormData()
+            fd.append('file', file)
+            fileUpload(fd, {}, props.fileForceLocal, {
+                onUploadProgress: (evt) => {
+                    NProgress.set(evt.progress!)
+                },
+            }).then((res) => {
+                if (res.code == 1) {
+                    insertFn(res.data.file.full_url, res.data.file.name, res.data.file.full_url)
+                }
+                NProgress.done()
+            })
+        },
+    }
+
+    // 视频上传配置
+    state.editorConfig.MENU_CONF['uploadVideo'] = {
+        fieldName: 'file',
+        async customUpload(file: File, insertFn: VideoInsertFnType) {
+            NProgress.configure({ showSpinner: true, trickle: false })
+            NProgress.start()
+            let fd = new FormData()
+            fd.append('file', file)
+            fileUpload(fd, {}, props.fileForceLocal, {
+                onUploadProgress: (evt) => {
+                    NProgress.set(evt.progress!)
+                },
+            }).then((res) => {
+                if (res.code == 1) {
+                    insertFn(res.data.file.full_url)
+                }
+                NProgress.done()
+            })
+        },
+    }
+
+    state.editorStyle.height = props.height
+    state.editorStyle['overflow-y'] = 'hidden'
+    state.mounted = true
+})
+
+// 组件销毁时,也及时销毁编辑器
+onBeforeUnmount(() => {
+    if (editorRef.value == null) return
+    editorRef.value.destroy()
+})
+
+const handleCreated = (editor: any) => {
+    editorRef.value = editor // 记录 editor 实例
+}
+
+const handleChange = () => {
+    emits('update:modelValue', editorRef.value.getHtml())
+}
+
+const getRef = () => {
+    return editorRef.value
+}
+
+defineExpose({
+    getRef,
+})
+
+watch(
+    () => props.modelValue,
+    (newVal) => {
+        state.value = !newVal ? '<p></p>' : newVal
+    }
+)
+</script>
+
+<style scoped lang="scss">
+.ba-editor {
+    border: 1px solid var(--el-border-color-lighter);
+    z-index: 9999;
+    :deep(.w-e-scroll) {
+        scrollbar-width: none;
+        &::-webkit-scrollbar {
+            width: 5px;
+        }
+        &::-webkit-scrollbar-thumb {
+            background: #eaeaea;
+            border-radius: var(--el-border-radius-base);
+            box-shadow: none;
+            -webkit-box-shadow: none;
+        }
+        &:hover {
+            &::-webkit-scrollbar-thumb:hover {
+                background: #c8c9cc;
+            }
+        }
+    }
+}
+.wangeditor-toolbar {
+    border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+// 暗黑样式
+@at-root .dark {
+    .ba-editor {
+        --w-e-textarea-bg-color: var(--ba-bg-color-overlay);
+        --w-e-toolbar-bg-color: var(--ba-bg-color-overlay);
+        --w-e-toolbar-border-color: var(--el-color-info-light-3);
+    }
+}
+</style>

+ 1 - 1
web/src/lang/backend/zh-cn/dashboard.ts

@@ -24,7 +24,7 @@ export default {
     rtk: 'RTK',
     qzy: '全站仪',
     wrj: '无人机',
-    Other: '其他',
+    Other: '配件及其他',
     Jan: '1月',
     Feb: '2月',
     Mar: '3月',

+ 314 - 51
web/src/layouts/frontend/Home.vue

@@ -1,19 +1,95 @@
 <template>
     <!-- <Particle /> -->
-    <div class="bg"></div>
+    <div class="bg">
+        <div id="unity-container" class="unity-desktop">
+            <canvas id="unity-canvas" tabindex="-1"></canvas>
+            <div id="unity-loading-bar">
+                <div id="unity-logo"></div>
+                <div id="unity-progress-bar-empty">
+                    <div id="unity-progress-bar-full"></div>
+                </div>
+            </div>
+            <div id="unity-warning"> </div>
+            <div id="unity-footer">
+                <!-- <div id="unity-webgl-logo"></div>
+        <div id="unity-fullscreen-button"></div>
+        <div id="unity-build-title">2Building</div> -->
+            </div>
+        </div>
+    </div>
+
     <div class="visual">
         <div class="visual_left">
             <div class="visual_box">
                 <div class="visual_title">
-                    <span>实验室介绍{{ dogName }}</span>
+                    <span>工程实验中心{{ dogName }}</span>
                     <img src="/@/assets/header/xiaotitle.png">
                 </div>
                 <div class="visual_chart" id="main1">
-					<span class="jieshao">
-						<img style="margin: 6px;width: 46%;" v-for="(image, index) in imagesa" :key="index" :src="image"
-                             alt="Lab Image">
-						<div v-html="ltydata.labinfo[0].laboratory_introduction"></div>
-					</span>
+                    <span class="jieshao">
+                        <!-- <img style="margin: 6px;width: 46%;" v-for="(image, index) in imagesa" :key="index" :src="image"
+                            alt="Lab Image"> -->
+                        <!-- <div v-html="ltydata.labinfo[0].laboratory_introduction"></div> -->
+                        <div style="pointer-events: none;">
+                            <div class="jieshao-top">
+                                <div class="js-left">
+                                    <img src="/@/assets/jj.png" alt="">
+                                </div>
+                                <div class="js-right">
+                                    <div><span class="js-span">面积<span class="js-color">2590</span>平方米</span></div>
+                                    <div><span class="js-span">实验室<span class="js-color">23</span>间</span></div>
+                                </div>
+                            </div>
+                            <div class="jieshao-bottom">
+                             <div class="js-flex">
+                                <div class="js-tb"><img src="/@/assets/sxt.png" alt="" style="width: 1.5vw;margin-left: 1.1vw;margin-top: .75vw;"></div>
+                                    <div class="js-top">
+
+                                        <div>摄像头</div>
+                                        <div class="js-bottom">
+                                            25
+                                        </div>
+                                    </div>
+                             </div>
+
+                             <div class="js-flex">
+                                <div class="js-tb"><img src="/@/assets/xf.png" alt="" style="width: 1.4vw;margin-left: 1.1vw;margin-top: .75vw;"></div>
+                                    <div class="js-top">
+
+                                        <div>消防设施</div>
+                                        <div class="js-bottom">
+                                            10
+                                        </div>
+                                    </div>
+                             </div>
+                             <div class="js-flex">
+                                <div class="js-tb"><img src="/@/assets/yg.png" alt="" style="width: 1.5vw;margin-left: 1vw;margin-top: .75vw;"></div>
+                                    <div class="js-top">
+
+                                        <div>烟感</div>
+                                        <div class="js-bottom">
+                                            23
+                                        </div>
+                                    </div>
+                             </div>
+
+                                <div></div>
+                                <div></div>
+                            </div>
+                        </div>
+                    </span>
+                </div>
+            </div>
+            <div class="visual_box visualSfzsfl">
+                <div class="visual_title">
+                    <span>仪器借用统计(近6月){{ dogName }}</span>
+                    <img src="/@/assets/header/xiaotitle.png">
+                </div>
+                <div class="visual_table">
+                    <div :style="{ width: '100%', height: '100%' }">
+                        <LendEcharts :option="option" />
+                    </div>
+
                 </div>
             </div>
 
@@ -33,17 +109,18 @@
                                 <div>
                                     <h3>仪器总数(台)</h3>
                                     <p>{{ ltydata.count }}</p>
+
                                 </div>
                             </div>
                             <div class="visual_conTop_box visual_conTop2">
                                 <div>
                                     <h3>仪器借出(台)</h3>
                                     <!-- <p>{{ ltydata.lent_number }}</p> -->
-                                    <p>165</p>
+                                    <p>30</p>
                                     <div class="conTop_smil">
                                         <!-- fa-long-arrow-up -->
-                                        <a class="sz">周环比:<span>-5%</span><i class="fa fa-long-arrow-down"></i></a>
-                                        <a class="xd">月环比:<span>-2%</span><i class="fa fa-long-arrow-down"></i></a>
+                                        <a class="sz">周环比:<span>-1%</span><i class="fa fa-long-arrow-down"></i></a>
+                                        <a class="xd">月环比:<span>-1%</span><i class="fa fa-long-arrow-down"></i></a>
                                     </div>
                                 </div>
                             </div>
@@ -57,12 +134,9 @@
                             </div>
                             <div class="visual_conTop_box visual_conTop2">
                                 <div>
-                                    <h3>仪器损坏(台)</h3>
-                                    <p>{{ ltydata.repair_number }}</p>
-                                    <div class="conTop_smil">
-                                        <a class="null">null</a>
-                                        <a class="xd">月环比:<span>-10%%</span><i class="fa fa-long-arrow-down"></i></a>
-                                    </div>
+                                    <h3>上月仪器损坏数(台)</h3>
+                                    <!-- <p>{{ ltydata.repair_number }}</p> -->
+                                    <p>{{ 0 }}</p>
                                 </div>
                             </div>
 
@@ -78,7 +152,7 @@
                 </div>
                 <div class="visual_table">
                     <div :style="{ width: '100%', height: '100%' }">
-                        <Echarts :option="option"/>
+                        <Echarts :option="option" />
                     </div>
                 </div>
             </div>
@@ -86,21 +160,27 @@
 
     </div>
 
+
+
 </template>
 
 <script setup lang="ts" name="Home">
-import {onMounted, reactive, computed, ref, onUnmounted} from 'vue';
-import {useRouter} from 'vue-router'
+import { onMounted, reactive, computed, ref, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router'
 import useDog from '/@/api/frontend/home/index'
-import {ElLoading} from 'element-plus'
+import { ElLoading } from 'element-plus'
 // Echarts
 import Echarts from '/@/components/ReEcharts/index.vue';
+import LendEcharts from '/@/components/ReEcharts/lend.vue';
+
 import createAxios from '/@/utils/axios'
+import "/@/Build/B.loader.js"
+import "/@/Build/B.framework.js"
 
 const router = useRouter()
 
 // import Particle from '/@/layouts/frontend/components/particle.vue'
-const {dogList, dogName, getDog} = useDog()
+const { dogList, dogName, getDog } = useDog()
 const ltydata = reactive({
     labinfo: [{
         laboratory_introduction: '',
@@ -115,14 +195,14 @@ const ltydata = reactive({
         "RTK": 258,
         "全站仪": 546,
         "无人机": 23,
-        "其他": 435
+        "配件及其他": 435
     },
 });
 const imagesa = ref(null)
 await createAxios({
-        url: '/api/ScreenData/getdata',
-        method: 'get',
-    },
+    url: '/api/ScreenData/getdata',
+    method: 'get',
+},
     {
         loading: true,
     }
@@ -138,9 +218,9 @@ await createAxios({
 const timer: any = ref(null);
 const checkBackendStatus: any = async () => {
     const response = await createAxios({
-            url: '/api/ScreenData/getCurrent',
-            method: 'get',
-        }
+        url: '/api/ScreenData/getCurrent',
+        method: 'get',
+    }
     ).then(async (val: any) => {
         console.log(val.data)
         if (val.code == 1) {
@@ -157,6 +237,100 @@ const checkBackendStatus: any = async () => {
 onMounted(() => {
     // 每5秒轮询一次
     timer.value = setInterval(checkBackendStatus, 5000);
+    /* bg模型 */
+
+    var container = document.querySelector("#unity-container");
+    var canvas = document.querySelector("#unity-canvas");
+    var loadingBar = document.querySelector("#unity-loading-bar");
+    var progressBarFull = document.querySelector("#unity-progress-bar-full");
+    var fullscreenButton = document.querySelector("#unity-fullscreen-button");
+    var warningBanner = document.querySelector("#unity-warning");
+
+    // Shows a temporary message banner/ribbon for a few seconds, or
+    // a permanent error message on top of the canvas if type=='error'.
+    // If type=='warning', a yellow highlight color is used.
+    // Modify or remove this function to customize the visually presented
+    // way that non-critical warnings and error messages are presented to the
+    // user.
+    function unityShowBanner(msg, type) {
+        function updateBannerVisibility() {
+            warningBanner.style.display = warningBanner.children.length ? 'block' : 'none';
+        }
+        var div = document.createElement('div');
+        div.innerHTML = msg;
+        warningBanner.appendChild(div);
+        if (type == 'error') div.style = 'background: red; padding: 10px;';
+        else {
+            if (type == 'warning') div.style = 'background: yellow; padding: 10px;';
+            setTimeout(function () {
+                warningBanner.removeChild(div);
+                updateBannerVisibility();
+            }, 5000);
+        }
+        updateBannerVisibility();
+    }
+
+    var buildUrl = "./assets";
+    var loaderUrl = buildUrl + "/B.loader.js";
+    var config = {
+        dataUrl: buildUrl + "/B.data",
+        frameworkUrl: buildUrl + "/B.framework.js",
+        codeUrl: buildUrl + "/B.wasm",
+        streamingAssetsUrl: "StreamingAssets",
+        companyName: "DefaultCompany",
+        productName: "2Building",
+        productVersion: "0.1.0",
+        showBanner: unityShowBanner,
+    };
+
+    // By default, Unity keeps WebGL canvas render target size matched with
+    // the DOM size of the canvas element (scaled by window.devicePixelRatio)
+    // Set this to false if you want to decouple this synchronization from
+    // happening inside the engine, and you would instead like to size up
+    // the canvas DOM size and WebGL render target sizes yourself.
+    // config.matchWebGLToCanvasSize = false;
+
+    if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {
+        // Mobile device style: fill the whole browser client area with the game canvas:
+
+        var meta = document.createElement('meta');
+        meta.name = 'viewport';
+        meta.content = 'width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes';
+        document.getElementsByTagName('head')[0].appendChild(meta);
+        container.className = "unity-mobile";
+        canvas.className = "unity-mobile";
+
+        // To lower canvas resolution on mobile devices to gain some
+        // performance, uncomment the following line:
+        // config.devicePixelRatio = 1;
+
+
+    } else {
+        // Desktop style: Render the game canvas in a window that can be maximized to fullscreen:
+
+        canvas.style.width = "960px";
+        canvas.style.height = "600px";
+    }
+
+    loadingBar.style.display = "block";
+
+    var script = document.createElement("script");
+    script.src = loaderUrl;
+    script.onload = () => {
+        createUnityInstance(canvas, config, (progress) => {
+            progressBarFull.style.width = 100 * progress + "%";
+        }).then((unityInstance) => {
+            loadingBar.style.display = "none";
+            //                fullscreenButton.onclick = () => {
+            //                  unityInstance.SetFullscreen(1);
+            //                };
+        }).catch((message) => {
+            alert(message);
+        });
+    };
+
+    document.body.appendChild(script);
+
 });
 
 onUnmounted(() => {
@@ -171,7 +345,7 @@ const option = reactive({
     //     subtext: 'Fake Data',
     //     left: 'center'
     //   },
-    color: ['#05f8d6', '#0082fc', '#fdd845', '#22ed7c', '#09b0d3', '#1d27c9', '#f9e264'],
+    color: ['#05f8d6', '#0082fc', '#fdd845', '#22ed7c','#09b0d3', '#f9e264', '	#40E0D0', '#4169E1','#1E90FF'],
     tooltip: {
         trigger: 'item'
     },
@@ -189,11 +363,21 @@ const option = reactive({
             type: 'pie',
             radius: '50%',
             data: [
-                {value: ltydata['a']['水准仪'], name: '水准仪'},
-                {value: ltydata['a']['RTK'], name: 'RTK'},
-                {value: ltydata['a']['全站仪'], name: '全站仪'},
-                {value: ltydata['a']['无人机'], name: '无人机'},
-                {value: ltydata['a']['其他'], name: '其他'},
+                // { value: ltydata['a']['水准仪'], name: '水准仪' },
+                // { value: ltydata['a']['RTK'], name: 'RTK' },
+                // { value: ltydata['a']['全站仪'], name: '全站仪' },
+                // { value: ltydata['a']['无人机'], name: '无人机' },
+                // { value: ltydata['a']['配件及其他'], name: '配件及其他' },
+                { value: 237, name: '水准仪' },
+                { value: 178, name: 'RTK' },
+                { value: 284, name: '全站仪' },
+                { value: 96, name: '无人机' },
+                { value: 309, name: '经纬仪' },
+                { value: 105, name: 'MSS' },
+                { value: 207, name: '遥感工作站' },
+                { value: 52, name: '激光雷达' },
+                { value: 851, name: '配件及其他' },
+
             ],
             emphasis: {
                 itemStyle: {
@@ -210,6 +394,8 @@ const option = reactive({
     ]
 
 });
+
+
 </script>
 
 
@@ -217,12 +403,12 @@ const option = reactive({
 .bg {
     width: 100vw;
     height: 100vh;
-    background: url(/@/assets/bg.jpg) repeat;
+    /* background: url(/@/assets/bg.jpg) repeat; */
     background-size: 100%;
     color: var(--el-color-white);
-    z-index: -1;
+    /* z-index: -1; */
     position: absolute;
-    background-attachment: fixed
+    /* background-attachment: fixed */
 }
 
 .jieshao {
@@ -233,7 +419,18 @@ const option = reactive({
 
 .visual {
     height: 800px;
+    width: 100vw;
     padding-top: 8vw;
+    position: absolute;
+    z-index: 1;
+    pointer-events: none;
+}
+
+.visual .visual_box,
+.visual img,
+.visual div {
+    pointer-events: auto;
+    /* 这些元素将继续响应鼠标事件 */
 }
 
 .visual_box {
@@ -352,6 +549,7 @@ const option = reactive({
     height: 23px;
     margin-right: 5px;
     margin-top: -2px;
+
 }
 
 .visual_left .sfzcll .sfzcll_box .sfzcll_smallBk {
@@ -361,7 +559,7 @@ const option = reactive({
     padding: 2px 5px;
 }
 
-.visual_left .sfzcll .sfzcll_box .sfzcll_smallBk > div {
+.visual_left .sfzcll .sfzcll_box .sfzcll_smallBk>div {
     height: 100%;
     background: url(../images/ksh38.png) no-repeat;
     background-size: 100% 100%;
@@ -396,7 +594,7 @@ const option = reactive({
     float: left;
 }
 
-.visual_con .visual_conTop .visual_conTop1 > div {
+.visual_con .visual_conTop .visual_conTop1>div {
     background: url(../images/ksh40.png) no-repeat;
     background-size: 100% 100%;
 }
@@ -407,7 +605,7 @@ const option = reactive({
     float: left;
 }
 
-.visual_con .visual_conTop .visual_conTop2 > div {
+.visual_con .visual_conTop .visual_conTop2>div {
     background: url(../images/ksh39.png) no-repeat;
     background-size: 100% 100%;
 }
@@ -418,16 +616,16 @@ const option = reactive({
     float: right;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div {
+.visual_con .visual_conTop .visual_conTop_box>div {
     height: 100%;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div h3 {
+.visual_con .visual_conTop .visual_conTop_box>div h3 {
     color: #fff;
     font-size: 1vw;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div p {
+.visual_con .visual_conTop .visual_conTop_box>div p {
     width: 40%;
     float: left;
     line-height: 4vw;
@@ -437,7 +635,7 @@ const option = reactive({
     font-family: 'yjsz';
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil {
     width: 59%;
     height: 4vw;
     float: left;
@@ -445,26 +643,26 @@ const option = reactive({
     font-size: 0.7vw;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil a {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a {
     display: block;
     text-align: left;
     color: #fff;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil span {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil span {
     display: inline-block;
     margin-left: 0.2vw;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil a.sz {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a.sz {
     color: #ff9900;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil a.xd {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a.xd {
     color: #12fe81;
 }
 
-.visual_con .visual_conTop .visual_conTop_box > div .conTop_smil a.null {
+.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a.null {
     visibility: hidden;
 }
 
@@ -475,7 +673,7 @@ const option = reactive({
     position: relative;
 }
 
-.visual_con .visual_conBot > img {
+.visual_con .visual_conBot>img {
     position: absolute;
     width: 25px;
     height: 25px;
@@ -614,8 +812,73 @@ const option = reactive({
     font-size: 0.85vw !important;
     color: #d7dcf6;
 }
-</style>
 
+#unity-container {
+    width: 100vw;
+    height: 100vh;
+}
+
+#unity-canvas {
+    width: 100vw !important;
+    height: 100vh !important;
+}
+
+/* 实验室介绍 */
+.jieshao-top {
+    display: flex;
+    margin-left: 2vw;
+    /* align-items: center; */
+}
+
+.js-left img {
+    width: 7vw;
+}
+
+.js-right {
+    /* margin-top: 1vw; */
+    margin-left: 1vw;
+}
 
+.js-right div{
+    width: 12vw;
+    background-size: 100%;
+    background-image:url("../../assets/tb.png");
+	background-repeat:no-repeat;/*设置背景不重复*/
+    margin-top: 1vw;
+}
 
+.js-color {
+    font-size: 1.2vw;
+    color: #d4bb74;
+    margin: 0 .5vw;
+    font-weight: bold;
+    font-style:italic
+}
+
+.js-bottom {
+    color: #d4bb74;
+    font-size: 1.2vw;
+    font-weight: bold;
+    font-style:italic
+}
 
+.jieshao-bottom {
+    display: flex;
+    margin-left: 1vw;
+}
+.js-flex{
+    display: flex;
+    margin-left: 1vw;
+}
+.js-tb{
+    width: 3.5vw;
+    background-size: 100%;
+    background-image:url("../../assets/hh.png");
+	background-repeat:no-repeat;/*设置背景不重复*/
+
+}
+
+.js-span{
+    margin-left: 3vw;
+}
+</style>

+ 20 - 20
web/src/layouts/frontend/Yiqi.vue

@@ -14,7 +14,9 @@
                 <div>
                   <h3>仪器总数(台)</h3>
                   <div class="visual_shuju">
+                    <!-- <p class="danshu">{{ ltydata.count }}</p> -->
                     <p class="danshu">{{ ltydata.count }}</p>
+
                   </div>
 
                 </div>
@@ -31,28 +33,25 @@
                   <h3>仪器借出(台)</h3>
                   <div class="visual_shuju">
                     <!-- <p class="shuanshu">{{ ltydata.lent_number }}</p> -->
-                    <p class="shuanshu">165</p>
+                    <p class="shuanshu">30</p>
                     <div class="conTop_smil">
                       <!-- fa-long-arrow-up -->
-                      <a class="sz">周环比:<span>-5%</span><i class="fa fa-long-arrow-down"></i></a>
-                      <a class="xd">月环比:<span>-2%</span><i class="fa fa-long-arrow-down"></i></a>
+                      <a class="sz">周环比:<span>-1%</span><i class="fa fa-long-arrow-down"></i></a>
+                                        <a class="xd">月环比:<span>-1%</span><i class="fa fa-long-arrow-down"></i></a>
                     </div>
                   </div>
                 </div>
               </div>
 
-              <div class="visual_conTop_box visual_conTop2">
-                <div>
-                  <h3>仪器损坏(台)</h3>
-                  <div class="visual_shuju">
-                    <p class="shuanshu">{{ ltydata.repair_number }}</p>
-                    <div class="conTop_smil">
-                      <a class="null">null</a>
-                      <a class="xd">月环比:<span>-10%</span><i class="fa fa-long-arrow-down"></i></a>
-                    </div>
-                  </div>
+
+              <div class="visual_conTop_box visual_conTop1">
+                <div class="visual_shuju">
+                  <h3>上月仪器损坏数(台)</h3>
+                  <p class="danshu">{{ 0 }}</p>
+                  <!-- <p class="danshu">{{ ltydata.repair_number }}</p> -->
                 </div>
               </div>
+
             </div>
           </div>
         </div>
@@ -110,7 +109,7 @@
         <dv-border-box13 style="width:25vw;height:15.5vw;padding-left: 0.5vw;padding-top: 0.5vw;"
           :color="['#4fd2dd', '#235fa7']">
           <div class="box2_right_title">
-            仪器借用排行
+            仪器借用排行(近6月)
           </div>
           <div class="box2_right_con">
             <dv-scroll-ranking-board :config="config2" style="width:24vw;height:11.5vw" />
@@ -127,7 +126,7 @@
 
 <script setup lang="ts" name="Home">
 import {onMounted, ref, reactive, computed, onUnmounted} from 'vue';
-// import { BorderBox13 as DvBorderBox13 } from '@kjgl77/datav-vue3'
+import { BorderBox13 as DvBorderBox13 } from '@kjgl77/datav-vue3'
 import dayjs from 'dayjs';
 import Echarts from '/@/components/ReEcharts/index.vue';
 import * as echarts from 'echarts';
@@ -151,7 +150,7 @@ const ltydata = reactive({
     "RTK": 43,
     "全站仪": 89,
     "无人机": 19,
-    "其他": 68
+    "配件及其他": 68
   },
   labborrow: [],
 
@@ -209,10 +208,10 @@ let config: any = reactive({
   indexHeader: '',
   oddRowBGC: '#31416042',
   evenRowBGC: '',
-  columnWidth: [110],
+  // columnWidth: [110],
   align: ['center'],
   rowNum: 4,
-  columnWidth: [130, 200, 100, 100],
+  columnWidth: [200, 200, 200, 200],
 })
 
 
@@ -229,16 +228,17 @@ await createAxios({
   }
 ).then(async (val: any) => {
 
-  //  console.log(val)
+   console.log(val)
   //  yiqiData.value = val.data
   //  console.log(yiqiData.value)
 
   Object.assign(ltydata, val.data);
   var reb_labborrow = [];
   ltydata.labborrow.forEach(elm => {
+
     reb_labborrow.push([
       pps_svg(elm.purpose),
-      '<span style="font-size:0.8vw">' + elm.create_time + '</span>',
+      '<span style="font-size:0.8vw">' + elm.create_time.split(" ")[0] + '</span>',
       '<span style="font-size:0.8vw">' + elm.username + '</span>',
       sta_style(elm.status)
     ])

+ 26 - 17
web/src/views/frontend/index.vue

@@ -8,8 +8,8 @@
             <el-col :span="6">
                 <div class="header-title header-title-left">
                     <iframe scrolling="no" id="frame"
-                            src="https://widget.tianqiapi.com/?style=tv&skin=pitaya&color=79bbff&fontsize=18&align=center"
-                            frameborder="0" width="200" height="24" allowtransparency="true"></iframe>
+                        src="https://widget.tianqiapi.com/?style=tv&skin=pitaya&color=79bbff&fontsize=18&align=center"
+                        frameborder="0" width="200" height="24" allowtransparency="true"></iframe>
                 </div>
             </el-col>
             <el-col :span="12">
@@ -32,7 +32,7 @@
             <img src="~assets/header/footer.png" alt="">
         </div>
         <div class="footer_text">
-            Copyright @ 2023~{{ new Date().getFullYear() }} 桂林壹斗米信息科技有限公司{{ siteConfig.siteName }}
+            Copyright @ 2023~{{ new Date().getFullYear() }} 壹斗米工作室{{ siteConfig.siteName }}
             {{ $t('Copyright') }}
             <a href="http://beian.miit.gov.cn/">{{ siteConfig.recordNumber }}</a>
         </div>
@@ -41,9 +41,9 @@
 </template>
 
 <script setup lang="ts">
-import {useSiteConfig} from '/@/stores/siteConfig'
-import {ref, onMounted} from 'vue'
-import {RouterView, RouterLink} from 'vue-router'
+import { useSiteConfig } from '/@/stores/siteConfig'
+import { ref, onMounted } from 'vue'
+import { RouterView, RouterLink } from 'vue-router'
 
 const siteConfig = useSiteConfig()
 // 日期显示
@@ -78,7 +78,6 @@ function toHome() {
 // }
 </script>
 <style scoped lang="scss">
-
 .main-content {
     margin: 0 auto;
     margin-top: 30px;
@@ -180,6 +179,7 @@ function toHome() {
             height: unset;
         }
     }
+
     .main-container {
         width: 90% !important;
         flex-wrap: wrap;
@@ -204,6 +204,13 @@ function toHome() {
     }
 }
 
+.header {
+    position: absolute;
+    top: 0;
+    width: 100%;
+    z-index: 1;
+}
+
 .header {
     background-color: var(--ba-bg-color-overlay);
     box-shadow: 0 0 8px rgba(0 0 0 / 8%);
@@ -218,9 +225,7 @@ function toHome() {
         position: absolute;
     }
 
-    .header-content {
-
-    }
+    .header-content {}
 
     .header-title {
         // font-size: 2vw;
@@ -234,13 +239,14 @@ function toHome() {
 
     }
 
-    .header-title-center > span {
+    .header-title-center>span {
         background: linear-gradient(to bottom, rgb(206, 227, 255), rgb(20, 122, 255));
         -webkit-background-clip: text;
         color: transparent;
     }
 
-    .header-title-right, .header-title-left {
+    .header-title-right,
+    .header-title-left {
         color: #79bbff;
         font-size: 18px;
         margin-top: 1.3vw;
@@ -322,7 +328,7 @@ function toHome() {
 
 }
 
-.footer > img {
+.footer>img {
     width: 100%;
 }
 
@@ -352,7 +358,7 @@ function toHome() {
 
 }
 
-.footer_bg > img {
+.footer_bg>img {
     width: 100%;
 }
 
@@ -361,14 +367,17 @@ function toHome() {
     bottom: 0;
     font-size: 12px;
     margin-bottom: 0.2vw;
+    color: #fff;
 }
-
 </style>
 <style>
-html, body, #app {
+html,
+body,
+#app {
     background: none !important;
 }
 
 .moushiqie {
     z-index: 999;
-}</style>
+}
+</style>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.