Procházet zdrojové kódy

feat: 新增APP包上传菜单

liujt před 9 měsíci
rodič
revize
447415d7a4

+ 242 - 0
src/views/appUpdate/components/addOrEditDialog.vue

@@ -0,0 +1,242 @@
+<template>
+  <ele-modal custom-class="ele-dialog-form long-dialog-form"
+             :centered="true" :visible.sync="addOrEditDialogFlag" :title="title"
+             append-to-body
+             :close-on-click-modal="false" width="28%" :before-close="cancel" :maxable="true">
+    <el-form ref="form" :model="form" :rules="rules" class="el-form-box" label-width="110px">
+      <headerTitle title="基本信息"/>
+      <el-row :gutter="12">
+        <el-col :span="12">
+          <div style="margin:0 0 10px 70px">
+            <span>示例</span>
+            <span style="color: red;margin-left: 10px">
+               {{ getExample }}
+             </span>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="24">
+          <el-form-item label="分类" prop="type">
+<!--            <ele-tree-select-->
+<!--              clearable-->
+<!--              :data="typeList"-->
+<!--              v-model="form.type"-->
+<!--              placeholder="请选择"-->
+<!--              valueKey="id"-->
+<!--              labelKey="name"-->
+<!--              childrenKey="subList"-->
+<!--            />-->
+            <DictSelection dictName="版本规则分类" clearable filterable v-model="form.type" :isProhibit="type=='view'">
+            </DictSelection>
+<!--            <el-select v-model="form.type" filterable style="width: 100%;" :disabled="type=='view'">-->
+<!--              <el-option v-for="item in typeList" :key="item.id" :value="item.id" :label="item.name"></el-option>-->
+<!--            </el-select>-->
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="24">
+          <el-form-item label="名称" prop="name">
+            <el-input v-model="form.name" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="大版本采用" prop="noteType">
+            <el-select v-model="form.noteType" @change="handleNoteType" :disabled="type=='view'" style="width: 100%;">
+              <el-option :value="1" label="字母"></el-option>
+              <el-option :value="2" label="数字"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="位数" prop="noteNum" label-width="50px">
+            <el-select v-model="form.noteNum" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="1"></el-option>
+              <el-option :value="2" label="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="大版本初始值" prop="note">
+            <el-input v-model="form.note" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <span style="margin-left: 10px;line-height: 38px;color: red">默认字母A,数字1</span>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="连接符" prop="mark">
+            <el-input v-model="form.mark" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="小版本初始值" prop="versionNumber">
+            <el-input type="number" v-model="form.versionNumber" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="位数" prop="versionNum" label-width="50px">
+            <el-select v-model="form.versionNum" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="1"></el-option>
+              <el-option :value="2" label="2"></el-option>
+              <el-option :value="3" label="3"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="变更后版本">
+            <el-select v-model="form.changeType" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="提升大版本"></el-option>
+              <el-option :value="2" label="提升小版本"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer">
+      <el-button v-if="type!=='view'" type="primary" @click="handleSave">保存</el-button>
+      <el-button @click="cancel">返回</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+import {getDetailsByIdAPI, versionManageSaveAPI, versionManageUpdateAPI} from "@/api/versionManage";
+import {getInfoById} from "@/api/classifyManage";
+
+export default {
+  name: "addOrEditDIalog",
+  props: {
+    addOrEditDialogFlag: Boolean,
+    typeList: {
+      type: Array,
+      default: () => {
+        return []
+      }
+    },
+  },
+  data() {
+    return {
+      title: '',
+      type: '',
+      form: {
+        id: '',
+        type: '',
+        name: '',
+        noteType: 1,
+        noteNum: 1,
+        note: 'A',
+        mark: '.',
+        versionNumber: '1',
+        versionNum: 1,
+        changeType: 1,
+      },
+
+    }
+  },
+  computed: {
+    getExample() {
+      let value = this.form.note || (this.form.noteType == 1 ? 'A' : '1')
+      return value + this.form.mark + this.form.versionNumber
+    },
+    rules() {
+      return {
+        type: [{required: true, message: '请选择', trigger: 'change'}],
+        name: [{required: true, message: '请输入', trigger: 'blur'}],
+        noteType: [{required: true, message: '请选择', trigger: 'change'}],
+        noteNum: [{required: true, message: '请选择', trigger: 'change'}],
+        mark: [
+          {required: true, message: '请输入', trigger: 'blur'},
+          {validator: this.markValidate, trigger: ['blur']},
+        ],
+        note: [{required: false, validator: this.noteValidate, trigger: 'blur'}],
+        versionNum: [
+          {required: true, message: '请输入', trigger: ['blur', 'change']},
+
+        ],
+        versionNumber: [
+          {required: true, message: '请输入', trigger: 'blur'},
+          {validator: this.versionNumValidate, trigger: ['blur', 'change']},
+        ],
+      }
+    }
+  },
+  methods: {
+    handleNoteType(val) {
+      this.form.note = val == 1 ? 'A' : '1'
+    },
+    noteValidate(rule, value, callback) {
+      if (!value) callback()
+      let regex = this.form.noteType == 1 ? `[A-Z]` : `[0-9]`
+      let regexA = new RegExp(`^${regex}{${this.form.noteNum}}$`)
+      if (!regexA.test(value)) {
+        callback(new Error('输入格式错误'))
+      }
+      callback()
+    },
+    versionNumValidate(rule, value, callback) {
+      if (!value) callback('请输入')
+      let regex = `[0-9]`
+      let regexA = new RegExp(`^${regex}{${this.form.versionNum}}$`)
+      if (!regexA.test(value)) {
+        callback(new Error('输入格式错误'))
+      }
+      callback()
+    },
+    markValidate(rule, value, callback) {
+      if (!value) callback('请输入')
+      const regex = /^[~*_\-:;,./]+$/;
+      if (!regex.test(value)) {
+        callback(new Error('输入格式错误,可选连接符(~ * _ \ - : ; , . /)'))
+      }
+      callback()
+    },
+    //页面初始化
+    init(type, row = {}) {
+      this.title = type == 'add' ? '新增' : type == 'edit' ? '修改' : '详情'
+      this.type = type
+      if (type !== 'add') {
+        this.getDetail(row.id)
+      }
+    },
+    async getDetail(id) {
+      this.loading = true;
+      this.form = await getDetailsByIdAPI(id);
+      this.loading = false;
+    },
+    handleSave() {
+      this.$refs.form.validate(async valid => {
+        if (!valid) return
+        const API = this.type == 'add' ? versionManageSaveAPI : versionManageUpdateAPI
+        await API(this.form)
+        this.$message.success('操作成功')
+        this.cancel()
+        this.$emit('reload')
+      })
+
+    },
+    //关闭弹窗
+    cancel() {
+      this.$emit('update:addOrEditDialogFlag', false)
+    },
+  }
+}
+</script>
+
+
+<style scoped lang="scss">
+
+</style>

+ 344 - 0
src/views/appUpdate/index.vue

@@ -0,0 +1,344 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <index-search :typeList="typeList" @search="reload"/>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        height="calc(100vh - 325px)"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+        :pageSize="this.$store.state.tablePageSize"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('','add')"
+            v-if="$hasPermission('main:version:save')"
+          >
+            新建
+          </el-button>
+          <el-button
+            size="small"
+            type="danger"
+            icon="el-icon-delete"
+            class="ele-btn-icon"
+            v-if="$hasPermission('main:version:delete')"
+            @click="removeBatch"
+            plain
+          >
+            删除
+          </el-button>
+          <!--          <el-button-->
+          <!--            size="small"-->
+          <!--            type="primary"-->
+          <!--            icon="el-icon-upload2"-->
+          <!--            class="ele-btn-icon"-->
+          <!--            plain-->
+          <!--          >-->
+          <!--            导出-->
+          <!--          </el-button>-->
+          <!--          <el-button-->
+          <!--            size="small"-->
+          <!--            type="primary"-->
+          <!--            icon="el-icon-download"-->
+          <!--            class="ele-btn-icon"-->
+          <!--            plain-->
+          <!--          >-->
+          <!--            导入-->
+          <!--          </el-button>-->
+        </template>
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            v-if="row.status!=1&&$hasPermission('main:version:update')"
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row,'edit')"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openEdit(row, 'view')"
+          >
+            详情
+          </el-link>
+          <el-popconfirm
+            v-if="row.status!=1&&$hasPermission('main:version:delete')"
+            class="ele-action"
+            title="确定要删除当前版本规则吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+        <template v-slot:status="scope">
+          <el-switch
+            @change="(val)=>handleStatus(scope,val)"
+            :active-value="1"
+            :inactive-value="0"
+            v-model="scope.row.status"
+            active-color="#13ce66"
+            inactive-color="#ff4949">
+          </el-switch>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <!-- 新增/编辑/详情弹窗 -->
+    <add-or-edit-dialog
+      :addOrEditDialogFlag.sync="addOrEditDialogFlag"
+      v-if="addOrEditDialogFlag"
+      ref="addOrEditDialogRef"
+      :data="current"
+      :typeList="typeList"
+      @reload="reload"
+    />
+  </div>
+</template>
+
+<script>
+import addOrEditDialog from './components/addOrEditDialog.vue';
+import dictMixins from '@/mixins/dictMixins';
+import FileUpload from "@/components/upload/fileUpload.vue";
+import {getFile} from "@/api/system/file";
+import {reviewStatus} from "@/enum/dict";
+import {getSubTwoLevelAPI, getVersionManagePageAPI, updateStatus, versionManageDeleteAPI} from "@/api/versionManage";
+import indexSearch from "@/views/versionManage/components/index-search.vue";
+import {getSubPage} from "@/api/classifyManage";
+import {getByCode} from "@/api/system/dictionary-data";
+
+export default {
+  name: 'technologyProduction',
+  components: {
+    FileUpload,
+    indexSearch,
+    addOrEditDialog
+  },
+  mixins: [dictMixins],
+  data() {
+    return {
+      levelOptions: [
+        {
+          label: '初级',
+          value: '1'
+        },
+        {
+          label: '中级',
+          value: '2'
+        },
+        {
+          label: '高级',
+          value: '3'
+        }
+      ],
+      isView: false,
+      // 表格列配置
+      columns: [
+        {
+          columnKey: 'selection',
+          type: 'selection',
+          width: 45,
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center'
+        },
+        {
+          slot: 'name',
+          prop: 'name',
+          label: '名称',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110
+        },
+        {
+          slot: 'type',
+          prop: 'type',
+          label: '分类',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (row, column) => {
+            return this.getDictV('version_rule_type',row.type) ;
+          },
+          minWidth: 110
+        },
+        {
+          slot: 'getExample',
+          prop: 'getExample',
+          label: '规则示例',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (_row, _column, cellValue) => {
+            let value = _row.note || (_row.noteType == 1 ? 'A' : '1')
+            return value + _row.mark + _row.versionNumber
+          },
+          minWidth: 120
+        },
+        {
+          label: '是否启用',
+          prop: 'status',
+          slot: 'status',
+          align: "center",
+          width: 120,
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 260,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true
+        }
+      ],
+      // 表格选中数据
+      selection: [],
+      dictList: {},
+      // 当前编辑数据
+      current: null,
+      typeList: [],
+      // 是否显示编辑弹窗
+      addOrEditDialogFlag: false,
+    };
+  },
+  created() {
+    this.getTypeList()
+  },
+  computed: {},
+  methods: {
+    // getTypeName(list, val, callBack) {
+    //   let find = list.find(item => callBack(item, val)) || {}
+    //   if (find.name) {
+    //     return find.name
+    //   } else {
+    //     for (let i = 0; i < list.length; i++) {
+    //       let find = list[i].subList.find(item => callBack(item, val)) || {}
+    //       if (find.name) {
+    //         return find.name
+    //       }
+    //     }
+    //   }
+    // },
+    getDictV(code, val) {
+      if (!this.dictList[code]) return '';
+      return this.dictList[code].find(item => item.value == val)?.label
+    },
+    async getDictList(code) {
+      let {data: res} = await getByCode(code)
+      this.dictList[code] = res.map(item => {
+        let values = Object.keys(item)
+        return {
+          value: values[0],
+          label: item[values[0]]
+        }
+      })
+    },
+    /* 表格数据源 */
+    async datasource({page, limit, where, order}) {
+      await this.getDictList('version_rule_type')
+      return await getVersionManagePageAPI({
+        ...where,
+        ...order,
+        pageNum: page,
+        size: limit
+      });
+    },
+    handleStatus(scope, val) {
+      let msg = val == 1 ? '是否启用该规则' : '是否关闭该规则'
+      this.$confirm(msg, '提示', {
+        type: 'warning'
+      }).then(async () => {
+        await updateStatus(
+          {
+            id: scope.row.id,
+            status: val
+          }
+        )
+        this.$message.success('操作成功')
+      }).catch(() => {
+        scope.row.status = val == 1 ? 0 : 1
+      })
+
+    },
+    async getTypeList() {
+      this.typeList = await getSubTwoLevelAPI({
+        parentId: 0,
+        pageNum: 1,
+        size: 9999
+      })
+
+      console.log(this.typeList);
+    },
+    downloadFile(file) {
+      getFile({objectName: file.storePath}, file.name);
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({page: 1, where: where});
+    },
+    /* 打开编辑弹窗 */
+    openEdit(row = {}, type) {
+      this.addOrEditDialogFlag = true
+      this.$nextTick(() => {
+        this.$refs.addOrEditDialogRef.init(type, {...row})
+      })
+    },
+    /* 删除 */
+    remove(row) {
+      const loading = this.$loading({lock: true});
+      versionManageDeleteAPI([row.id])
+        .then((msg) => {
+          loading.close();
+          this.$message.success('删除成功');
+          this.reload();
+        })
+        .catch((e) => {
+          loading.close();
+          // this.$message.error(e.message);
+        });
+    },
+    /* 批量删除 */
+    removeBatch() {
+      if (!this.selection.length) return this.$message.error('请至少选择一条数据');
+      if (this.selection.some(item => item.status == 1)) return this.$message.error('启用状态的规则不允许删除!请检查');
+      this.$confirm('确定要删除选中的规则吗?', '提示', {
+        type: 'warning'
+      }).then(() => {
+        const loading = this.$loading({lock: true});
+        versionManageDeleteAPI(this.selection.map((d) => d.id))
+          .then((msg) => {
+            loading.close();
+            this.$message.success('删除成功');
+            this.reload();
+          })
+          .catch((e) => {
+            loading.close();
+            // this.$message.error(e.message);
+          });
+      })
+        .catch(() => {
+        });
+    }
+  }
+};
+</script>