From bc96eaa91af39fbc569ae570d47d2584be702d1e Mon Sep 17 00:00:00 2001 From: soul2 <1052986332@qq.com> Date: Sun, 19 Mar 2023 16:25:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ewar3=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 6 + package.json | 7 +- src/layout/index.vue | 2 +- src/main.js | 7 + src/router/index.js | 10 + src/style/element-ui.scss | 8 + src/style/index.scss | 3 +- src/style/transition.scss | 1 + src/utils/ArrayUtils.js | 16 ++ src/utils/StringUtils.js | 53 ++++ src/utils/tools.js | 195 +++++++++++++++ src/views/home/index.vue | 4 + src/views/sodemo/index.vue | 4 + src/views/soui/index.vue | 3 + src/views/wc3word/color.vue | 272 ++++++++++++++++++++ src/views/wc3word/dialog/SpellBuilder.vue | 184 ++++++++++++++ src/views/wc3word/dialog/updateRecord.vue | 51 ++++ src/views/wc3word/edit.vue | 286 ++++++++++++++++++++++ src/views/wc3word/index.vue | 63 +++++ src/views/wc3word/spell.vue | 127 ++++++++++ 20 files changed, 1297 insertions(+), 5 deletions(-) create mode 100644 src/style/element-ui.scss create mode 100644 src/utils/ArrayUtils.js create mode 100644 src/utils/StringUtils.js create mode 100644 src/utils/tools.js create mode 100644 src/views/wc3word/color.vue create mode 100644 src/views/wc3word/dialog/SpellBuilder.vue create mode 100644 src/views/wc3word/dialog/updateRecord.vue create mode 100644 src/views/wc3word/edit.vue create mode 100644 src/views/wc3word/index.vue create mode 100644 src/views/wc3word/spell.vue diff --git a/.env.development b/.env.development index ee9f76f..695af69 100644 --- a/.env.development +++ b/.env.development @@ -5,3 +5,9 @@ VUE_APP_CONTEXT_PATH = '/' # 接口地址 VUE_APP_BASE_API = 'http://localhost:7330' + +# 测试运行的端口 +port = '6830' + +# 测试运行的端口 +port = '6830' diff --git a/package.json b/package.json index f146115..b031309 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "serve": "vue-cli-service serve", + "dev": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, @@ -12,11 +12,12 @@ "core-js": "^3.6.5", "element-ui": "^2.15.6", "js-cookie": "^2.2.0", - "nprogress": "^0.2.0", - "sass-loader": "^10.0.5", "node-sass": "^7.0.3", "normalize.css": "7.0.0", + "nprogress": "^0.2.0", + "sass-loader": "^10.0.5", "vue": "^2.6.11", + "vue-cookies": "^1.8.3", "vue-router": "^3.5.2", "vuex": "^3.6.2" }, diff --git a/src/layout/index.vue b/src/layout/index.vue index 0d91585..cae45f4 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -5,7 +5,7 @@ - + diff --git a/src/main.js b/src/main.js index 25d81ea..8443892 100644 --- a/src/main.js +++ b/src/main.js @@ -3,10 +3,17 @@ import App from './App.vue' import store from "@/store"; import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' +import 'element-ui/lib/theme-chalk/base.css'; import router from './router' import '@/style/index.scss' // 全局样式 import '@/router/beforce' +import '@/utils/StringUtils' +import '@/utils/ArrayUtils' +import VueCookies from 'vue-cookies' +Vue.config.productionTip = false + +Vue.use(VueCookies) Vue.use(ElementUI) new Vue({ diff --git a/src/router/index.js b/src/router/index.js index 7e6f6cd..11c6fef 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -35,6 +35,16 @@ export const routes = [ meta: {title: '灵魂演示', icon: 'dashboard'} }] }, + { + path: '', + component: Layout, + children: [{ + path: '/wc3/word', + name: 'Word', + component: () => import('@/views/wc3word/index'), + meta: {title: '文本生成', icon: 'dashboard'} + }] + }, // { // path: '', // component: Layout, diff --git a/src/style/element-ui.scss b/src/style/element-ui.scss new file mode 100644 index 0000000..e3b5c73 --- /dev/null +++ b/src/style/element-ui.scss @@ -0,0 +1,8 @@ +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + diff --git a/src/style/index.scss b/src/style/index.scss index bce7532..6ee9195 100644 --- a/src/style/index.scss +++ b/src/style/index.scss @@ -1,4 +1,5 @@ -@import "./transition.scss"; +@import "transition"; +@import "element-ui"; * { margin: 0; diff --git a/src/style/transition.scss b/src/style/transition.scss index 4cb27cc..1eb011d 100644 --- a/src/style/transition.scss +++ b/src/style/transition.scss @@ -46,3 +46,4 @@ .breadcrumb-leave-active { position: absolute; } + diff --git a/src/utils/ArrayUtils.js b/src/utils/ArrayUtils.js new file mode 100644 index 0000000..e90a089 --- /dev/null +++ b/src/utils/ArrayUtils.js @@ -0,0 +1,16 @@ +/** + * 求出多个数组的最小长度 + * @returns {*|number} + */ +Array.prototype.minFor = function () { + return this.reduce((min, arr) => Math.min(min, arr.length), Infinity); +} + +/** + * 让每个子数组只保留前n个元素 + * @param n + * @returns {*[]} + */ +Array.prototype.startCut = function (n) { + return this.map(arr => arr.slice(0, n)); +} diff --git a/src/utils/StringUtils.js b/src/utils/StringUtils.js new file mode 100644 index 0000000..40c71e3 --- /dev/null +++ b/src/utils/StringUtils.js @@ -0,0 +1,53 @@ +/** + * 调用示例: + * + * var template1="我是{0},今年{1}了"; + * var template2="我是{name},今年{age}了"; + * var result1=template1.format("loogn",22); + * var result2=template1.format({name:"loogn",age:22}); + */ + +String.prototype.format = function (args) { + if (arguments.length > 0) { + var result = this; + if (arguments.length == 1 && typeof (args) == "object") { + for (var key in args) { + var reg = new RegExp("({" + key + "})", "g"); + result = result.replace(reg, args[key]); + } + } else { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] == undefined) { + return ""; + } else { + var reg = new RegExp("({[" + i + "]})", "g"); + result = result.replace(reg, arguments[i]); + } + } + } + return result; + } else { + return this; + } +} + +/** + * 取出所有a到b中间的字符串 + * + * @param a + * @param b + */ +String.prototype.between = function (a, b) { + if (arguments.length > 0) { + var results = []; + var reg = new RegExp(`\\${a}([^\\${b}]+)\\${b}`, "g"); + var match; + while ((match = reg.exec(this)) !== null) { + results.push(match[1]); + } + return results; + } else { + return this.between("{", "}"); + } +} + diff --git a/src/utils/tools.js b/src/utils/tools.js new file mode 100644 index 0000000..90e4f6e --- /dev/null +++ b/src/utils/tools.js @@ -0,0 +1,195 @@ +export const defaultColorConfig = { + learnLevel: '#33ccff', + property: '#33cc33', + hotKey: '#ffcc00', + level: '#33ccff', + learnUpdateLevel: '#ff9900', + nature: '#ffcccc' +} + +export function createObjs(len, fn) { + let arr = []; + for (let i = 0; i < len; i++) { + let res = fn(i) + arr.push(res) + } + return arr +} + +export function formula2arr(str, keys = 'abcdefghijklmnopqrstuvwxyz'.split('')) { + // 解析数量 + let formulas = str.split(';'); + const num = parseInt(formulas[0]) + // 解析参数 + formulas = formulas[1].split('/'); + // 构建返回 + const result = []; + // 解析公式 + formulas = formulas.map((f) => { + let formula = f.split("+") + formula = formula.map(e => parseInt(e)) + return { + base: formula[0], + plus: formula[1] + } + }) + // 生成对象 + for (let i = 0; i < num; i++) { + let obj = {} + for (let j = 0; j < formulas.length; j++) { + let key = keys[j] + obj[key] = formulas[j].base + formulas[j].plus * i + } + result.push(obj) + } + return result; +} + +function toCfg(s, c) { + if (typeof s !== 'string') { + return c + } + let items = s.split(", ") + let cfg = c + if (items.length > 0) { + items.forEach((e) => { + let p = e.split(":") + cfg[p[0]] = p[1] + }) + } + return cfg +} + +/** + * 以[xxx]的形式分析数据,自定义配置使用{}在参数str内附带,没有指定自定义配置时会使用默认配置 + * 例:[a=2/3/4][b=16+8][lv=3]{ls:/, fs:,} + * warning: 自定义配置以“, ”为分隔符,空格不可省略 + * + * @param str + * @param cfg + * @returns {*[]} + */ +export function conversion(str, cfg = {fs: "+", ls: ",", es: "=", lv: "lv"}) { + // 加载自定义配置 + cfg = toCfg(str.between()[0], cfg) + // 过滤无效信息 + const pairs = checkValid((str).between("[", "]")) + // 判断必备条件,否则返回空数组 + if (str.indexOf("[" + cfg.lv + cfg.es) === -1 || isNaN(parseInt((str).between("[" + cfg.lv + cfg.es, "]")))) { + return [] + } + const lv = parseInt((str).between("[" + cfg.lv + cfg.es, "]")) + let items = {} + let itemKeys = [] + const result = [] + pairs.forEach(pair => { + let p = pair.split(cfg.es) + itemKeys.push(p[0]) + if (p[1].indexOf(cfg.fs) !== -1) { // 有+号,是公式 + let fps = p[1].split(cfg.fs) + let rules = {base: parseFloat(fps[0]), plus: parseFloat(fps[1])} + items[p[0]] = createObjs(lv, i => rules.base + rules.plus * i) + } else { // 没有+号,是数值list + items[p[0]] = arrCut(p[1].split(cfg.ls).filter(e => !isNaN(parseFloat(e))).map(e => parseFloat(e)), lv) + } + }) + for (let i = 0; i < lv; i++) { + let obj = {} + itemKeys.forEach((k, n) => { + obj[k] = items[k][i] + }) + result.push(obj) + } + return result +} + +/** + * 检查输入的内容是否为a=b的形式,并返回合格的内容 + * a的通过规则:为a-z的其中一个 + * b可以是任意字符串 + * + * @param arr + * @returns {*[]} + */ +export function checkValid(arr) { + const result = []; + for (let i = 0; i < arr.length; i++) { + const str = arr[i]; + const regex = /^[a-z]=[^\s]+$/; + if (regex.test(str)) { + result.push(str); + } + } + return result; +} + +export function copyToClipboard(text) { + const textarea = document.createElement('textarea'); // 创建一个文本域元素 + textarea.value = text; // 将传入的文本内容赋值给文本域 + textarea.setAttribute('readonly', ''); // 设置文本域只读 + textarea.style.position = 'absolute'; + textarea.style.left = '-9999px'; // 将文本域定位到屏幕外 + document.body.appendChild(textarea); // 将文本域添加到页面上 + textarea.select(); // 选中文本域中的内容 + document.execCommand('copy'); // 将选中的内容复制到系统剪切板 + document.body.removeChild(textarea); // 移除文本域 +} + + +/** + * 如果a的长度超过b就返回a的前b项 + * 如果小于则添加字符串"null"使a的长度到达b + * 如果相等则直接返回a + * + * @param arr + * @param targetLength + * @returns {*} + */ +function arrCut(arr, targetLength) { + if (arr.length > targetLength) { + return arr.slice(0, targetLength); + } else if (arr.length < targetLength) { + let nulls = new Array(targetLength - arr.length).fill("null"); + return arr.concat(nulls); + } else { + return arr; + } +} + +/** + * 中文标点符号换成英文标点符号,以赋予输入中文符号不出错的能力 + * + * @param str + * @returns {*} + * @constructor + */ +export function symbolCn2En(str) { + if (Array.isArray(str)) { + return str.map(s => symbolCn2En(s)); + } + const map = { + ',': ',', + '。': '.', + '?': '?', + '!': '!', + ':': ':', + ';': ';', + '“': '"', + '”': '"', + '‘': "'", + '’': "'", + '(': '(', + ')': ')', + '【': '[', + '】': ']', + '《': '<', + '》': '>', + '、': ',' + }; + return str.replaceAll(/[\u4e00-\u9fa5]/g, c => map[c] || c); +} diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 627fe68..c1aa320 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -123,6 +123,10 @@ export default { diff --git a/src/views/wc3word/color.vue b/src/views/wc3word/color.vue new file mode 100644 index 0000000..d3c3b60 --- /dev/null +++ b/src/views/wc3word/color.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/src/views/wc3word/dialog/SpellBuilder.vue b/src/views/wc3word/dialog/SpellBuilder.vue new file mode 100644 index 0000000..b0c143d --- /dev/null +++ b/src/views/wc3word/dialog/SpellBuilder.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/src/views/wc3word/dialog/updateRecord.vue b/src/views/wc3word/dialog/updateRecord.vue new file mode 100644 index 0000000..9a96ca8 --- /dev/null +++ b/src/views/wc3word/dialog/updateRecord.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/views/wc3word/edit.vue b/src/views/wc3word/edit.vue new file mode 100644 index 0000000..bdc33a8 --- /dev/null +++ b/src/views/wc3word/edit.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/src/views/wc3word/index.vue b/src/views/wc3word/index.vue new file mode 100644 index 0000000..dfd49b0 --- /dev/null +++ b/src/views/wc3word/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/wc3word/spell.vue b/src/views/wc3word/spell.vue new file mode 100644 index 0000000..b9648aa --- /dev/null +++ b/src/views/wc3word/spell.vue @@ -0,0 +1,127 @@ + + + + +