<template> <div class="app-container"> <div style="margin: 0px 0px 10px 0px"> <el-alert title="根据C头文件自动生成EVM模块注册代码" type="success" ></el-alert> </div> <el-tabs v-model="activeName" type="border-card"> <el-tab-pane label="解析文件" name="first"> <div style="margin: 10px 0px"> <el-form> <el-form-item> <el-upload name="binfile" drag multiple ref="upload" action="null" :auto-upload="false" :http-request="handleUploadFile" :on-remove="handleUploadRemove" > <i class="el-icon-upload"></i> <div class="el-upload__text"> 将文件拖到此处,或<em>点击上传</em> </div> <div class="el-upload__tip" slot="tip">请选择C头文件</div> </el-upload> </el-form-item> <el-form-item> <el-button @click="uploadFile">开始上传</el-button> </el-form-item> </el-form> </div> </el-tab-pane> <el-tab-pane label="类型管理" name="second"> <el-table :data="markType" size="medium" style="width: 50%"> <el-table-column prop="key" label="typedef类型" min-width="180"> </el-table-column> <el-table-column prop="value" label="实际类型" min-width="180"> <template slot-scope="scope"> <el-row :gutter="20"> <el-col :span="12"> <el-select v-model="scope.row.value" placeholder="请选择C的实际类型" > <el-option v-for="item in baseType" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-col> <el-col :span="12"> <el-button type="primaey" size="medium" @click="updateMarkType(scope.row)" >更新值</el-button > </el-col> </el-row> </template> </el-table-column> </el-table> </el-tab-pane> </el-tabs> <el-dialog title="提示" width="50%" :visible.sync="dialogVisible"> <el-table :data="error_tips"> <el-table-column property="file" label="文件" min-width="300" ></el-table-column> <el-table-column property="line" label="行数" min-width="50" ></el-table-column> <el-table-column property="func" label="函数" min-width="100" ></el-table-column> <el-table-column property="type" label="类型" min-width="80" ></el-table-column> <el-table-column label="类型标记" min-width="280"> <template slot-scope="scope"> <el-select v-model="scope.row.mark" placeholder="请选择该类型在C语言中所属的基本类型" > <el-option v-for="(item, index) in baseType" :key="index" :label="item.label" :value="item.value" ></el-option> </el-select> </template> </el-table-column> </el-table> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="processParse">确 定</el-button> </span> </el-dialog> </div> </template> <script> import { postCHeaderFile, processCHeaderFile, getMarkType, updateMarkType, } from "@/api/store"; export default { name: "EvmModule", data() { return { activeName: "first", fileList: [], page: "evm-module-tool.vue", dir: null, baseType: [ { label: "整型", value: "int" }, { label: "单精度浮点型", value: "float" }, { label: "双精度浮点型", value: "double" }, { label: "字符串", value: "char *" }, { label: "指针", value: "void *" }, { label: "void", value: "void" }, ], undefined_type: [], error_tips: [], dialogVisible: false, markType: [], }; }, methods: { createFile(content, filename) { const a = document.createElement("a"); const blob = new Blob([content]); const url = window.URL.createObjectURL(blob); a.href = url; a.download = filename; a.click(); window.URL.revokeObjectURL(url); }, handleUploaded(response) { if (response.code === 200) { this.downloadFile(response); } else { this.$message.warning(response.message); } }, handleUploadFile(file) { this.fileList.push(file); }, handleUploadRemove(file, fileList) { console.log(fileList); for (let i = 0; i < this.fileList.length; i++) { if (this.fileList[i].uid == file.uid) { this.fileList.splice(i, 1); break; } } }, downloadFile(result) { const a = document.createElement("a"); a.download = result.data.filename; a.href = result.data.url; a.target = ""; a.click(); }, updateMarkType(row) { updateMarkType(row) .then((res) => { this.$message.success(res.message); }) .catch((err) => { this.$message.error(err.message); }); }, getMarkType() { getMarkType() .then((res) => { Object.keys(res.data).forEach((k) => { this.markType.push({ key: k, value: res.data[k] }); }); }) .catch((err) => { this.$message.error(err.message); }); }, uploadFile() { this.$refs.upload.submit(); let formData = new FormData(); this.fileList.forEach((item) => { formData.append("binfile", item.file); }); postCHeaderFile(formData) .then((res) => { this.downloadFile(res); }) .catch((err) => { if (err.code == 400) { this.dir = err.data.dir; this.undefined_type = err.data.undefined_type; this.error_tips = err.message; this.dialogVisible = true; } else { this.$message.error(err.message); } }) .finally(() => { this.fileList = []; this.$refs.upload.clearFiles(); }); }, processParse() { let types = {}; this.error_tips.forEach((item) => { types[item.type] = item.mark; }); processCHeaderFile({ dir: this.dir, type: types }) .then((res) => { this.downloadFile(res); }) .catch((err) => { if (err.code == 400) { this.dir = err.data.dir; this.undefined_type = err.data.undefined_type; this.error_tips = err.message; this.dialogVisible = true; } else { this.$message.error(err.message); } }) .finally(() => { this.fileList = []; this.$refs.upload.clearFiles(); }); }, }, mounted() {}, created() { this.getMarkType(); }, }; </script> <style lang="scss" scoped> .app-container { & > div.page-wrapper { margin: 10px 0px; } } </style>