bill před 1 rokem
rodič
revize
500f1efdfb

+ 1 - 1
package.json

@@ -6,7 +6,7 @@
   "scripts": {
     "dev": "vite",
     "build": "vue-tsc --noEmit && npm run build-quisk",
-    "build-quisk": "vite build ./ fire && vite build ./ criminal && vite build ./ xmfire && vite build ./ ga",
+    "build-quisk": "vite build ./ criminal",
     "preview": "vite preview"
   },
   "dependencies": {

+ 4 - 4
src/app/criminal/store/example.ts

@@ -17,8 +17,8 @@ export const getExamplePagging = async (
 export const delExample = (example: Example) =>
   axios.post(deleteExample, { caseId: example.caseId });
 
-export const addExample = (caseTitle: string) =>
-  axios.post(setExampleUrl, { caseTitle });
+export const addExample = (example: Omit<Example, "id">) =>
+  axios.post(setExampleUrl, example);
 
-export const setExample = (caseTitle: string, id: number) =>
-  axios.post(setExampleUrl, { caseTitle, caseId: id });
+export const setExample = (example: Example) =>
+  axios.post(setExampleUrl, example);

+ 82 - 3
src/app/criminal/view/example/edit.vue

@@ -7,27 +7,106 @@
         placeholder="请输入案件名称"
       />
     </el-form-item>
+    <el-form-item label="创建人">
+      <el-input v-model="bindExample.caseCreator" placeholder="请输入案件创建人" />
+    </el-form-item>
+    <el-form-item label="案件信息">
+      <el-input
+        v-model="bindExample.caseInfo"
+        type="textarea"
+        :autosize="false"
+        :rows="5"
+        placeholder="请输入案件名称"
+      />
+    </el-form-item>
+    <el-form-item label="视频介绍"
+      ><el-upload
+        class="upload-demo"
+        :multiple="false"
+        :limit="1"
+        :disabled="!!file"
+        :before-upload="upload"
+        :file-list="fileList"
+        :http-request="() => {}"
+        :on-preview="previewFile"
+        :accept="accept"
+        :before-remove="removeFile"
+      >
+        <el-button type="primary" :disabled="!!file">
+          <el-icon><Upload /></el-icon>上传
+        </el-button>
+        <template v-slot:tip>
+          <div class="el-upload__tip">
+            注:可上传{{ size }}以内的{{ accept }}格式的文件
+          </div>
+        </template>
+        <template v-slot:file="{ file }: { file: UploadFile }">
+          <div class="file" @click.stop="previewFile()">
+            <div>
+              <el-icon><Document /></el-icon>
+              <span class="name">{{ file.name }}</span>
+            </div>
+            <el-icon @click.stop="removeFile()"><Close /></el-icon>
+          </div>
+        </template>
+      </el-upload>
+    </el-form-item>
   </el-form>
 </template>
 
 <script setup lang="ts">
 import { ref } from "vue";
 import { Example, setExample, addExample } from "@/app/criminal/store/example";
-import { ElMessage } from "element-plus";
+import { ElMessage, UploadFile } from "element-plus";
 import { QuiskExpose } from "@/helper/mount";
+import { useUpload } from "@/hook/upload";
+import { uploadFile } from "@/store/system";
 
 const props = defineProps<{ example?: Example }>();
 const bindExample = ref<Example>(props.example ? { ...props.example } : ({} as Example));
 
+const { size, fileList, upload, removeFile, previewFile, file, accept } = useUpload({
+  url: bindExample.value.caseInfoVideo,
+  maxSize: 100 * 1024 * 1024,
+  formats: [".mp4"],
+});
+
+fileList.value.push();
+
 defineExpose<QuiskExpose>({
   async submit() {
+    if (file.value && typeof file.value !== "string") {
+      const url = await uploadFile(file.value);
+      bindExample.value.caseInfoVideo = url;
+    }
+
     if (!bindExample.value.caseTitle || !bindExample.value.caseTitle.trim()) {
       ElMessage.error("案件名称不能为空");
       throw "案件名称不能为空";
     }
     await (bindExample.value.caseId
-      ? setExample(bindExample.value.caseTitle, bindExample.value.caseId)
-      : addExample(bindExample.value.caseTitle));
+      ? setExample(bindExample.value)
+      : addExample(bindExample.value));
   },
 });
 </script>
+
+<style scoped lang="scss">
+.upload-demo {
+  overflow: hidden;
+}
+
+.file {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  > div {
+    display: flex;
+    align-items: center;
+  }
+
+  .name {
+    margin-left: 10px;
+  }
+}
+</style>

+ 21 - 3
src/app/criminal/view/example/index.vue

@@ -29,6 +29,7 @@
       id="multipleTable"
       style="width: 100%"
       class="table"
+      @sort-change="sortChangeHandler"
       size="large"
     >
       <el-table-column label="序号" width="70" v-slot:default="{ $index }">
@@ -36,9 +37,13 @@
           {{ state.pag.size * (state.pag.currentPage - 1) + $index + 1 }}
         </div>
       </el-table-column>
-      <el-table-column label="标题" prop="caseTitle"></el-table-column>
+      <el-table-column label="标题" prop="caseTitle" sortable="custom"></el-table-column>
       <el-table-column label="承办单位" prop="deptName"></el-table-column>
-      <el-table-column label="创建时间" prop="createTime"></el-table-column>
+      <el-table-column
+        label="创建时间"
+        prop="createTime"
+        sortable="custom"
+      ></el-table-column>
       <el-table-column
         label="操作"
         v-slot:default="{ row }: { row: Example }"
@@ -84,16 +89,29 @@ import { Example, delExample, getExamplePagging } from "@/app/criminal/store/exa
 import CaseEditMenu from "@/view/case/editMenu.vue";
 import { gotoQuery } from "@/view/case/help";
 import { addExample, editExample } from "./quisk";
+import { computed } from "vue";
 
+type OrderValue = "descending" | "ascending" | null;
 const { state, refresh, queryReset, del, changPageSize, changPageCurrent } = usePagging({
   get: getExamplePagging,
   del: delExample,
   mapper: {
     delMsg: "删除案件,相关档案也会一并删除,确定要删除吗?",
   },
-  paramsTemlate: { caseTitle: "", deptId: "" },
+  paramsTemlate: {
+    caseTitle: "",
+    deptId: "",
+    caseTitleOrder: null as OrderValue,
+    createTimeOrder: null as OrderValue,
+  },
 });
 
+const sortChangeHandler = async (data) => {
+  state.query[data.prop + "Order"] =
+    data.order === "descending" ? "desc" : data.order === "ascending" ? "asc" : null;
+  return false;
+};
+
 const addHandler = async () => {
   if (await addExample({})) {
     refresh();

+ 2 - 2
src/app/ga/view/example/edit.vue

@@ -26,8 +26,8 @@ defineExpose<QuiskExpose>({
       throw "案件名称不能为空";
     }
     await (bindExample.value.caseId
-      ? setExample(bindExample.value.caseTitle, bindExample.value.caseId)
-      : addExample(bindExample.value.caseTitle));
+      ? setExample(bindExample.value)
+      : addExample(bindExample.value));
   },
 });
 </script>

+ 22 - 4
src/hook/upload.ts

@@ -4,6 +4,7 @@ import mime from "mime";
 
 export type UploadProps<T> = {
   maxSize: number;
+  url?: string;
   formats: string[];
   upload?: (
     file: File,
@@ -36,18 +37,23 @@ export const useUpload = <T>(props: UploadProps<T>) => {
       })
       .join(", ")
   );
-  const fileRef = ref<File>();
+  const fileRef = ref<File | string | undefined>(props.url);
 
-  (window as any).fileRef = fileRef;
   const removeFile = () => {
     fileRef.value = undefined;
     return true;
   };
   const previewFile = () => {
-    fileRef.value && window.open(URL.createObjectURL(fileRef.value));
+    if (!fileRef.value) return;
+    const url =
+      typeof fileRef.value === "string"
+        ? fileRef.value
+        : URL.createObjectURL(fileRef.value);
+    window.open(url);
   };
 
   const upload = async (file: File) => {
+    console.log(file);
     const fileType = file.name
       .substring(file.name.lastIndexOf("."))
       .toUpperCase();
@@ -71,7 +77,19 @@ export const useUpload = <T>(props: UploadProps<T>) => {
 
   return {
     file: fileRef,
-    fileList: computed(() => (fileRef.value ? [fileRef.value] : [])),
+    fileList: computed(() => {
+      if (!fileRef.value) return [];
+      if (typeof fileRef.value === "string") {
+        return [
+          {
+            url: fileRef.value,
+            name: fileRef.value.substring(fileRef.value.lastIndexOf("/") + 1),
+          },
+        ];
+      } else {
+        return [fileRef.value];
+      }
+    }),
     previewFile,
     removeFile,
     percentage,

+ 3 - 0
src/store/case.ts

@@ -14,6 +14,9 @@ import { CaseFile } from "./caseFile";
 export type Case = {
   caseId: number;
   caseTitle: string;
+  caseCreator: string;
+  caseInfo: string;
+  caseInfoVideo: string;
   createTime: string;
   name: string;
   tbStatus: string;

+ 1 - 0
src/store/scene.ts

@@ -62,6 +62,7 @@ export interface ModelScene extends BaseScene {
   modelId: number;
   createStatus: ModelSceneStatus;
   modelSize: string;
+  sysLevel: boolean;
   modelDateType: string;
   progress?: number;
   createTime: string;

+ 5 - 2
src/view/vrmodel/modelContent.vue

@@ -39,6 +39,9 @@
     <el-table-column label="标题" prop="modelTitle"></el-table-column>
     <el-table-column label="原始数据格式" prop="modelDateType"></el-table-column>
     <el-table-column label="大小" prop="modelSize"></el-table-column>
+    <el-table-column label="来源" v-slot:default="{ row }">
+      {{ row.sysLevel ? "模型库" : "用户上传" }}
+    </el-table-column>
     <el-table-column label="上传时间" v-slot:default="{ row }: { row: ModelScene }">
       {{ getStatusText(row) }}
     </el-table-column>
@@ -48,7 +51,7 @@
         class="oper-span"
         v-pdpath="['edit']"
         @click="editHanlder(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
+        v-if="row.createStatus === ModelSceneStatus.SUCCESS && !row.sysLevel"
       >
         修改
       </span>
@@ -61,6 +64,7 @@
         查看
       </span>
       <span
+        v-if="!row.sysLevel"
         class="oper-span delBtn"
         v-pdscene="row"
         @click="delOrCancel(row)"
@@ -94,7 +98,6 @@ import {
   ModelMaxSize,
   ModelSceneStatusDesc,
   ModelSupportFormats,
-  SceneTypePaths,
 } from "@/constant/scene";
 import { confirm } from "@/helper/message";
 import { useUpload } from "@/hook/upload";

+ 2 - 2
vite.config.ts

@@ -3,12 +3,12 @@ import vue from "@vitejs/plugin-vue";
 import { resolve } from "path";
 import ElementPlus from "unplugin-element-plus/vite";
 
-let app = "ga";
+let app = "criminal";
 if (process.argv.length > 3) {
   app = process.argv[process.argv.length - 1].trim();
 }
 
-const dev = false;
+const dev = true;
 
 export default defineConfig({
   define: {