123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886 |
- let packageName = "excel-killer";
- let fs = require('fire-fs');
- let path = require('fire-path');
- let CfgUtil = Editor.require('packages://' + packageName + '/core/CfgUtil.js');
- let excelItem = Editor.require('packages://' + packageName + '/panel/item/excelItem.js');
- let nodeXlsx = Editor.require('packages://' + packageName + '/node_modules/node-xlsx');
- let Electron = require('electron');
- let uglifyJs = Editor.require('packages://' + packageName + '/node_modules/uglify-js');
- let fsExtra = Editor.require('packages://' + packageName + '/node_modules/fs-extra');
- let jsonBeautifully = Editor.require('packages://' + packageName + '/node_modules/json-beautifully');
- let chokidar = Editor.require('packages://' + packageName + '/node_modules/chokidar');
- const Globby = require('globby');
- let dirClientName = "client";
- let dirServerName = "server";
- let projectPath = Editor.Project.path;
- // 客户端存放配置表文件目录
- let clientJsPath = path.join(projectPath, "assets/script/data/config");
- // 配置表输出目录
- let excelOutPutPath = 'plugins-excel/excel-output';
- Editor.Panel.extend({
- style: fs.readFileSync(Editor.url('packages://' + packageName + '/panel/index.css', 'utf8')) + "",
- template: fs.readFileSync(Editor.url('packages://' + packageName + '/panel/index.html', 'utf8')) + "",
- $: {
- logTextArea: '#logTextArea',
- },
- ready() {
- let logCtrl = this.$logTextArea;
- let logListScrollToBottom = function () {
- setTimeout(function () {
- logCtrl.scrollTop = logCtrl.scrollHeight;
- }, 10);
- };
- excelItem.init();
- this.plugin = new window.Vue({
- el: this.shadowRoot,
- created() {
- this._initPluginCfg();
- },
- init() {
- },
- data: {
- logView: "",
- excelRootPath: null,
- isMergeJson: false,
- isMergeJavaScript: false,
- isExportJson: false,// 是否导出Json
- isExportJs: false,// 是否导出Js
- isFormatJson: false,// 是否格式化Json
- isExportClient: false,// 是否导出客户端
- isExportServer: false,// 是否导出服务端
- isJsonAllCfgFileExist: false,// 是否单一配置文件存在
- jsonSavePath: null,// json保存文件夹路径
- jsonAllCfgFileName: null,// json配置文件名
- jsSavePath: null,// 插件资源目录
- jsFileName: null,//js配置合并为一个文件的文件名
- isJsFileExist: false,
- isFormatJsCode: false,
- excelArray: [],
- excelFileArr: [],
- importProjectCfgPath: null,
- },
- methods: {
- ////////////////////////////导入到项目////////////////////////////////////////////
- onBtnClickSelectProjectJsonCfgPath() {
- let res = Editor.Dialog.openFile({
- title: "选择项目配置存放目录",
- defaultPath: path.join(projectPath, "assets"),
- properties: ['openDirectory'],
- });
- if (res !== -1) {
- let dir = res[0];
- if (dir !== this.importProjectCfgPath) {
- this.importProjectCfgPath = dir;
- this._saveConfig();
- }
- }
- },
- onBtnClickImportProjectJsonCfg_Server() {
- this._importJsonCfg("server");
- },
- onBtnClickImportProjectJsonCfg_Client() {
- this._importJsonCfg("client");
- },
- _importJsonCfg(typeDir) {
- if (!fs.existsSync(this.importProjectCfgPath)) {
- this._addLog("导入项目路径不存在:" + this.importProjectCfgPath);
- return;
- }
- if (!this.isExportJson) {
- this._addLog("[Warning] 您未勾选导出Json配置,可能导入的配置时上个版本的!");
- }
- let importPath = Editor.assetdb.remote.fspathToUrl(this.importProjectCfgPath);
- if (importPath.indexOf("db://assets") >= 0) {
- // 检索所有的json配置
- let clientDir = path.join(this.jsonSavePath, typeDir);
- if (!fs.existsSync(clientDir)) {
- this._addLog("配置目录不存在:" + clientDir);
- return;
- }
- let pattern = path.join(clientDir, '**/*.json');
- let files = Globby.sync(pattern)
- this._addLog("一共导入文件数量: " + files.length);
- for (let i = 0; i < files.length; i++) {
- }
- Editor.assetdb.import(files, importPath,
- function (err, results) {
- results.forEach(function (result) {
- console.log(result.path);
- // result.uuid
- // result.parentUuid
- // result.url
- // result.path
- // result.type
- });
- }.bind(this));
- } else {
- this._addLog("非项目路径,无法导入 : " + this.importProjectCfgPath);
- }
- },
- ////////////////////////////////////////////////////////////////////////
- _addLog(str) {
- let time = new Date();
- // this.logView = "[" + time.toLocaleString() + "]: " + str + "\n" + this.logView;
- this.logView += "[" + time.toLocaleString() + "]: " + str + "\n";
- logListScrollToBottom();
- },
- onBtnClickTellMe() {
- // let data = nodeXlsx.parse(path.join(this.excelRootPath, 'test2.xlsx'));
- // console.log(data);
- // return;
- let url = "http://wpa.qq.com/msgrd?v=3&uin=774177933&site=qq&menu=yes";
- Electron.shell.openExternal(url);
- },
- _saveConfig() {
- let data = {
- excelRootPath: this.excelRootPath,
- jsFileName: this.jsFileName,
- jsonAllFileName: this.jsonAllCfgFileName,
- isMergeJson: this.isMergeJson,
- isMergeJavaScript: this.isMergeJavaScript,
- isFormatJsCode: this.isFormatJsCode,
- isFormatJson: this.isFormatJson,
- isExportJson: this.isExportJson,
- isExportJs: this.isExportJs,
- isExportClient: this.isExportClient,
- isExportServer: this.isExportServer,
- importProjectCfgPath: this.importProjectCfgPath,
- };
- CfgUtil.saveCfgByData(data);
- },
- onBtnClickFreshExcel() {
- this._onAnalyzeExcelDirPath(this.excelRootPath);
- },
- _watchDir(event, filePath) {
- return;
- console.log("监控文件....");
- console.log(event, filePath);
- let ext = path.extname(filePath);
- if (ext === ".xlsx" || ext === ".xls") {
- this._onAnalyzeExcelDirPath(this.excelRootPath);
- }
- },
- onBtnClickHelpDoc() {
- let url = "https://github.com/tidys/CocosCreatorPlugins/tree/master/packages/excel-killer/README.md";
- Electron.shell.openExternal(url);
- },
- _initPluginCfg() {
- console.log("initCfg");
- CfgUtil.initCfg(function (data) {
- if (data) {
- this.excelRootPath = data.excelRootPath || "";
- if (fs.existsSync(this.excelRootPath)) {
- this._onAnalyzeExcelDirPath(this.excelRootPath);
- chokidar.watch(this.excelRootPath, {
- usePolling: true,
- // interval: 1000,
- // awaitWriteFinish: {
- // stabilityThreshold: 2000,
- // pollInterval: 100
- // },
- }).on('all', this._watchDir.bind(this));
- } else {
- }
- this.jsFileName = data.jsFileName || "GameJsCfg";
- this.jsonAllCfgFileName = data.jsonAllFileName || "GameJsonCfg";
- this.isMergeJson = data.isMergeJson || false;
- this.isMergeJavaScript = data.isMergeJavaScript || false;
- this.isFormatJsCode = data.isFormatJsCode || false;
- this.isFormatJson = data.isFormatJson || false;
- this.isExportJson = data.isExportJson || false;
- this.isExportJs = data.isExportJs || false;
- this.isExportClient = data.isExportClient || false;
- this.isExportServer = data.isExportServer || false;
- this.importProjectCfgPath = data.importProjectCfgPath || null;
- this.checkJsFileExist();
- this.checkJsonAllCfgFileExist();
- } else {
- this.jsFileName = "GameJsCfg";
- this.jsonAllCfgFileName = "GameJsonCfg";
- }
- }.bind(this));
- this._initCfgSavePath();// 默认json路径
- },
- _initCfgSavePath() {
- let pluginResPath = path.join(projectPath, excelOutPutPath);
- if (!fs.existsSync(pluginResPath)) {
- fs.mkdirSync(pluginResPath);
- }
- let pluginResPath1 = path.join(pluginResPath, "json");
- if (!fs.existsSync(pluginResPath1)) {
- fs.mkdirSync(pluginResPath1);
- }
- this.jsonSavePath = pluginResPath1;
- this._initCSDir(this.jsonSavePath);
- let pluginResPath2 = path.join(pluginResPath, "js");
- if (!fs.existsSync(pluginResPath2)) {
- fs.mkdirSync(pluginResPath2);
- }
- this.jsSavePath = pluginResPath2;
- this._initCSDir(this.jsSavePath);
- },
- // 初始化client-server目录
- _initCSDir(saveDir) {
- let clientDir = path.join(saveDir, dirClientName);
- if (!fs.existsSync(clientDir)) {
- fs.mkdirSync(clientDir);
- }
- let serverDir = path.join(saveDir, dirServerName);
- if (!fs.existsSync(serverDir)) {
- fs.mkdirSync(serverDir);
- }
- },
- onBtnClickFormatJson() {
- this.isFormatJson = !this.isFormatJson;
- this._saveConfig();
- },
- // 是否合并json
- onBtnClickMergeJson() {
- this.isMergeJson = !this.isMergeJson;
- this._saveConfig();
- },
- onBtnClickMergeJavaScript() {
- this.isMergeJavaScript = !this.isMergeJavaScript;
- this._saveConfig();
- },
- // 打开合并的json
- onBtnClickJsonAllCfgFile() {
- let saveFileFullPath1 = path.join(this.jsonSavePath, dirClientName, this.jsonAllCfgFileName + ".json");
- let saveFileFullPath2 = path.join(this.jsonSavePath, dirServerName, this.jsonAllCfgFileName + ".json");
- if (fs.existsSync(saveFileFullPath1)) {
- Electron.shell.openItem(saveFileFullPath1);
- Electron.shell.beep();
- } else if (fs.existsSync(saveFileFullPath2)) {
- Electron.shell.openItem(saveFileFullPath2);
- Electron.shell.beep();
- } else {
- // this._addLog("目录不存在:" + this.resourceRootDir);
- this._addLog("目录不存在:" + saveFileFullPath1 + ' or:' + saveFileFullPath2);
- return;
- }
- },
- checkJsonAllCfgFileExist() {
- let saveFileFullPath1 = path.join(this.jsonSavePath, dirClientName, this.jsonAllCfgFileName + ".json");
- let saveFileFullPath2 = path.join(this.jsonSavePath, dirServerName, this.jsonAllCfgFileName + ".json");
- if (fs.existsSync(saveFileFullPath1) || fs.existsSync(saveFileFullPath2)) {
- this.isJsonAllCfgFileExist = true;
- } else {
- this.isJsonAllCfgFileExist = false;
- }
- },
- onBtnClickFormatJsCode() {
- this.isFormatJsCode = !this.isFormatJsCode;
- this._saveConfig();
- },
- onBtnClickOpenExcelRootPath() {
- if (fs.existsSync(this.excelRootPath)) {
- Electron.shell.showItemInFolder(this.excelRootPath);
- Electron.shell.beep();
- } else {
- this._addLog("目录不存在:" + this.excelRootPath);
- }
- },
- onBtnClickSelectExcelRootPath() {
- let res = Editor.Dialog.openFile({
- title: "选择Excel的根目录",
- defaultPath: projectPath,
- properties: ['openDirectory'],
- });
- if (res !== -1) {
- let dir = res[0];
- if (dir !== this.excelRootPath) {
- this.excelRootPath = dir;
- chokidar.watch(this.excelRootPath).on('all', this._watchDir.bind(this));
- this._onAnalyzeExcelDirPath(dir);
- this._saveConfig();
- }
- }
- },
- // 修改js配置文件
- onJsFileNameChanged() {
- this._saveConfig();
- },
- // 修改json配置文件
- onJsonAllCfgFileChanged() {
- this._saveConfig();
- },
- onBtnClickIsExportJson() {
- this.isExportJson = !this.isExportJson;
- this._saveConfig();
- },
- onBtnClickIsExportJs() {
- this.isExportJs = !this.isExportJs;
- this._saveConfig();
- },
- onBtnClickExportClient() {
- this.isExportClient = !this.isExportClient;
- this._saveConfig();
- },
- onBtnClickExportServer() {
- this.isExportServer = !this.isExportServer;
- this._saveConfig();
- },
- // 查找出目录下的所有excel文件
- _onAnalyzeExcelDirPath(dir) {
- let self = this;
- // let dir = path.normalize("D:\\proj\\CocosCreatorPlugins\\doc\\excel-killer");
- if (dir) {
- // 查找json文件
- let allFileArr = [];
- let excelFileArr = [];
- // 获取目录下所有的文件
- readDirSync(dir);
- // 过滤出来.xlsx的文件
- for (let k in allFileArr) {
- let file = allFileArr[k];
- let extName = path.extname(file);
- if (extName === ".xlsx" || extName === ".xls") {
- excelFileArr.push(file);
- } else {
- this._addLog("不支持的文件类型: " + file);
- }
- }
- this.excelFileArr = excelFileArr;
- // 组装显示的数据
- let excelSheetArray = [];
- let sheetDuplicationChecker = {};//表单重名检测
- for (let k in excelFileArr) {
- let itemFullPath = excelFileArr[k];
- // this._addLog("excel : " + itemFullPath);
- let excelData = nodeXlsx.parse(itemFullPath);
- //todo 检测重名的sheet
- for (let j in excelData) {
- let itemData = {
- isUse: true,
- fullPath: itemFullPath,
- name: "name",
- sheet: excelData[j].name
- };
- itemData.name = itemFullPath.substr(dir.length + 1, itemFullPath.length - dir.length);
- if (excelData[j].data.length === 0) {
- this._addLog("[Error] 空Sheet: " + itemData.name + " - " + itemData.sheet);
- continue;
- }
- if (sheetDuplicationChecker[itemData.sheet]) {
- // 重名sheet问题
- this._addLog("[Error ] 出现了重名sheet: " + itemData.sheet);
- this._addLog("[Sheet1] " + sheetDuplicationChecker[itemData.sheet].fullPath);
- this._addLog("[Sheet2] " + itemFullPath);
- this._addLog("请仔细检查Excel-Sheet!");
- } else {
- sheetDuplicationChecker[itemData.sheet] = itemData;
- excelSheetArray.push(itemData);
- }
- }
- }
- this.excelArray = excelSheetArray;
- function readDirSync(dirPath) {
- let dirInfo = fs.readdirSync(dirPath);
- for (let i = 0; i < dirInfo.length; i++) {
- let item = dirInfo[i];
- let itemFullPath = path.join(dirPath, item);
- let info = fs.statSync(itemFullPath);
- if (info.isDirectory()) {
- // this._addLog('dir: ' + itemFullPath);
- readDirSync(itemFullPath);
- } else if (info.isFile()) {
- let headStr = item.substr(0, 2);
- if (headStr === "~$") {
- self._addLog("检索到excel产生的临时文件:" + itemFullPath);
- } else {
- allFileArr.push(itemFullPath);
- }
- // this._addLog('file: ' + itemFullPath);
- }
- }
- }
- }
- },
- onStopTouchEvent(event) {
- event.preventDefault();
- event.stopPropagation();
- // console.log("dragOver");
- },
- onBtnClickSelectSheet(event) {
- let b = event.currentTarget.value;
- for (let k in this.excelArray) {
- this.excelArray[k].isUse = b;
- }
- },
- onBtnClickOpenJsonSavePath() {
- let saveFileFullPath1 = path.join(this.jsonSavePath, dirClientName);
- let saveFileFullPath2 = path.join(this.jsonSavePath, dirServerName);
- if (fs.existsSync(saveFileFullPath1)) {
- Electron.shell.openItem(saveFileFullPath1);
- Electron.shell.beep();
- } else if (fs.existsSync(saveFileFullPath2)) {
- Electron.shell.openItem(saveFileFullPath2);
- Electron.shell.beep();
- } else {
- // this._addLog("目录不存在:" + this.resourceRootDir);
- this._addLog("目录不存在:" + saveFileFullPath1 + ' or:' + saveFileFullPath2);
- return;
- }
- },
- onBtnClickOpenJsSavePath() {
- let saveFileFullPath1 = path.join(this.jsSavePath, dirClientName);
- let saveFileFullPath2 = path.join(this.jsSavePath, dirServerName);
- if (fs.existsSync(saveFileFullPath1)) {
- Electron.shell.openItem(saveFileFullPath1);
- Electron.shell.beep();
- } else if (fs.existsSync(saveFileFullPath2)) {
- Electron.shell.openItem(saveFileFullPath2);
- Electron.shell.beep();
- } else {
- // this._addLog("目录不存在:" + this.resourceRootDir);
- this._addLog("目录不存在:" + saveFileFullPath1 + ' or:' + saveFileFullPath2);
- return;
- }
- },
- _getJavaScriptSaveData(excelData, itemSheet, isClient) {
- let title = excelData[0];
- let desc = excelData[1];
- let target = excelData[2];
- let sheetFormatData = {};
- for (let i = 3; i < excelData.length; i++) {
- let lineData = excelData[i];
- if (lineData.length === 0) {
- // 空行直接跳过
- continue;
- } else {
- if (lineData.length < title.length) {
- this._addLog("[Error] 发现第" + i + "行缺少字段,跳过该行数据配置.");
- continue;
- } else if (lineData.length > title.length) {
- this._addLog("[Error] 发现第" + i + "行多余字段,跳过该行数据配置.");
- continue;
- }
- }
- let saveLineData = {};
- let canExport = false;
- for (let j = 1; j < title.length; j++) {
- if (!title[j]) {
- // 遇到空列直接break,后续的数据不处理
- break;
- }
- canExport = false;
- if (isClient && target[j].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[j].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- let key = title[j];
- let value = lineData[j];
- if (value === undefined) {
- value = "";
- this._addLog("[Error] 发现空单元格:" + itemSheet.name + "*" + itemSheet.sheet + " => (" + key + "," + (i + 1) + ")");
- }
- saveLineData[key] = value;
- }
- }
- canExport = false;
- if (isClient && target[0].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[0].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- sheetFormatData[lineData[0].toString()] = saveLineData;
- }
- }
- return sheetFormatData;
- },
- _getJsonSaveData(excelData, itemSheet, isClient) {
- let title = excelData[0];
- let desc = excelData[1];
- let target = excelData[2];
- let ret = null;
- let useFormat1 = false;
- if (useFormat1) {
- let saveData1 = [];// 格式1:对应的为数组
- for (let i = 3; i < excelData.length; i++) {
- let lineData = excelData[i];
- if (lineData.length < title.length) {
- continue;
- } else if (lineData.length > title.length) {
- continue;
- }
- let saveLineData = {};
- let canExport = false;
- for (let j = 0; j < title.length; j++) {
- if (!title[j]) {
- // 遇到空列直接break,后续的数据不处理
- break;
- }
- canExport = false;
- if (isClient && target[j].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[j].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- let key = title[j];
- let value = lineData[j];
- if (value === undefined) {
- value = "";
- }
- // this._addLog("" + value);
- saveLineData[key] = value;
- }
- }
- canExport = false;
- if (isClient && target[0].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[0].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- saveData1.push(saveLineData);
- }
- }
- ret = saveData1;
- } else {
- let saveData2 = {};// 格式2:id作为索引
- for (let i = 3; i < excelData.length; i++) {
- let lineData = excelData[i];
- if (lineData.length !== title.length) {
- this._addLog(`配置表头和配置数据不匹配:${itemSheet.name} - ${itemSheet.sheet} : 第${i + 1}行`);
- this._addLog("跳过该行数据");
- continue;
- }
- let saveLineData = {};
- let canExport = false;
- // todo 将ID字段也加入到data中
- for (let j = 0; j < title.length; j++) {
- if (!title[j]) {
- // 遇到空列直接break,后续的数据不处理
- break;
- }
- canExport = false;
- if (isClient && target[j] && target[j].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[j] && target[j].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- let key = title[j];
- let value = lineData[j];
- if (value === undefined) {
- value = "";
- }
- // this._addLog("" + value);
- saveLineData[key] = value;
- }
- }
- canExport = false;
- if (isClient && target[0] && target[0].indexOf('c') !== -1) {
- canExport = true;
- } else if (!isClient && target[0] && target[0].indexOf('s') !== -1) {
- canExport = true;
- }
- if (canExport) {
- saveData2[lineData[0].toString()] = saveLineData;
- }
- }
- ret = saveData2;
- }
- return ret;
- },
- // 打开生成的js配置文件
- onBtnClickOpenJsFile() {
- let saveFileFullPath1 = path.join(this.jsSavePath, dirClientName, this.jsFileName + ".js");
- let saveFileFullPath2 = path.join(this.jsSavePath, dirServerName, this.jsFileName + ".js");
- if (fs.existsSync(saveFileFullPath1)) {
- Electron.shell.openItem(saveFileFullPath1);
- Electron.shell.beep();
- } else if (fs.existsSync(saveFileFullPath2)) {
- Electron.shell.openItem(saveFileFullPath2);
- Electron.shell.beep();
- } else {
- // this._addLog("目录不存在:" + this.resourceRootDir);
- this._addLog("目录不存在:" + saveFileFullPath1 + ' or:' + saveFileFullPath2);
- }
- },
- // 检测js配置文件是否存在
- checkJsFileExist() {
- let saveFileFullPath1 = path.join(this.jsSavePath, dirClientName, this.jsFileName + ".js");
- let saveFileFullPath2 = path.join(this.jsSavePath, dirServerName, this.jsFileName + ".js");
- if (fs.existsSync(saveFileFullPath1) || fs.existsSync(saveFileFullPath2)) {
- this.isJsFileExist = true;
- } else {
- this.isJsFileExist = false;
- }
- },
- // 生成配置
- onBtnClickGen() {
- console.log("onBtnClickGen");
- // 参数校验
- if (this.excelArray.length <= 0) {
- this._addLog("未发现要生成的配置!");
- return;
- }
- if (this.isMergeJson) {
- if (!this.jsonAllCfgFileName || this.jsonAllCfgFileName.length <= 0) {
- this._addLog("请输入要保存的json文件名!");
- return;
- }
- }
- if (this.isMergeJavaScript) {
- if (!this.jsFileName || this.jsFileName.length <= 0) {
- this._addLog("请输入要保存的js文件名!");
- return;
- }
- }
- // TODO
- if (this.isExportServer === false && this.isExportClient === false) {
- this._addLog("请选择要导出的目标!");
- return;
- }
- if (this.isExportJson === false && this.isExportJs === false) {
- this._addLog("请选择要导出的类型!");
- return;
- }
- this.logView = "";
- // 删除老的配置
- let jsonSavePath1 = path.join(this.jsonSavePath, dirClientName);
- let jsonSavePath2 = path.join(this.jsonSavePath, dirServerName);
- fsExtra.emptyDirSync(jsonSavePath1);
- fsExtra.emptyDirSync(jsonSavePath2);
- let jsSavePath1 = path.join(this.jsSavePath, dirClientName);
- let jsSavePath2 = path.join(this.jsSavePath, dirServerName);
- fsExtra.emptyDirSync(jsSavePath1);
- fsExtra.emptyDirSync(jsSavePath2);
- let jsonAllSaveDataClient = {};// 保存客户端的json数据
- let jsonAllSaveDataServer = {};// 保存服务端的json数据
- let jsAllSaveDataClient = {};// 保存客户端的js数据
- let jsAllSaveDataServer = {};// 保存服务端的js数据
- for (let k in this.excelArray) {
- let itemSheet = this.excelArray[k];
- if (itemSheet.isUse) {
- let excelData = nodeXlsx.parse(itemSheet.fullPath);
- let sheetData = null;
- for (let j in excelData) {
- if (excelData[j].name === itemSheet.sheet) {
- sheetData = excelData[j].data;
- }
- }
- if (sheetData) {
- if (sheetData.length > 3) {
- if (this.isExportJson) {
- // 保存为json
- let writeFileJson = function (pathSave, isClient) {
- let jsonSaveData = this._getJsonSaveData(sheetData, itemSheet, isClient);
- if (Object.keys(jsonSaveData).length > 0) {
- if (this.isMergeJson) {
- if (isClient) {
- // 检测重复问题
- if (jsonAllSaveDataClient[itemSheet.sheet] === undefined) {
- jsonAllSaveDataClient[itemSheet.sheet] = jsonSaveData;
- } else {
- this._addLog("发现重名sheet:" + itemSheet.name + "(" + itemSheet.sheet + ")");
- }
- } else {
- // 检测重复问题
- if (jsonAllSaveDataServer[itemSheet.sheet] === undefined) {
- jsonAllSaveDataServer[itemSheet.sheet] = jsonSaveData;
- } else {
- this._addLog("发现重名sheet:" + itemSheet.name + "(" + itemSheet.sheet + ")");
- }
- }
- } else {
- let saveFileFullPath = path.join(pathSave, itemSheet.sheet + ".json");
- this._onSaveJsonCfgFile(jsonSaveData, saveFileFullPath);
- }
- }
- }.bind(this);
- if (this.isExportClient) writeFileJson(jsonSavePath1, true);
- if (this.isExportServer) writeFileJson(jsonSavePath2, false);
- }
- if (this.isExportJs) {
- // 保存为js
- let writeFileJs = function (savePath, isClient) {
- let sheetJsData = this._getJavaScriptSaveData(sheetData, itemSheet, isClient);
- if (Object.keys(sheetJsData).length > 0) {
- if (this.isMergeJavaScript) {
- if (isClient) {
- // 检测重复问题
- if (jsAllSaveDataClient[itemSheet.sheet] === undefined) {
- jsAllSaveDataClient[itemSheet.sheet] = sheetJsData;
- } else {
- this._addLog("发现重名sheet:" + itemSheet.name + "(" + itemSheet.sheet + ")");
- }
- } else {
- // 检测重复问题
- if (jsAllSaveDataServer[itemSheet.sheet] === undefined) {
- jsAllSaveDataServer[itemSheet.sheet] = sheetJsData;
- } else {
- this._addLog("发现重名sheet:" + itemSheet.name + "(" + itemSheet.sheet + ")");
- }
- }
- } else {
- // 保存js配置
- let fileNameFullPath = path.join(savePath, itemSheet.sheet + ".js");
- this._onSaveJavaScriptCfgFile(fileNameFullPath, sheetJsData, itemSheet.sheet);
- }
- }
- }.bind(this);
- if (this.isExportClient) writeFileJs(jsSavePath1, true);
- if (this.isExportServer) writeFileJs(jsSavePath2, false);
- }
- } else {
- this._addLog("行数低于3行,无效sheet:" + itemSheet.sheet);
- }
- } else {
- this._addLog("未发现数据");
- }
- } else {
- console.log("忽略配置: " + itemSheet.fullPath + ' - ' + itemSheet.sheet);
- }
- }
- // =====================>>>> 合并json文件 <<<=================================
- if (this.isExportJson && this.isMergeJson) {
- if (this.isExportClient) {
- let saveFileFullPath = path.join(jsonSavePath1, this.jsonAllCfgFileName + ".json");
- this._onSaveJsonCfgFile(jsonAllSaveDataClient, saveFileFullPath);
- }
- if (this.isExportServer) {
- let saveFileFullPath = path.join(jsonSavePath2, this.jsonAllCfgFileName + ".json");
- this._onSaveJsonCfgFile(jsonAllSaveDataServer, saveFileFullPath);
- }
- this.checkJsonAllCfgFileExist();
- }
- // =====================>>>> 合并js文件 <<<=================================
- if (this.isExportJs && this.isMergeJavaScript) {
- if (this.isExportClient) {
- this._onSaveJavaScriptCfgFile(path.join(jsSavePath1, this.jsFileName + ".js"), jsAllSaveDataClient, this.jsFileName);
- }
- if (this.isExportServer) {
- this._onSaveJavaScriptCfgFile(path.join(jsSavePath2, this.jsFileName + ".js"), jsAllSaveDataServer, this.jsFileName);
- }
- this.checkJsFileExist();
- }
- this._addLog("全部转换完成!");
- },
- // 处理数组和字典数据:使用node-xlsx parse后数组/字典都是字符串,"[]","{}",去除掉双引号即可
- _dealArrayAndMap(data) {
- let s = JSON.stringify(data);
- s = s.replace(/\:\"\[/g, ":[");
- s = s.replace(/\]\"/g, "]");
- s = s.replace(/\:\"\{/g, ":{");
- s = s.replace(/\}\"/g, "}");
- return s;
- },
- // 保存为json配置
- _onSaveJsonCfgFile(data, saveFileFullPath) {
- let str = this._dealArrayAndMap(data);
- if (this.isFormatJson) {
- str = jsonBeautifully(str);
- }
- fs.writeFileSync(saveFileFullPath, str);
- this._addLog("[Json]:" + saveFileFullPath);
- },
- // 保存为js配置
- _onSaveJavaScriptCfgFile(saveFileFullPath, jsSaveData, jsFileName) {
- let str = this._dealArrayAndMap(jsSaveData);
- // TODO 保证key的顺序一致性
- let saveStr = "module.exports = " + str + ";";
- if (this.isFormatJsCode) {// 保存为格式化代码
- let ast = uglifyJs.parse(saveStr);
- let ret = uglifyJs.minify(ast, {
- output: {
- beautify: true,//如果希望得到格式化的输出,传入true
- indent_start: 0,//(仅当beautify为true时有效) - 初始缩进空格
- indent_level: 4,//(仅当beautify为true时有效) - 缩进级别,空格数量
- }
- });
- if (ret.error) {
- this._addLog('error: ' + ret.error.message);
- } else if (ret.code) {
- fs.writeFileSync(saveFileFullPath, ret.code);
- this._addLog("[JavaScript]" + saveFileFullPath);
- } else {
- this._addLog(JSON.stringify(ret));
- }
- } else {// 保存为单行代码
- fs.writeFileSync(saveFileFullPath, saveStr);
- this._addLog("[JavaScript]" + saveFileFullPath);
- }
- // 移动到客户端目录
- if (!fs.existsSync(clientJsPath)) {
- fs.mkdirSync(clientJsPath);
- }
- this.copyFileSync(saveFileFullPath, path.join(clientJsPath, jsFileName + '.js'));
- },
- copyFileSync(srcFile, destFile) {
- var BUF_LENGTH = 64 * 1024
- var buff = new Buffer(BUF_LENGTH)
- var fdr = fs.openSync(srcFile, 'r')
- var fdw = fs.openSync(destFile, 'w')
- var bytesRead = 1
- var pos = 0
- while (bytesRead > 0) {
- bytesRead = fs.readSync(fdr, buff, 0, BUF_LENGTH, pos)
- fs.writeSync(fdw, buff, 0, bytesRead)
- pos += bytesRead
- }
- fs.closeSync(fdr);
- fs.closeSync(fdw);
- }
- },
- });
- },
- messages: {
- 'excel-killer:hello'(event) {
- }
- }
- });
|