Compare commits

...
7 Commits
Author SHA1 Message Date
Mohamed Hassan 8943dabb54 + Updated AutoCode module translation.
+ Add User module translation.
+ Add Authority module translation.
2022-01-09 00:29:41 +02:00
Mohamed Hassan 3578697dbf + Fix language selection issue on login module.
+ Translated autoCode module.
+ Update translations.
+ Merge pull request #860 from flipped-aurora/gva-2.4.6+
2022-01-01 02:48:52 +02:00
Mohamed Hassan 9d1b529d72 + Fix the bugs in the api, add https guidance in the deployment mode (PR #860). 2021-12-31 01:24:43 +02:00
Mohamed Hassan 7faaa2e693 + Add support to reading/writing to cookies using js-cookie library to store some data.
+ Add support for localizing element-plus components.
+ Translated login and init modules.
+ Updated languages flags.
+ Update translation files.
2021-12-31 00:58:12 +02:00
Mohamed Hassan fe615455e0 Merge pull request #857 from MohamedHassanNasr/i18n-dev
Initial multi language (Chinese - English - Arabic).
Updated Axios from 0.19.2 to 0.24.0 to fix vulnerability exist in this version.
2021-12-28 22:31:02 +02:00
Mohamed Hassan a3dc81310c + Initial commit for i18n support.
+ Add multi-language support (English - Chinese - Arabic).
+ Add language selector to login screen, to be able to change the whole system language before login.
+ Add translation files (/src/locales/*.json).
2021-12-28 20:42:26 +02:00
Mohamed Hassan 410aadfff1 + Initial commit.
+ Update axios version 0.19.2 to version 0.24.0.
2021-12-26 14:48:20 +02:00
39 changed files with 1252 additions and 561 deletions
+4
View File
@@ -59,6 +59,10 @@ func (a *api) Initialize() error {
{ApiGroup: "菜单", Method: "POST", Path: "/menu/getMenuAuthority", Description: "获取指定角色menu"},
{ApiGroup: "菜单", Method: "POST", Path: "/menu/addMenuAuthority", Description: "增加menu和角色关联关系"},
{ApiGroup: "分片上传", Method: "POST", Path: "/fileUploadAndDownload/findFile", Description: "寻找目标文件(秒传)"},
{ApiGroup: "分片上传", Method: "POST", Path: "/fileUploadAndDownload/breakpointContinueFinish", Description: "断点续传"},
{ApiGroup: "分片上传", Method: "POST", Path: "/fileUploadAndDownload/removeChunk", Description: "上传完成"},
{ApiGroup: "文件上传与下载", Method: "POST", Path: "/fileUploadAndDownload/upload", Description: "文件上传示例"},
{ApiGroup: "文件上传与下载", Method: "POST", Path: "/fileUploadAndDownload/deleteFile", Description: "删除文件"},
{ApiGroup: "文件上传与下载", Method: "POST", Path: "/fileUploadAndDownload/getFileList", Description: "获取上传文件列表"},
+4
View File
@@ -54,6 +54,10 @@ func (c *casbin) Initialize() error {
{PType: "p", V0: "888", V1: "/user/setUserAuthority", V2: "POST"},
{PType: "p", V0: "888", V1: "/user/setUserAuthorities", V2: "POST"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/findFile", V2: "GET"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/breakpointContinueFinish", V2: "POST"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/removeChunk", V2: "POST"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/upload", V2: "POST"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/deleteFile", V2: "POST"},
{PType: "p", V0: "888", V1: "/fileUploadAndDownload/getFileList", V2: "POST"},
+3 -2
View File
@@ -3,5 +3,6 @@ ENV = 'production'
VITE_CLI_PORT = 8080
VITE_SERVER_PORT = 8888
VITE_BASE_API = /api
#下方修改为你的线上ip
VITE_BASE_PATH = http://8.141.61.63
#下方修改为你的线上ip 如果 https模式下则使用域名 并且配置代理 (不建议上线使用表单生成器)
#VITE_BASE_PATH = http://x.x.x.x
VITE_BASE_PATH = https://demo.gin-vue-admin.com
+22 -22
View File
@@ -4,34 +4,34 @@ const path = require('path')
const wfPath = path.resolve(__dirname, './node_modules/.bin')
fs.readdir(wfPath, (err, files) => {
if (err) {
console.log(err)
} else {
if (files.length != 0) {
files.forEach((item) => {
if (item.split('.')[1] === 'cmd') {
replaceStr(`${wfPath}/${item}`, /"%_prog%"/, '%_prog%')
}
})
if (err) {
console.log(err)
} else {
if (files.length != 0) {
files.forEach((item) => {
if (item.split('.')[1] === 'cmd') {
replaceStr(`${wfPath}/${item}`, /"%_prog%"/, '%_prog%')
}
})
}
}
})
// 参数:[文件路径、 需要修改的字符串、修改后的字符串] (替换对应文件内字符串的公共函数)
function replaceStr(filePath, sourceRegx, targetSrt) {
fs.readFile(filePath, (err, data) => {
fs.readFile(filePath, (err, data) => {
if (err) {
console.log(err)
} else {
let str = data.toString()
str = str.replace(sourceRegx, targetSrt)
fs.writeFile(filePath, str, (err) => {
if (err) {
console.log(err)
console.log(err)
} else {
let str = data.toString()
str = str.replace(sourceRegx, targetSrt)
fs.writeFile(filePath, str, (err) => {
if(err){
console.log(err)
}else{
console.log("\x1B[42m%s\x1B[0m","文件修改成功")
}
})
console.log('\x1B[42m%s\x1B[0m', '文件修改成功')
}
})
}
})
}
})
}
+5 -2
View File
@@ -11,11 +11,12 @@
},
"dependencies": {
"@element-plus/icons": "0.0.11",
"axios": "^0.19.2",
"axios": "^0.24.0",
"core-js": "^3.6.5",
"echarts": "4.9.0",
"element-plus": "1.2.0-beta.6",
"highlight.js": "^10.6.0",
"js-cookie": "^3.0.1",
"marked": "^2.0.0",
"mitt": "^3.0.0",
"path": "^0.12.7",
@@ -25,11 +26,13 @@
"script-ext-html-webpack-plugin": "^2.1.4",
"spark-md5": "^3.0.1",
"vue": "^3.2.25",
"vue-i18n": "^9.2.0-beta.25",
"vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0",
"vuex-persist": "^2.1.0"
},
"devDependencies": {
"@intlify/vite-plugin-vue-i18n": "^3.2.1",
"@vitejs/plugin-legacy": "^1.4.4",
"@vitejs/plugin-vue": "latest",
"@vue/cli-plugin-babel": "~4.5.0",
@@ -50,4 +53,4 @@
"vite-plugin-banner": "^0.1.3",
"vite-plugin-importer": "^0.2.5"
}
}
}
+78
View File
@@ -0,0 +1,78 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 900 600">
<rect width="900" height="600" fill="#000"/>
<rect width="900" height="400" fill="#fff"/>
<rect width="900" height="200" fill="#ce1126"/>
<g fill="#fff" stroke="#c09300">
<path stroke-width="1.2703" stroke-linejoin="round" d="m450.81,302.4,68.488,63.579-4.8759-115.47c-0.71638-17.5-15.924-13.485-26.971-7.1723-11.191,7.1723-23.958,7.1723-37.446,2.437-13.485,4.7353-26.253,4.7353-37.444-2.437-11.046-6.3123-26.252-10.328-26.97,7.1723l-4.8789,115.47,70.098-63.579z"/>
<g id="w" fill="#c09300" stroke="none">
<path d="m393.47,246.49-4.7342,112.32-8.0347,7.168,4.8784-115.47c2.2949-1.5782,6.3132-4.0171,7.8905-4.0171z"/>
<path d="m403.09,254.53-4.0171,93.955-8.0323,8.2204,4.8772-108.49c1.5791,1.577,6.3138,5.4498,7.1721,6.3104z"/>
<path d="m411.84,261.7-3.1545,78.362-6.4556,6.3092,4.0177-89.405c1.5748,1.5782,4.7311,3.8734,5.5924,4.7334z"/>
<path d="m421.31,265.72-3.1563,66.787-6.3132,5.1193,3.1563-74.344c1.5791,0.71638,4.7348,2.4376,6.3132,2.4376z"/>
<path d="m430.06,265.72-2.2974,55.657-6.4544,6.3129,2.4392-61.252c1.576-0.00061,5.5937-0.00061,6.3126-0.7182z"/>
</g>
<use xlink:href="#w" transform="matrix(-1,0,0,1,900,0)"/>
<path fill="#c09300" stroke-width="1.0739" d="m453.16,315.06,9.6126,43.755-3.1575,3.1552-3.2993-2.4388-5.4518-39.018,2.2955,39.018-3.1569,4.0158-3.1563-4.0158,2.2962-39.018-5.4506,39.018-3.3024,2.4388-3.1545-3.1552,9.6113-43.755h6.3138z"/>
<g id="b" fill="none" stroke-width="1.2705" stroke-linejoin="round">
<path fill="#fff" stroke-width="1.1888" d="m428.48,295.84-19.08,67.705,26.255,4.0177,11.188-50.924-18.363-20.799z"/>
<path d="m422.17,318.94,2.2955,5.5928,12.405-11.848"/>
<path d="m430.76,304.92,2.5957,24.346,7.8905-10.328"/>
<path d="m438.09,322.95,4.31,14.875"/>
<path d="m444.09,332.36-8.7177,13.241m2.7189,13.216-2.7902-13.198-2.4356-13.423-5.8406,7.9091-2.5613-9.1191-8.1747,8.3847,4.1575,15.251,5.7375-9.4349,3.1557,9.6123,5.8903-9.1621"/>
<path d="m414.99,361.97,5.2997-7.4437,3.4528,11.457,4.7342-8.0323,3.1575,9.6136"/>
</g>
<use xlink:href="#b" transform="matrix(-1,0,0,1,900,0)"/>
<g stroke-width="1.2705" stroke-linejoin="round" stroke-linecap="round">
<path stroke-width="2.3777" stroke-linejoin="round" d="m450,393.81c19.943,0,39.024-1.5776,50.213-4.734,4.7354-0.8588,4.7354-3.2976,4.7354-6.4553,4.7354-1.5776,2.2949-7.1704,5.5943-7.1704-3.2994,0.86244-4.0158-5.5941-8.0329-4.7316,0-5.5965-5.5955-6.3129-10.33-4.7377-9.4695,3.1576-26.255,3.8752-42.18,3.8752-15.924-0.71758-32.567-0.71758-42.179-3.8752-4.7342-1.5752-10.327-0.85881-10.327,4.7377-4.0183-0.86245-4.7354,5.5941-8.0341,4.7316,3.2988,0,0.85954,5.5928,5.5943,7.1704,0,3.1576,0,5.5965,4.8778,6.4553,11.045,3.1564,30.128,4.734,50.068,4.734z"/>
<path d="m422.89,363.54c6.4544,0.86123,13.628,1.5776,19.225,0.86123,3.1533,0,5.4494,5.4504-0.86257,6.3129-5.5931,0.71515-14.345,0-19.08-0.86245-4.0171-0.71759-12.768-2.2946-18.364-3.8752-5.5949-2.4364-1.576-7.168,1.5772-6.4522,4.879,1.577,11.192,3.1564,17.505,4.0158z"/>
<path d="m477.12,363.54c-6.4569,0.86123-13.628,1.5776-19.081,0.86123-3.3006,0-5.5961,5.4504,0.71711,6.3129,5.5955,0.71515,14.347,0,19.078-0.86245,4.0189-0.71759,12.769-2.2946,18.364-3.8752,5.5967-2.4364,1.5803-7.168-1.5772-6.4522-4.8778,1.577-11.19,3.1564-17.501,4.0158z"/>
<path d="m403.09,360.39c-4.8771-0.86123-7.1723,4.7316-5.5928,7.8868,0.71637-1.5776,4.0164-1.5776,4.7346-3.1552,0.8582-2.437-0.7182-2.437,0.8582-4.7316z"/>
<path d="m422.17,375.06c0-3.1528,3.1545-2.7651,3.1545-5.9215,0-1.577-0.85893-4.0171-2.4368-4.0171-1.5785,0-3.1575,1.5776-3.1575,3.1552-0.7177,3.157,2.4398,3.6312,2.4398,6.7834z"/>
<path d="m444.88,365.98c4.7305,0,4.2618,6.3141,1.9656,9.4699,0-2.2952-4.0164-3.1558-4.0164-4.7316,0-2.4419,3.6262-2.4419,2.0508-4.7383z"/>
<path d="m496.91,360.39c4.8777-0.86123,7.1741,4.7316,5.5953,7.8868-0.71819-1.5776-4.017-1.5776-4.734-3.1552-0.86124-2.437,0.71759-2.437-0.86124-4.7316z"/>
<path d="m477.83,375.06c0-3.1528-3.1532-2.7651-3.1532-5.9215,0-1.577,0.85953-4.0171,2.438-4.0171,1.5772,0,3.1563,1.5776,3.1563,3.1552,0.71771,3.157-2.441,3.6312-2.441,6.7834z"/>
<path d="m455.12,365.98c-4.7323,0-4.263,6.3141-1.9674,9.4699,0-2.2952,4.0158-3.1558,4.0158-4.7316,0.00061-2.4419-3.6262-2.4419-2.0484-4.7383z"/>
<g stroke-width="0.8915">
<path d="m404.67,361.97c1.58,0,4.0177,0.71758,4.7353,1.577l-4.74-1.58z"/>
<path d="m412.55,364.41c0.86184,0,4.0183,0.71639,5.5959,1.5752l-5.6-1.58z"/>
<path d="m441.25,367.56c-1.5776,0-4.734,0-5.5928,0.71516l5.59-0.72z"/>
<path d="m432.5,367.56c-0.8588-0.86245-4.0165-0.86245-5.5935,0h5.59z"/>
<path d="m495.34,361.97c-1.5776,0-3.8746,0.71758-4.7353,1.577l4.7353-1.577z"/>
<path d="m487.45,364.41c-0.86002,0-4.0171,0.71639-5.5953,1.5752l5.6-1.58z"/>
<path d="m458.75,367.56c1.5794,0,4.7352,0,5.5953,0.71516l-5.6-0.72z"/>
<path d="m467.5,367.56c0.86002-0.86245,4.0183-0.86245,5.5953,0h-5.6z"/>
</g>
<g fill="#c09300" stroke="none">
<path d="m403.34,374.58c-0.53406-0.10208-0.81452-0.52459-0.68011-1.0246,0.16371-0.609,0.65161-0.95739,1.1126-0.79442,0.29312,0.10362,0.82973,0.64469,0.83184,0.83874,0.003,0.22275-0.28059,0.75257-0.40266,0.75379-0.0527,0.00053-0.1342,0.0465-0.18122,0.10201-0.10001,0.11816-0.41341,0.17549-0.68041,0.12446z"/>
<path d="m458.27,378.5c-0.19869-0.0736-0.51521-0.5185-0.51485-0.72377,0.002-0.38717,0.57418-1.0178,0.92881-1.0214,0.17516-0.001,0.65475,0.2481,0.83411,0.43462,0.32504,0.33789,0.25419,0.89278-0.15423,1.2079-0.20096,0.15505-0.80025,0.21125-1.0938,0.1026z"/>
<path d="m458.63,380.98c-0.42018-0.14209-0.57388-0.34776-0.60803-0.8136-0.0355-0.4854,0.0116-0.56097,0.52453-0.84064l0.36556-0.19931,0.34646,0.1545c0.47988,0.21397,0.69338,0.44463,0.71031,0.76742,0.0182,0.34768-0.2397,0.70345-0.64012,0.8829-0.35162,0.15758-0.37253,0.15904-0.69871,0.0488z"/>
<path d="m407.75,370.09c-0.34619-0.0109-0.82136,0.30729-1.0938,0.46875-0.64912,0.15215-1.4047,0.5511-2.0312,0.125-0.61719-0.19079-1.438-0.0404-1.5312,0.71875,0.15839,0.65179,1.0715,1.0243,1.625,0.59375,0.4106-0.53758,1.5312-0.8528,1.6562,0.0625-0.45705,0.69215-0.40489,1.6089-0.78125,2.3438-0.0612,0.45773-0.25176,0.8924-0.5,1.2812-0.4621,0.0464-0.95375-0.008-1.3438,0.28125-0.62601,0.0342-1.2647,0.34537-1.625,0.875-0.40338,0.57818-0.78869,1.1654-0.90625,1.875,0.10725,0.72494,0.93754,0.93275,1.5625,0.96875,0.66694,0.18359,1.3344,0.42433,2,0.625,1.0853,0.24303,2.102,0.63539,3.1875,0.875,1.5844,0.47758,3.2479,0.69739,4.8438,1.125,0.16722,0.0555,0.32405,0.1038,0.5,0.125,0.66233,0.13773,1.0079-0.58289,1.0625-1.125,0.32864-1.1596,0.57948-2.3391,0.90625-3.5,0.22487-0.46559,0.49645-1.5172-0.40625-1.2812-0.51485,0.30872-0.95182,0.7734-1.5938,0.8125-0.87392,0.0509-0.37513,0.94518-0.0312,1.3125,0.0759,0.5872-0.10989,1.2888-0.5,1.75-0.51994,0.32957-1.1716-0.0561-1.7188-0.1875-0.57469,0.01-1.7234-0.28325-1.1875-1.0625,0.19033-0.57691,0.20718-1.2083,0.4375-1.7812,0.29353-0.61455,0.33553-1.2851,0.46875-1.9375-0.36122-0.77733-0.97856,0.25585-1.4688,0.34375-0.33769,0.23455-1.6054,0.33418-0.9375,0.9375,0.57518,0.43696,0.1343,1.1967,0.0312,1.75-0.0369,0.77025-0.83781,0.95394-1.4688,0.78125-0.62768-0.0303-1.5013-0.49748-0.96875-1.1875,0.12115-0.57512,0.322-1.1402,0.4375-1.7188,0.2374-0.69777,0.43732-1.3628,0.6875-2.0625,0.10851-0.61996,0.33113-1.2079,0.625-1.75,0.0173-0.68543,0.47775-1.2752,0.46875-1.9688-0.0469-0.33876-0.19853-0.4622-0.40625-0.46875zm-3.5938,7.25c0.0817-0.0141,0.1399-0.002,0.21875,0.0312,0.24971,0.10625,0.25708,0.30938,0,0.53125-0.11238,0.097-0.23995,0.1905-0.28125,0.1875-0.46771-0.0402-0.6056-0.10974-0.625-0.28125-0.0172-0.15117,0.0307-0.19455,0.34375-0.34375,0.15556-0.0742,0.26207-0.11086,0.34375-0.125z"/>
<path d="m403.12,382.36c-0.49596-0.46627-0.41621-0.80642,0.31729-1.3532,0.31384-0.23393,0.50421-0.20747,0.8631,0.11997,0.55237,0.50393,0.57448,0.82295,0.0869,1.2548-0.24101,0.21344-0.34645,0.25721-0.62697,0.26001-0.29347,0.003-0.3766-0.0334-0.64036-0.28155z"/>
<path d="m406.17,383.28c-0.48488-0.11955-0.76441-0.60787-0.62254-1.0876,0.12852-0.43459,0.20285-0.47736,0.84026-0.48378,0.71478-0.007,0.85352,0.11244,0.86039,0.74185,0.004,0.35432-0.0235,0.43652-0.19971,0.60041-0.2071,0.19261-0.6052,0.29644-0.8784,0.22908z"/>
<path d="m495.28,383.36c-0.22701-0.18894-0.27272-0.27435-0.27532-0.51479-0.003-0.41064,0.23349-0.71172,0.74605-0.94382,0.68183-0.30882,0.95981-0.26636,1.2166,0.18575,0.34158,0.60129,0.32512,0.84675-0.0839,1.252-0.22578,0.22366-0.26805,0.2367-0.78493,0.2419-0.50756,0.003-0.56562-0.0105-0.8185-0.22102z"/>
<path d="m410.22,384.51c-0.36389-0.0971-0.5525-0.37016-0.55726-0.80675-0.004-0.33383,0.0201-0.38706,0.25362-0.56985,0.15122-0.11834,0.39018-0.21971,0.57856-0.24541,0.2669-0.0365,0.36442-0.0132,0.57916,0.13775,0.55052,0.38698,0.66746,0.76972,0.3487,1.1412-0.33953,0.39572-0.66141,0.48753-1.2028,0.34303z"/>
<path d="m432.14,385.49c-0.0807-0.10062-0.25916-0.16012-0.2775-0.287,0.032-0.55487,0.0585-1.1167,0.23525-1.6482,0.0962-0.52301,0.012-1.0692,0.19432-1.5787,0.18698-0.92682,0.18682-1.8826,0.40217-2.8036,0.01-0.47427,0.0549-0.949,0.19241-1.4054,0.15774-0.72168,0.0136-1.4762,0.22606-2.1894-0.0228-0.26786,0.28574-0.98321,0.55658-0.55944,0.39321,0.57645,0.91139,1.0451,1.4208,1.5153,0.43771,0.25252,0.0359,0.62445-0.26658,0.74975-0.41521,0.16364-0.51613,0.62086-0.48666,1.0222-0.0582,0.41455-0.22464,0.80685-0.24153,1.23-0.0878,0.62242-0.0706,1.2546-0.15153,1.8765-0.18211,0.60901-0.11244,1.2597-0.17323,1.8875,0.008,0.39859-0.18142,0.7606-0.15525,1.1604-0.0484,0.40592-0.0665,0.89432-0.40713,1.1724-0.32888,0.16605-0.80429,0.13737-1.0682-0.14228z"/>
<path d="m461.84,375.69c-0.48222,0.36463-0.91353,0.79527-1.3438,1.2188-0.59251,0.4489,0.48677,0.70998,0.625,1.0938,0.15716,0.58638,0.1478,1.2106,0.1875,1.8125,0.17923,0.55142,0.25835,1.1384,0.21875,1.7188-0.0519,0.6223-0.86338,0.49115-1.2188,0.84375-0.49176,0.20722-0.68789,0.69047-1.0625,1.0312-0.24625,0.48275-0.31215,1.0763-0.34375,1.625,0.0353,0.44788-0.30248,0.94931,0,1.3438,0.039,0.0557,0.0852,0.132,0.125,0.1875,0.10115,0.1452,0.3425,0.0292,0.5,0.0625,0.50368-0.0282,1.0285,0.0473,1.5-0.15625,1.21-0.20943,2.4311-0.22605,3.6562-0.28125,0.74925,0.0239,1.4701-0.23695,2.2188-0.21875,0.58681,0.12974,0.85075-0.50626,0.84375-0.96875-0.33224-0.65359-0.045-1.4285-0.3125-2.0938-0.23494-0.67246-0.14236-1.428-0.25-2.125-0.0148-0.54835-0.71068-0.75172-1.0625-0.34375-0.34144,0.34514-0.89289,0.41403-1.1562,0.84375-0.29659,0.60239,0.62745,0.60317,0.78125,1.0625,0.17589,0.4642,0.11825,0.98059,0.15625,1.4688,0.11422,0.59237-0.52919,0.6262-0.9375,0.6875-0.53675,0.20112-1.29,0.33589-1.5938-0.3125-0.1909-0.47948-0.16475-0.99286-0.21875-1.5-0.0131-0.89182-0.22755-1.7684-0.28125-2.6562-0.0514-1.0968-0.2407-2.1866-0.3125-3.2812-0.01-0.45549-0.0706-1.198-0.71875-1.0625zm-0.625,8.25,0.3125,0.0312,0.0312,0.375,0.0312,0.375-0.40625,0.125c-0.21512,0.0636-0.40325,0.0943-0.40625,0.0937-0.003-0.00085-0.088-0.0531-0.1875-0.125-0.21959-0.1586-0.16345-0.38503,0.125-0.6875,0.1626-0.17028,0.23879-0.2033,0.5-0.1875z"/>
<path d="m431.25,374.66c-0.38018,0.13504-0.86245,0.69313-1.25,0.6875-0.88,0.0623-0.75718,0.91919-0.125,1.2188,0.0833,0.25988,0.005,0.58789,0.0312,0.875,0.12288,0.7896-0.37535,1.4249-0.28125,2.2188-0.0442,0.87031-0.30695,1.7177-0.34375,2.5938-0.24704,0.90327-0.24984,1.8321-0.40625,2.75-0.10431,0.82323-0.69963,0.53271-1.2188,0.3125-0.004-0.35689-0.0272-0.70562-0.0312-1.0625,0.21637-0.81711-0.44101-1.0556-1.0938-1.1562-0.68611,0.0649-1.0228-0.52316-0.875-1.125,0.29488-0.35103,1.036-0.2534,1.5-0.3125,0.9813,0.20342,0.9416-1.1118,0.4375-1.5625-0.34472-0.63567-1.1982-0.90926-1.4375-1.5625,0.0956-0.86642-0.47971-1.7322-1.1875-2.1562-1.0885-0.0764-1.9104,0.86306-2.3125,1.7812-0.4525,0.13085-0.90391,0.26657-1.3438,0.4375-0.70889,0.17748-1.7197,1.407-0.75,1.875,0.54424,0.14988,2.2002,0.52782,1.4688,1.2812-0.41224,0.7071-1.201,0.71914-1.9062,0.53125-0.72365,0.00063-1.5294-0.35207-1.5-1.1875-0.14765-0.74985-0.12337-1.5579-0.46875-2.25-0.14847-0.83929-1.1008-0.64297-1.1562,0.125-0.73341,0.53403-0.6357,1.3978-0.125,2.0312,0.31876,0.72891,0.003,1.5776-0.3125,2.25-0.19091,0.87497-1.1559,0.90473-1.8438,1.1875-0.33751,0.13104-1.6285-0.0779-1.1562,0.65625,0.75312,0.26578,1.6525,0.50493,2.4375,0.3125,0.82295-0.10214,1.5375-0.66484,1.9375-1.375,0.55266-0.56003,1.502-0.26685,2.2188-0.28125,0.7728-0.002,1.5626,0.54243,2.3125,0.1875,0.21739-0.56438,1.2219-1.4958,1.5312-0.53125-0.0526,0.86265,0.70932,1.3257,1.5,1.2188,0.86375-0.0494,0.54445,0.61096,0.53125,1.125,0.0571,0.93448,0.65972,1.4247,1.4375,1.8125,0.26491,0.0715,0.545,0.0474,0.8125,0,0.74793-0.23513,1.5536-0.5689,1.7812-1.4062,0.30361-0.68071,0.31071-1.4507,0.53125-2.1562,0.17722-1.1299,0.406-2.26,0.4375-3.4062,0.27617-1.0383,0.19684-2.136,0.40625-3.1875,0.13231-0.7818,0.2308-1.5634,0.3125-2.3438-0.0917-0.41735-0.27189-0.48727-0.5-0.40625zm-6.7812,4.1562c0.15144,0.0185,0.2356,0.20409,0.25,0.53125,0.016,0.36409,0.20628,0.66075,0.4375,0.71875,0.18245,0.0457,0.16681,0.23882-0.0312,0.375-0.11507,0.0791-0.3209,0.127-0.6875,0.125-0.57804-0.003-0.93643-0.15276-1.25-0.46875l-0.1875-0.1875,0.28125-0.1875c0.14178-0.10831,0.39834-0.33259,0.5625-0.5,0.28494-0.29065,0.47356-0.42473,0.625-0.40625z"/>
<path d="m490.5,370.94c-0.56713,0.026-1.1373,0.11796-1.6562,0.25-1.0402-0.0647-1.5624,1.0271-0.5625,1.5625,0.60166,1.5343,1.5404-0.31684,2.5-0.1875,1.4375,0.27956,1.559,1.8323,1.7812,3,0.0809,1.1567,0.41439,2.2816,0.75,3.375,0.96222,1.0695-0.72072,1.7402-1.4375,0.90625-0.61128-0.66434-1.9204-1.4795-2.6562-0.5625-0.9036,0.38266-0.94069,1.5903-1.6875,1.9375-1.2091,0.36803-1.3613-1.1188-2-1.75-0.58724-0.82427-1.7103-0.89646-2.625-1.1875-0.42913-0.86865-0.20548-2.3456-1.0938-2.9375-0.7458,0.30425-2.1131,1.7022-0.96875,2.3438,1.1177,0.96067-0.48782,1.4011-1,2.0625-0.73158,0.81456-0.84849,1.936-0.96875,2.9688-1.2593,0.69566-1.5044-0.78769-1.6562-1.7188-0.0981-1.1115-1.0358-0.78521-1.6875-0.375-0.95249,0.38586-1.4281,1.2903-2.0938,2-0.0799,0.64767,0.0372,1.3567,0.0312,2.0312,0.21646,0.81142,1.2024,0.4303,1.8125,0.375,0.9788-0.40937,1.3795,0.62745,0.59375,1.2188-0.53181,0.67603-2.2198,0.32293-2.0625,1.4062,0.54395,0.0636,1.1105,0.0432,1.6562,0,1.0905-0.29799,2.2614-1.0673,2.375-2.2812,0.1436-1.0582,1.6676-0.86544,2.5-1.0938,1.0408-0.30002,2.2948-0.37704,2.5312,0.9375,0.70943,0.74499,2.2486,1.584,3.0312,0.5625,0.79451-0.48523,1.1764-1.3376,1.125-2.25-0.16203-0.78461,1.2688-0.81314,1.625-0.375,0.52141,0.85796,2.151,0.60478,2.9375,0.125,0.8361-0.61721,1.0176-1.705,2.2188-1.7188,1.7823-0.53352,3.6342-0.84122,5.375-1.5,1.4104-0.3073-0.2099-1.1977-0.5625-1.7188-1.0737-0.53098-2.0081,1.6419-3.2188,0.5625-0.93564-0.71605-0.87212-2.0766-1.2188-3.125-0.23714-1.3573-0.17721-2.9227-1.1562-4-0.67242-0.71491-1.586-0.887-2.5312-0.84375zm-6.8125,9.4688c0.12573-0.003,0.26757,0.0593,0.5,0.1875,0.43841,0.24193,0.75063,0.64294,0.75,0.96875-0.00043,0.21261-0.0545,0.22697-0.375,0.375-0.19719,0.091-0.4214,0.1885-0.5,0.1875-0.18098-0.002-0.62438-0.35688-0.625-0.5-0.00065-0.0594-0.0581-0.28649-0.125-0.46875-0.11761-0.32068-0.0994-0.31643,0.0625-0.53125,0.10347-0.13744,0.18677-0.21532,0.3125-0.21875zm6.5312,0.34375c0.37229-0.0244,0.59356,0.0918,0.75,0.375,0.18178,0.32896,0.0582,0.58095-0.40625,0.78125-0.20349,0.0878-0.407,0.15925-0.4375,0.15625-0.0306-0.003-0.19844-0.10253-0.375-0.21875-0.27012-0.17777-0.3095-0.26387-0.3125-0.46875-0.003-0.31541,0.34928-0.5967,0.78125-0.625zm-8.9375,0.0937c0.10904-0.017,0.20831,0.04,0.34375,0.15625,0.17999,0.15456,0.23685,0.27887,0.28125,0.59375,0.0314,0.21884,0.0265,0.50184,0,0.625-0.0486,0.2261-0.0532,0.21575-0.5625,0.21875-0.64029,0.006-0.6997-0.0639-0.6875-0.65625,0.008-0.37682,0.0118-0.4782,0.21875-0.6875,0.16044-0.16228,0.29721-0.23305,0.40625-0.25zm-5.5,1.4375c0.19951,0.0469,0.3879,0.19761,0.4375,0.4375,0.0656,0.3175,0.008,0.46223-0.25,0.59375-0.2221,0.1131-0.73401,0.1508-0.875,0.0625-0.0457-0.0286-0.1399-0.103-0.1875-0.1875-0.068-0.12114-0.0555-0.1794,0.0312-0.25,0.0605-0.0492,0.12539-0.11985,0.125-0.15625-0.0004-0.0364,0.0673-0.16316,0.15625-0.28125,0.14608-0.1939,0.36299-0.26563,0.5625-0.21875zm9.25,1.1875c0.17794-0.001,0.32863,0.0609,0.4375,0.15625,0.18526,0.16231,0.179,0.40039-0.0312,0.5625-0.13509,0.1044-0.87165,0.0948-1.125,0-0.11272-0.0421-0.15563-0.0987-0.15625-0.21875-0.002-0.14091,0.0375-0.22767,0.28125-0.34375,0.20425-0.0976,0.41581-0.15507,0.59375-0.15625z"/>
<path d="m467.86,388.29c-0.0958-0.0625-0.23767-0.11699-0.0948-0.22157,0.17277-0.30247,0.51785-0.40716,0.82434-0.51974,0.54779-0.23732,1.0207-0.64036,1.3737-1.1184,0.05-0.33298,0.42384-0.51355,0.42219-0.86174,0.003-0.47487,0.0311-0.9616-0.0846-1.426-0.12837-0.4257-0.45147-0.75199-0.82649-0.97395-0.25667-0.20149-0.674-0.25712-0.76877-0.61402-0.0525-0.34279,0.25343-0.60401,0.36053-0.90935,0.22325-0.42151,0.41109-0.86364,0.6509-1.275,0.25912-0.2878,0.65892-0.0156,0.79298,0.26239,0.18915,0.27771,0.35679,0.57593,0.45076,0.89748,0.30225,0.33175,0.57024,0.72087,0.679,1.1618,0.14839,0.31056,0.38316,0.60234,0.36929,0.96609,0.0003,0.4164,0.23509,0.78738,0.22034,1.2063,0.0133,0.56042,0.0131,1.1449-0.19184,1.6741-0.14001,0.29344-0.42058,0.46964-0.60639,0.73256-0.31897,0.29554-0.67037,0.57899-1.0797,0.73615-0.28928,0.092-0.45706,0.42565-0.81934,0.34466-0.51458,0.009-1.0366,0.079-1.5472-0.004,0.0323,0.0542-0.15633-0.0915-0.12493-0.0573z"/>
<path d="m461.01,388.74c-0.24268-0.24958-0.2952-0.35543-0.29788-0.60032-0.003-0.24747,0.0446-0.34567,0.2822-0.58569,0.43829-0.44275,0.65248-0.45344,1.4091-0.0705,0.72304,0.36598,0.9675,0.39912,1.0322,0.14002,0.0625-0.25022,0.47885-0.47916,0.87435-0.4808,0.25006-0.002,0.39157,0.0477,0.59183,0.20368,0.25136,0.19583,0.26349,0.22634,0.26989,0.67935,0.004,0.46299-0.002,0.48055-0.29042,0.73591-0.27723,0.24409-0.32183,0.25915-0.66541,0.22476-0.43718-0.0439-0.69954-0.24407-0.77073-0.58844-0.0516-0.25001-0.13942-0.3097-0.20523-0.1397-0.0209,0.0546-0.12864,0.12185-0.23894,0.1496-0.20352,0.0514-0.5488,0.26862-0.79415,0.50006-0.0927,0.0874-0.25526,0.12855-0.51863,0.13122-0.35563,0.003-0.40513-0.0183-0.67826-0.29915z"/>
<path d="m441.19,379.84c-0.66466,0.007-1.3805,0.5662-1.4688,1.2188,0.15206,0.75226,0.77698,1.4895,0.375,2.2812,0.27756,1.0131-0.76147,1.3974-1.4688,0.8125-0.4271-0.97134-0.64349-2.0358-1.2812-2.9062-0.80411-0.22762-1.1545,1.0569-1.7188,1.5,0.27975,0.75505,1.0958,1.4324,1.1875,2.375,0.1952,0.91482-0.36128,1.9306-1.1562,2.4062-0.68584,0.65472-1.6254,0.42074-2.4688,0.5625-1.0242,0.59857,0.75182,0.81755,1.2188,0.84375,1.0477,0.10646,2.1354-0.0317,2.9062-0.8125,0.76911-0.36708,0.70971-1.6972,1.625-1.8438,1.5884-0.0709,3.1626,0.24355,4.75,0.28125,0.84936,0.20336,2.1635-0.10098,2.75,0.53125,0.002,1.1075,0.94078,1.7905,1.8438,2.2188,0.4987,0.13872,1.0241-0.47928,1.5312-0.59375,0.96531-0.30764,0.67182-1.502,1.25-1.9688,1.6504-0.0893,3.3163-0.0704,4.9688-0.0937,0.31463,0.008,0.40734-0.43988,0.625-0.625-0.0363-0.63881-0.0593-1.2726-0.15625-1.9062-0.31819-0.80653,0.0513-1.8446-0.53125-2.5312-0.83011-0.22606-1.5362,0.53355-2.375,0.59375-0.92616,0.41246-1.7065,1.2677-1.75,2.3125-0.54833,0.89658-1.4277-0.15958-1.125-0.90625-0.0346-0.32541,0.0704-0.70429-0.0312-1-0.50698-0.60814-1.3947-0.4094-2.0938-0.5-1.0184,0.0406-2.0127-0.17955-3.0312-0.15625-0.89293-0.0674-1.822,0.0777-2.6875-0.15625-1.0317-0.0293-0.88959-1.0382-1.0625-1.75-0.18299-0.13571-0.40345-0.18973-0.625-0.1875zm2,3.6875c0.34308,0.007,0.66656,0.052,1,0.0937,0.43082,0.0709,0.8899-0.14816,1.3125,0,0.97651,0.16608,1.9536,0.12685,2.9375,0.21875,0.25985-0.004,0.44579,0.18471,0.625,0.34375,0.002,0.68357,0.00066,1.3789,0,2.0625-0.0299,0.25767,0.0763,0.5982-0.15625,0.78125-0.0747,0.0513-0.1583,0.1072-0.25,0.125-0.27065-0.07-0.55731-0.2479-0.6875-0.5-0.0414-0.35742,0.0179-0.70404,0.0312-1.0625-0.007-0.0927,0.0404-0.237,0-0.3125-0.21278-0.15067-0.45387-0.249-0.71875-0.25-0.84945-0.0291-1.682-0.0916-2.5312-0.125-0.7069-0.0446-1.4333,0.0604-2.125-0.125-0.26845-0.0976-0.61789-0.0641-0.78125-0.34375-0.23417-0.27227,0.10362-0.59695,0.34375-0.71875,0.31827-0.1447,0.65692-0.19411,1-0.1875zm11.281,0.25c0.15866-0.002,0.20935,0.05,0.28125,0.34375,0.0459,0.18765,0.0996,0.4172,0.125,0.5,0.0363,0.11811-0.0218,0.15625-0.1875,0.21875-0.494,0.18646-0.98566,0.16797-1.1562-0.0625-0.0774-0.10454,0.0129-0.43451,0.15625-0.5625,0.28946-0.25851,0.60992-0.43691,0.78125-0.4375z"/>
</g>
</g>
<path stroke-width="1.1502" d="m449.98,327.23c32.642-25.106,29.843-61.883,29.843-61.883-0.8613,0.17223-1.6795,0.25835-2.5408,0.25835-6.8471,0-23.178-3.9171-26.988-8.8926-4.0812,4.5034-20.77,8.8926-27.574,8.8926-0.86129,0-1.7225-0.0861-2.5407-0.25835,0,0-2.8422,36.776,29.8,61.883z"/>
<path stroke-width="0.9157" d="m477.22,268.04c-0.28097,0.0176-0.5633,0.0264-0.8477,0.0264-6.2055,0-20.619-3.1838-26.175-7.9572-5.8195,4.4095-20.471,7.9572-26.576,7.9572-0.28635,0-0.56925-0.035-0.84965-0.0865-0.0142,1.3908,0.0581,2.8324,0.14448,4.1436,0.323,4.9008,1.1826,9.819,2.4876,14.552,4.1081,14.895,12.516,27.553,24.572,37.155,12.066-9.61,20.484-22.28,24.601-37.186,1.3071-4.7319,2.1694-9.6497,2.4955-14.55,0.0853-1.2845,0.15716-2.6918,0.14745-4.0545z"/>
<path fill="#c09300" stroke="none" d="m439.38,265.03c-5.8724,1.8448-12.229,3.0312-15.75,3.0312-0.28633,0-0.56336-0.0423-0.84375-0.0937-0.0142,1.3907,0.0699,2.8451,0.15625,4.1562,0.32298,4.9006,1.1638,9.7995,2.4688,14.531,2.765,10.025,7.5063,19.032,13.969,26.781v-48.406z"/>
<path fill="#c09300" stroke="none" d="m460,264.94,0,49.25c6.794-7.9213,11.733-17.206,14.594-27.562,1.307-4.7317,2.1427-9.6313,2.4688-14.531,0.0853-1.2844,0.16596-2.6999,0.15625-4.0625-0.28095,0.0176-0.55937,0.0312-0.84375,0.0312-3.7302,0-10.42-1.1704-16.375-3.125z"/>
<g stroke-width="1.2704">
<path stroke-width="1.2179" d="m462.31,253.09c0.66655,0.0392-0.90178-3.568-0.90178-3.568,1.7643,1.8036,8.4297,2.2349,8.4297,2.2349-3.999-1.7656-7.9979-15.096-7.528-25.721,0.4319-10.664-1.5284-14.859-3.0971-16.428-1.9995-1.9995-8.4298-3.7639-12.664-3.9991-2.3922-0.11761-1.9995,1.8036-1.9995,1.8036-4.4308-1.137-8.8606-1.5684-10.861-0.2353-1.882,1.2547-2.274,7.5278-0.90178,6.43,3.3326-2.6661,6.2341-0.23524,8.2335,2.6661,1.7644,2.5485,1.6467,9.7627-0.90178,18.192-2.6661,8.8609-9.9588,17.722-9.9588,17.722,3.96,0,9.5276-3.5287,9.5276-3.5287l-1.3331,5.5283c4.1951-1.9996,7.5278-5.0969,7.5278-5.0969l3.9992,4.1951c1.333-1.7643,3.9991-4.1951,3.9991-4.1951s3.3328,3.5286,8.4297,3.9992z"/>
<path fill="none" d="m446.12,227.57s-2.2349,16.428-6.43,21.094"/>
<path fill="none" d="m449.65,227.14s-0.86252,16.623-3.7639,21.956"/>
<path fill="none" d="m452.78,227.81s0,18.192,1.0978,21.289"/>
<path fill="none" d="m456.74,228.71s0.90178,15.291,4.6657,20.819"/>
<path fill="#c09300" stroke-width="0.3542" d="m442.08,219.61c-0.19598-1.4508-0.54888-2.5878-1.0586-3.3328-1.9996-2.9013-4.9009-5.3321-8.2335-2.6661,0,0,1.137-3.5287,3.5678-3.6463,1.882-0.11767,6.1556,1.4115,9.9196,7.8415,0,0-2.7837-0.62739-3.4502-0.0393-1.2546,1.0979-0.74495,1.8428-0.74495,1.8428z"/>
<path fill="#c09300" stroke-width="0.3542" d="m432.44,209.26c0.27439-0.90178,0.7057-1.7251,1.2546-2.078,1.9996-1.333,6.43-0.90177,10.86,0.23524,0,0-0.39205-1.9212,1.9996-1.8036,4.2344,0.23523,10.665,1.9996,12.664,3.9992,0.47046,0.50973,1.0194,1.2547,1.4899,2.3916h-0.0784c-0.98015-1.3721-3.764-1.2937-4.4308-1.2154-1.0586,0.11756-1.7251,0.0784-3.1365,0.4312-0.66655,0.15693-1.686,0.3529-2.2349,0.78422-0.43131,0.3529-0.7841,1.6467-1.4506,1.6467-1.0586,0-0.98019-0.27449-1.2547-0.58814-0.35279-0.43131-0.54888-1.0586-0.90178-1.0194-1.0978,0.19608-2.8621-0.66644-5.0969-2.4308-2.2344-1.7644-3.0971-2.1956-5.9984-1.9996-2.8622,0.23524-3.7639,1.8427-3.7639,1.8427l0.0784-0.19598z"/>
<circle cx="448.824" cy="210.672" r="1.176" stroke="none"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 7410 3900"><path fill="#b22234" d="M0 0h7410v3900H0z"/><path d="M0 450h7410m0 600H0m0 600h7410m0 600H0m0 600h7410m0 600H0" stroke="#fff" stroke-width="300"/><path fill="#3c3b6e" d="M0 0h2964v2100H0z"/><g fill="#fff"><g id="d"><g id="c"><g id="e"><g id="b"><path id="a" d="M247 90l70.534 217.082-184.66-134.164h228.253L176.466 307.082z"/><use xlink:href="#a" y="420"/><use xlink:href="#a" y="840"/><use xlink:href="#a" y="1260"/></g><use xlink:href="#a" y="1680"/></g><use xlink:href="#b" x="247" y="210"/></g><use xlink:href="#c" x="494"/></g><use xlink:href="#d" x="988"/><use xlink:href="#c" x="1976"/><use xlink:href="#e" x="2470"/></g></svg>

After

Width:  |  Height:  |  Size: 741 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 30 20"><defs><path id="a" d="M0-1L.588.809-.952-.309H.952L-.588.809z" fill="#FF0"/></defs><path fill="#EE1C25" d="M0 0h30v20H0z"/><use xlink:href="#a" transform="matrix(3 0 0 3 5 5)"/><use xlink:href="#a" transform="rotate(23.036 .093 25.536)"/><use xlink:href="#a" transform="rotate(45.87 1.273 16.18)"/><use xlink:href="#a" transform="rotate(69.945 .996 12.078)"/><use xlink:href="#a" transform="rotate(20.66 -19.689 31.932)"/></svg>

After

Width:  |  Height:  |  Size: 531 B

+1
View File
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+48
View File
@@ -0,0 +1,48 @@
import { createI18n as _createI18n } from 'vue-i18n'
import elementEnLocale from 'element-plus/es/locale/lang/en' // english lang
import elementZhLocale from 'element-plus/es/locale/lang/zh-cn'// chinese lang
import elementArLocale from 'element-plus/es/locale/lang/ar'// arabic lang
import enLocale from './locales/en.json'
import zhLocale from './locales/zh.json'
import arLocale from './locales/ar.json'
import Cookies from 'js-cookie'
// const messageImports = import.meta.glob('./locales/*.json')
// console.log(messageImports)
// export const SUPPORT_LOCALES = ['en', 'zh', 'ar']
const messages = {
en: {
...enLocale,
...elementEnLocale
},
zh: {
...zhLocale,
...elementZhLocale
},
ar: {
...arLocale,
...elementArLocale
}
}
export function createI18n() {
return _createI18n({
legacy: false,
globalInjection: true,
// locale: 'en',
// set locale
// options: en | zh | ar
locale: Cookies.get('language') || 'en', // get selected language from cookies
fallbackLocale: 'en',
// set locale messages
messages
// messages: {
// enLang,
// zhLang,
// arLang
// }
})
}
+57
View File
@@ -0,0 +1,57 @@
{
"general": {
"pleaseSelect" : "من فضلك إختار",
"langSwitch" : "!!تم تغيير اللغة بنجاح",
"" : ""
},
"login": {
"entUserName": "أدخل إسم المستخدم",
"entPassword": "أدخل كلمة المرور",
"entVerificationCode": "أدخل رمز التأكيد",
"login": "الدخول للنظام",
"init": "التهيئة",
"errUserName": "إدخل إسم مستخدم صحيح",
"errPassword": "إدخل كلمة مرور صحيحة",
"errVerificationCode": "رمز تأكيد خطاء",
"errLogin": "من فضلك إدخل بيانات دخول صحيحة",
"errInit" : "تم تهية قاعدة البيانات مسبقا، لاداعى للتهيئة مجددا",
"language": "Languages"
},
"init": {
"note": "تعليمات التهيئة",
"note1": "1.يجب ان تكون على دراية بإستخدام GoLang و Vue.",
"note2": "2.من فضلك تأكد من قرءاة ",
"note3": "3.Please confirm that you understand the subsequent configuration process.",
"note4": "Note: The development team does not provide free services for the content written in the document.",
"readDocs": "قرأة الإرشادات",
"confirm": "تأكيد",
"dbType": "نوع قاعدة البيانات",
"beta": "تجريبي",
"dbHost": "عنوان الخادم",
"enterDBHost" : "أدخل عنوان خادم قاعدة البيانات",
"dbPort": "رقم المنفذ",
"enterDBPort": "أدخل رقم منفذ قاعدة البيانات",
"dbUser": "إسم المستخدم",
"enterDBUser" : "أدخل كلمة إسم مستخدم قاعدة البيانات",
"dbPassword": "كلمة المرور",
"enterDBPassword": "أدخل كلمة مرور مستخدم قاعدة البيانات",
"dbName": "إسم قاعدة البيانات",
"enterDBName": "أدخل إسم قاعدة البيانات",
"initNow": "بداء التهيئة",
"pleaseWait": "جارى تهيئة قاعدة البيانات, من فضلك إنتظر",
"" : ""
},
"autoCode": {
"existDB": "إضغط هنا لإنشاء الكود من قاعدة بيانات موجوده",
"dbName" : "قاعدة البيانات",
"selectDB" : "إختار قاعدة البيانات",
"tableName" : "إسم الجدول",
"selectTable" : "إختار الجدول",
"createUsingTable" : "Create using this table",
"structName" : "Struct Name",
"structNameNote" : "The first letter is automatically converted to uppercase",
"tableNameNote": "Specify the table name (not required)",
"structAbbreviation": "Struct abbreviation",
"" : ""
}
}
+191
View File
@@ -0,0 +1,191 @@
{
"general": {
"pleaseSelect" : "Please select",
"langSwitch" : "Language switched successfully!!",
"operations" : "Operations",
"add" : "Add",
"edit" : "Edit",
"delete" : "Delete",
"copy" : "Copy",
"cancel": "Cancel",
"confirm" : "Confirm",
"close" : "Close",
"selectAll" : "Select All",
"copySuccess" : "Copy successfully!",
"deleteSuccess": "Deleted successfully!",
"date" : "Date",
"hint" : "Hint",
"warning" : "Warning",
"enable" : "Enable",
"" : ""
},
"login": {
"entUserName": "Please enter username",
"entPassword": "Please enter the password",
"entVerificationCode": "Please enter verification code",
"login": "Login",
"init": "Go to initialization",
"errUserName": "Please enter the correct username",
"errPassword": "Please enter the correct password",
"errVerificationCode": "Incorrect verification code",
"errLogin": "Please fill in the login information correctly",
"errInit" : "Database information has been configured and cannot be initialized",
"language": "Languages"
},
"init": {
"note": "Initialization notice",
"note1": "1.You should be familiar with Vue AND GoLang.",
"note2": "2.Please confirm that you have read the official documents.",
"note3": "3.Please confirm that you understand the subsequent configuration process.",
"note4": "Note: The development team does not provide free services for the content written in the document.",
"readDocs": "Read the documentation",
"confirm": "I confirm",
"dbType": "Database Type",
"beta": "Beta",
"dbHost": "Host",
"enterDBHost" : "Please enter database host",
"dbPort": "Port",
"enterDBPort": "Please enter database port",
"dbUsername": "Username",
"enterDBUsername" : "Please enter database username",
"dbPassword": "Password",
"enterDBPassword": "Please enter the database password (empty if none)",
"dbName": "DB Name",
"enterDBName": "Please enter database name",
"initNow": "Initialize Now",
"pleaseWait": "Initializing database, please wait",
"" : ""
},
"authority" : {
"authorityNote" : "Note: Pull down the avatar in the upper right corner to switch roles",
"addRole" : "Add Role",
"editRole" : "Edit Role",
"roleID" : "Role ID",
"roleName" : "Role Name",
"setPermissions" : "Set Permissions",
"parentRole" : "Parent Role",
"roleConfig" : "Role Configuration",
"roleMenu" : "Role Menu",
"roleAPI" : "Role Api",
"resourcePermissions" : "Resource Permissions",
"positiveIntNote" : "Please enter a positive integer",
"rootRole" : "Root Role",
"roleIdNote" : "Please enter role id",
"roleNameNote" : "Please enter role name",
"" : ""
},
"user": {
"addUser" : "Add User",
"avatar" : "Avatar",
"userName" : "Username",
"nickName" : "Nickname",
"userRole" : "User Role",
"deleteUserConfrim" : "Are you sure you want to delete this user",
"resetPassword" : "Reset Password",
"password" : "Password",
"mediaLibrary" : "Select from media library",
"userNameNote" : "Please enter username",
"userNameLenNote" : "Username should be 5 character at least.",
"passwordNote" : "Please enter password",
"passwordLenNote" : "Password should be 6 character at least.",
"nickNameNote" : "Please enter nickname",
"userRoleNote" : "Please select user role",
"resetPasswordConfrim" : "Do you want to reset current password to: 123456",
"anotherUserEdit" : "There is currently a user who is editing",
"setUserInfoNote" : "Set up successfully!!",
"userAddedNote" : "User added successfully!!",
"roleSetNote" : "Role set successfully!!",
"" : ""
},
"autoCode": {
"existDB" : "Click here to create code from an existing database",
"dbName" : "Database Name",
"selectDB" : "Please select a database",
"tableName" : "Table Name",
"selectTable" : "Please select a table",
"createUsingTable" : "Create using this table",
"structName" : "Struct Name",
"structNameNote" : "The first letter is automatically converted to uppercase",
"tableNameNote": "Specify the table name (not required)",
"structAbbreviation": "Struct abbreviation",
"structAbbreviationNote": "The abbreviation will be used as the name of the input object and the routing group",
"structChineseName": "Struct Description",
"structChineseNameNote" : "Used as automatic api description",
"fileName" : "File Name",
"fileNameNote" : "The default name of the generated file (camel case format is recommended, the first letter is lowercase, such as sysXxxXxxx)",
"autoAPIDBTip": "Note: Register the automatically generated API into the database",
"autoAPIDBCreate" : "Automatically create API",
"autoMoveFilesTip" : "Note: Automatically migrate the generated files to the corresponding location of the ymal configuration",
"autoMoveFiles" : "Automatically move files",
"addField" : "Add Field",
"fieldIndex" : "Id",
"fieldName" : "Name",
"fieldDesc" : "Description",
"fieldJson" : "Json Field",
"fieldDataType" : "DataType",
"fieldLen" : "Length",
"columnName": "Column Name",
"comment" : "Comment",
"searchType" : "Search Condition",
"dictionary" : "Dictionary",
"moveUp" : "Move Up",
"moveDown" : "Move Down",
"confirmDelete" : "Confirm to delete?",
"codePreview" : "Preview Code",
"generateCode" : "Generate Code",
"componentContent" : "Component Content",
"actionBar" : "Actions:",
"copy" : "Copy",
"entStructName" : "Please enter the structure name",
"entStructAbbreviation" : "Please enter the abbreviation of the structure",
"entStructDesc" : "Please enter the structure description",
"entFileName" : "File name: sysXxxxXxxx",
"errNoFields" : "Please fill in at least one field",
"errSameFiledName" : "There is a field with the same name as the structure",
"errSameStructDescAbbr" : "Struct name and struct abbreviation cannot be the same",
"codeGenMoveSuccess" : "The automated code was created and moved successfully",
"codeGenDownload" : "The automation code was created successfully and is being downloaded",
"table" : " table",
"field" : " field",
"" : ""
},
"fieldDialog" : {
"note" : "id, created_at, updated_at, deleted_at will be automatically generated. Please do not create it repeatedly. If the condition is LIKE when searching, only strings are supported",
"autoFill" : "Auto Fill",
"selectDataType" : "Please select datatype",
"dataTypeNote" : "Data length",
"selectSearchType" : "Please select field search condition",
"associativeDictionary" : "Associative Dictionary",
"selectDictionary" : "Please select dictionary",
"string" : "String",
"integer" : "Integer",
"boolean" : "Boolean",
"float" : "Float",
"time" : "Time",
"entFieldName" : "Please enter field name",
"entFieldDesc" : "Please enter field description",
"entFieldJson" : "Please enter field json name",
"entColumnName" : "Please enter the column name",
"entFieldDataType" : "Please enter field datatype",
"" : ""
},
"autoCodeAdmin" : {
"rollBackMark" : "Rollback mark",
"rolledBack" : "Rolled back",
"notRolledBack" : "Not Rolled Back",
"rollBack" : "Rollback",
"reuse" : "Reuse",
"deleteHistoryConfirm" : "This operation will delete this history, do you want to continue?",
"rollbackConfirm" : "This operation will delete the automatically created files and api, do you want to continue?",
"rollbackSuccess" : "Rollback successfully!",
"" : ""
},
"system" : {
"systemConfig" : "System Configuration",
"envValues" : "Environment values",
"portValue" : "Port Value",
"ossType": "Oss Type",
"multiLogin" : "Multi-login interception",
"" : ""
}
}
+192
View File
@@ -0,0 +1,192 @@
{
"general": {
"pleaseSelect" : "请选择",
"langSwitch" : "语言切换成功!!",
"operations" : "操作",
"add" : "新增",
"edit" : "编辑",
"delete" : "删除",
"copy" : "拷贝",
"cancel" : "取消",
"sure" : "确定",
"close" : "取 消",
"selectAll" : "全选",
"copySuccess" : "复制成功",
"deleteSuccess": "删除成功",
"date" : "日期",
"hint" : "提示",
"warning" : "警告",
"enable" : "开启",
"" : ""
},
"login": {
"entUserName": "请输入用户名",
"entPassword": "请输入密码",
"entVerificationCode": "请输入验证码",
"login": "登 录",
"init": "前往初始化",
"errUserName": "请输入正确的用户名",
"errPassword": "请输入正确的密码",
"errVerificationCode": "验证码格式不正确",
"errLoging": "请正确填写登录信息",
"errInit" : "已配置数据库信息,无法初始化",
"language": "Languages"
},
"init": {
"note": "初始化须知",
"note1": "1.您需有用一定的VUE和GOLANG基础",
"note2": "2.请您确认是否已经阅读过官方文档",
"note3": "3.请您确认是否了解后续的配置流程",
"note4": "注:开发组不为文档中书写过的内容提供无偿服务",
"readDocs": "阅读文档",
"confirm": "我已确认",
"dbType": "数据库类型",
"beta": "测试版",
"dbHost" : "Host",
"enterDBAddress" : "请输入数据库链接",
"dbPort" : "Port",
"enterDBPort" : "请输入数据库端口",
"dbUser" : "Username",
"enterDBUser" : "请输入数据库用户名",
"dbPassword" : "Database Password",
"enterDBPassword" : "请输入数据库密码(没有则为空)",
"dbName" : "DB Name",
"enterDBName" : "请输入数据库名称",
"initNow" : "立即初始化",
"pleaseWait" : "正在初始化数据库,请稍候",
"" : ""
},
"authority" : {
"authorityNote" : "注:右上角头像下拉可切换角色",
"addRole" : "新增角色",
"editRole" : "编辑角色",
"roleID" : "角色ID",
"roleName" : "角色名称",
"setPermissions" : "设置权限",
"parentRole" : "父级角色",
"roleConfig" : "角色配置",
"roleMenu" : "角色菜单",
"roleAPI" : "角色api",
"resourcePermissions" : "资源权限",
"positiveIntNote" : "请输入正整数",
"rootRole" : "根角色",
"roleIdNote" : "请输入角色ID",
"roleNameNote" : "请输入角色名",
"" : ""
},
"user": {
"addUser" : "新增用户",
"avatar" : "头像",
"userName" : "用户名",
"nickName" : "昵称",
"userRole" : "用户角色",
"deleteUserConfrim" : "确定要删除此用户吗",
"resetPassword" : "重置密码",
"password" : "密码",
"mediaLibrary" : "从媒体库选择",
"userNameNote" : "请输入用户名",
"userNameLenNote" : "最低5位字符",
"passwordNote" : "请输入用户密码",
"passwordLenNote" : "最低6位字符",
"nickNameNote" : "请输入用户昵称",
"userRoleNote" : "请选择用户角色",
"resetPasswordConfrim" : "是否将此用户密码重置为123456",
"anotherUserEdit" : "当前存在正在编辑的用户",
"setUserInfoNote" : "设置成功",
"userAddedNote" : "创建成功",
"roleSetNote" : "角色设置成功",
"" : ""
},
"autoCode": {
"existDB": "点这里从现有数据库创建代码",
"dbName": "数据库名",
"selectDB" : "请选择数据库",
"tableName" : "表名",
"selectTable" : "请选择表",
"createUsingTable" : "使用此表创建",
"structName" : "Struct名称",
"structNameNote" : "首字母自动转换大写",
"tableNameNote" : "指定表名(非必填)",
"structAbbreviation": "Struct简称",
"structAbbreviationNote": "简称会作为入参对象名和路由group",
"structChineseName": "Struct中文名称",
"structChineseNameNote" : "中文描述作为自动api描述",
"fileName" : "文件名称",
"fileNameNote" : "生成文件的默认名称(建议为驼峰格式,首字母小写,如sysXxxXxxx)",
"autoAPIDBTip": "注:把自动生成的API注册进数据库",
"autoAPIDBCreate" : "自动创建API",
"autoMoveFilesTip" : "注:自动迁移生成的文件到ymal配置的对应位置",
"autoMoveFiles" : "自动移动文件",
"addField" : "新增Field",
"fieldIndex" : "序列",
"fieldName" : "Field名",
"fieldDesc" : "中文名",
"fieldJson" : "FieldJson",
"fieldDataType" : "Field数据类型",
"fieldLen" : "数据库字段长度",
"columnName": "数据库字段",
"comment" : "数据库字段描述",
"searchType" : "搜索条件",
"dictionary" : "字典",
"moveUp" : "上移",
"moveDown" : "下移",
"confirmDelete" : "确定删除吗?",
"codePreview" : "预览代码",
"generateCode" : "生成代码",
"componentContent" : "组件内容",
"actionBar" : "操作栏:",
"copy" : "复制",
"entStructName" : "请输入结构体名称",
"entStructAbbreviation" : "请输入结构体简称",
"entStructDesc" : "请输入结构体描述",
"entFileName" : "文件名称:sysXxxxXxxx",
"errNoFields" : "请填写至少一个field",
"errSameFiledName" : "存在与结构体同名的字段",
"errSameStructDescAbbr" : "structName和struct简称不能相同",
"codeGenMoveSuccess" : "自动化代码创建成功,自动移动成功",
"codeGenDownload" : "自动化代码创建成功,正在下载",
"table" : "表",
"field" : "字段",
"" : ""
},
"fieldDialog" : {
"note" : "id , created_at , updated_at , deleted_at 会自动生成请勿重复创建。搜索时如果条件为LIKE只支持字符串",
"autoFill" : "自动填充",
"selectDataType" : "请选择field数据类型",
"dataTypeNote" : "数据库类型长度",
"selectSearchType" : "请选择Field查询条件",
"associativeDictionary" : "关联字典",
"selectDictionary" : "请选择字典",
"string" : "字符串",
"integer" : "整型",
"boolean" : "布尔值",
"float" : "浮点型",
"time" : "时间",
"entFieldName" : "请输入field英文名",
"entFieldDesc" : "请输入field中文名",
"entFieldJson" : "请输入field格式化json",
"entColumnName" : "请输入数据库字段",
"entFieldDataType" : "请选择field数据类型",
"" : ""
},
"autoCodeAdmin" : {
"rollBackMark" : "回滚标记",
"rolledBack" : "已回滚",
"notRolledBack" : "未回滚",
"rollBack" : "回滚",
"reuse" : "复用",
"deleteHistoryConfirm" : "此操作将删除本历史, 是否继续?",
"rollbackConfirm" : "此操作将删除自动创建的文件和api, 是否继续?",
"rollbackSuccess" : "回滚成功",
"" : ""
},
"system" : {
"systemConfig" : "系统配置",
"envValues" : "环境值",
"portValue" : "端口值",
"ossType": "Oss类型",
"multiLogin" : "多点登录拦截",
"" : ""
}
}
+6 -2
View File
@@ -2,13 +2,13 @@ import { createApp } from 'vue'
import 'element-plus/dist/index.css'
import './style/element_visiable.scss'
import ElementPlus from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
// 引入gin-vue-admin前端初始化相关内容
import './core/gin-vue-admin'
// 引入封装的router
import router from '@/router/index'
import run from '@/core/gin-vue-admin.js'
import auth from '@/directive/auth'
import { createI18n } from './i18n' // added by mohamed hassan to multilangauge
import '@/permission'
import { store } from '@/store/index'
@@ -17,10 +17,14 @@ import App from './App.vue'
const app = createApp(App)
app.config.productionTip = false
const i18n = createI18n() // added by mohamed hassan to multilangauge
app.use(i18n)
app.use(run)
.use(auth)
.use(store)
.use(router)
.use(ElementPlus, { locale: zhCn }).mount('#app')
.use(ElementPlus, { i18n: (key, value) => i18n.t(key, value) }).mount('#app')
export default app
+59 -59
View File
@@ -6,71 +6,71 @@ let asyncRouterFlag = 0
const whiteList = ['Login', 'Init']
const getRouter = async() => {
await store.dispatch('router/SetAsyncRouter')
await store.dispatch('user/GetUserInfo')
const asyncRouters = store.getters['router/asyncRouters']
asyncRouters.forEach(asyncRouter => {
router.addRoute(asyncRouter)
})
await store.dispatch('router/SetAsyncRouter')
await store.dispatch('user/GetUserInfo')
const asyncRouters = store.getters['router/asyncRouters']
asyncRouters.forEach(asyncRouter => {
router.addRoute(asyncRouter)
})
}
async function handleKeepAlive(to) {
if (to.matched && to.matched.length > 2) {
for (let i = 1; i < to.matched.length; i++) {
const element = to.matched[i - 1]
if (element.name === 'layout') {
to.matched.splice(i, 1)
await handleKeepAlive(to)
}
// 如果没有按需加载完成则等待加载
if (typeof element.components.default === 'function') {
await element.components.default()
await handleKeepAlive(to)
}
}
if (to.matched && to.matched.length > 2) {
for (let i = 1; i < to.matched.length; i++) {
const element = to.matched[i - 1]
if (element.name === 'layout') {
to.matched.splice(i, 1)
await handleKeepAlive(to)
}
// 如果没有按需加载完成则等待加载
if (typeof element.components.default === 'function') {
await element.components.default()
await handleKeepAlive(to)
}
}
}
}
router.beforeEach(async(to, from, next) => {
handleKeepAlive(to)
const token = store.getters['user/token']
// 在白名单中的判断情况
document.title = getPageTitle(to.meta.title)
if (whiteList.indexOf(to.name) > -1) {
if (token) {
if (!asyncRouterFlag) {
asyncRouterFlag++
await getRouter()
}
next({ name: store.getters['user/userInfo'].authority.defaultRouter })
} else {
next()
}
handleKeepAlive(to)
const token = store.getters['user/token']
// 在白名单中的判断情况
document.title = getPageTitle(to.meta.title)
if (whiteList.indexOf(to.name) > -1) {
if (token) {
if (!asyncRouterFlag) {
asyncRouterFlag++
await getRouter()
}
next({ name: store.getters['user/userInfo'].authority.defaultRouter })
} else {
// 不在白名单中并且已经登陆的时候
if (token) {
// 添加flag防止多次获取动态路由和栈溢出
if (!asyncRouterFlag) {
asyncRouterFlag++
await getRouter()
next({...to, replace: true })
} else {
if (to.matched.length) {
next()
} else {
next({ path: '/layout/404' })
}
}
}
// 不在白名单中并且未登陆的时候
if (!token) {
next({
name: 'Login',
query: {
redirect: document.location.hash
}
})
}
next()
}
})
} else {
// 不在白名单中并且已经登陆的时候
if (token) {
// 添加flag防止多次获取动态路由和栈溢出
if (!asyncRouterFlag) {
asyncRouterFlag++
await getRouter()
next({ ...to, replace: true })
} else {
if (to.matched.length) {
next()
} else {
next({ path: '/layout/404' })
}
}
}
// 不在白名单中并且未登陆的时候
if (!token) {
next({
name: 'Login',
query: {
redirect: document.location.hash
}
})
}
}
})
+87 -87
View File
@@ -4,113 +4,113 @@ import { store } from '@/store'
import { emitter } from '@/utils/bus.js'
const service = axios.create({
baseURL: import.meta.env.VITE_BASE_API,
timeout: 99999
baseURL: import.meta.env.VITE_BASE_API,
timeout: 99999
})
let acitveAxios = 0
let timer
const showLoading = () => {
acitveAxios++
if (timer) {
clearTimeout(timer)
acitveAxios++
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
if (acitveAxios > 0) {
emitter.emit('showLoading')
}
timer = setTimeout(() => {
if (acitveAxios > 0) {
emitter.emit('showLoading')
}
}, 400)
}, 400)
}
const closeLoading = () => {
acitveAxios--
if (acitveAxios <= 0) {
clearTimeout(timer)
emitter.emit('closeLoading')
}
}
// http request 拦截器
acitveAxios--
if (acitveAxios <= 0) {
clearTimeout(timer)
emitter.emit('closeLoading')
}
}
// http request 拦截器
service.interceptors.request.use(
config => {
if (!config.donNotShowLoading) {
showLoading()
}
const token = store.getters['user/token']
const user = store.getters['user/userInfo']
config.data = JSON.stringify(config.data)
config.headers = {
'Content-Type': 'application/json',
'x-token': token,
'x-user-id': user.ID
}
return config
},
error => {
closeLoading()
ElMessage({
showClose: true,
message: error,
type: 'error'
})
return error
config => {
if (!config.donNotShowLoading) {
showLoading()
}
const token = store.getters['user/token']
const user = store.getters['user/userInfo']
config.data = JSON.stringify(config.data)
config.headers = {
'Content-Type': 'application/json',
'x-token': token,
'x-user-id': user.ID
}
return config
},
error => {
closeLoading()
ElMessage({
showClose: true,
message: error,
type: 'error'
})
return error
}
)
// http response 拦截器
service.interceptors.response.use(
response => {
closeLoading()
if (response.headers['new-token']) {
store.commit('user/setToken', response.headers['new-token'])
}
if (response.data.code === 0 || response.headers.success === 'true') {
if (response.headers.msg) {
response.data.msg = decodeURI(response.headers.msg)
}
return response.data
} else {
ElMessage({
showClose: true,
message: response.data.msg,
type: 'error'
})
if (response.data.data && response.data.data.reload) {
store.commit('user/LoginOut')
}
return response.data.msg ? response.data : response
}
},
error => {
closeLoading()
switch (error.response.status) {
case 500:
ElMessageBox.confirm(`
response => {
closeLoading()
if (response.headers['new-token']) {
store.commit('user/setToken', response.headers['new-token'])
}
if (response.data.code === 0 || response.headers.success === 'true') {
if (response.headers.msg) {
response.data.msg = decodeURI(response.headers.msg)
}
return response.data
} else {
ElMessage({
showClose: true,
message: response.data.msg,
type: 'error'
})
if (response.data.data && response.data.data.reload) {
store.commit('user/LoginOut')
}
return response.data.msg ? response.data : response
}
},
error => {
closeLoading()
switch (error.response.status) {
case 500:
ElMessageBox.confirm(`
<p>检测到接口错误${error}</p>
<p>错误码<span style="color:red"> 500 </span>:此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存</p>
`, '接口报错', {
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '清理缓存',
cancelButtonText: '取消'
})
.then(() => {
store.commit('user/LoginOut')
})
break
case 404:
ElMessageBox.confirm(`
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '清理缓存',
cancelButtonText: this.$t('general.cancel')
})
.then(() => {
store.commit('user/LoginOut')
})
break
case 404:
ElMessageBox.confirm(`
<p>检测到接口错误${error}</p>
<p>错误码<span style="color:red"> 404 </span>:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格</p>
`, '接口报错', {
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '我知道了',
cancelButtonText: '取消'
})
break
}
return error
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '我知道了',
cancelButtonText: this.$t('general.cancel')
})
break
}
return error
}
)
export default service
export default service
+7 -7
View File
@@ -3,7 +3,7 @@
<warning-bar title="在资源权限中将此角色的资源权限清空 或者不包含创建者的角色 即可屏蔽此客户资源的显示" />
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="openDialog">新增</el-button>
<el-button size="mini" type="primary" icon="plus" @click="openDialog">{{ $t('general.add') }}</el-button>
</div>
<el-table
ref="multipleTable"
@@ -27,11 +27,11 @@
<el-popover :visible="scope.row.visible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="deleteCustomer(scope.row)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="deleteCustomer(scope.row)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button type="text" icon="delete" size="mini">删除</el-button>
<el-button type="text" icon="delete" size="mini">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</template>
@@ -60,8 +60,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -119,7 +119,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功'
message: this.$t('general.deleteSuccess')
})
if (this.tableData.length === 1 && this.page > 1) {
this.page--
+6 -6
View File
@@ -28,7 +28,7 @@
<CustomPic pic-type="file" :pic-src="scope.row.url" />
</template>
</el-table-column>
<el-table-column align="left" label="日期" prop="UpdatedAt" width="180">
<el-table-column align="left" :label="$t('general.date')" prop="UpdatedAt" width="180">
<template #default="scope">
<div>{{ formatDate(scope.row.UpdatedAt) }}</div>
</template>
@@ -43,10 +43,10 @@
>{{ scope.row.tag }}</el-tag>
</template>
</el-table-column>
<el-table-column align="left" label="操作" width="160">
<el-table-column align="left" :lable="$t('general.operations')" width="160">
<template #default="scope">
<el-button size="small" icon="download" type="text" @click="downloadFile(scope.row)">下载</el-button>
<el-button size="small" icon="delete" type="text" @click="deleteFile(scope.row)">删除</el-button>
<el-button size="small" icon="delete" type="text" @click="deleteFile(scope.row)">{{ $t('general.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -98,9 +98,9 @@ export default {
},
methods: {
async deleteFile(row) {
this.$confirm('此操作将永久文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm('此操作将永久文件, 是否继续?', this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
})
.then(async() => {
+25 -25
View File
@@ -3,51 +3,51 @@
<div class="init_page_panle">
<div v-if="hello < 2" id="hello" :class="[hello < 1 ? 'slide-in-fwd-top' : 'slide-out-right']" class="hello ">
<div>
<div class="hello_title">GIN-VUE-ADMIN</div>
<p class="in-two a-fadeinT">初始化须知</p>
<p class="init_p">1.您需有用一定的VUE和GOLANG基础</p>
<p class="init_p">2.请您确认是否已经阅读过官方文档</p>
<p class="init_p">3.请您确认是否了解后续的配置流程</p>
<p class="init_p">注:开发组不为文档中书写过的内容提供无偿服务</p>
<div class="hello_title">{{ $GIN_VUE_ADMIN.appName }}</div>
<p class="in-two a-fadeinT">{{ $t('init.note') }}</p>
<p class="init_p">{{ $t('init.note1') }}</p>
<p class="init_p">{{ $t('init.note2') }}</p>
<p class="init_p">{{ $t('init.note3') }}</p>
<p class="init_p">{{ $t('init.note4') }}</p>
<p class="init_btn">
<el-button type="primary" @click="goDoc">
阅读文档
{{ $t('init.readDocs') }}
</el-button>
<el-button type="primary" @click="showNext">
我已确认
{{ $t('init.confirm') }}
</el-button>
</p>
</div>
</div>
<div v-if="hello > 0 " :class="[(hello > 0 && !out)? 'slide-in-left' : '' , out ? 'slide-out-right' : '']" class=" form">
<el-form ref="form" :model="form" label-width="100px">
<el-form-item label="数据库类型">
<el-select v-model="form.dbType" placeholder="请选择" @change="changeDB">
<el-option key="mysql" label="mysql" value="mysql" />
<el-option key="pgsql" label="pgsql(测试版)" value="pgsql" />
<el-form ref="form" :model="form" label-width="120px">
<el-form-item :label="$t('init.dbType')">
<el-select v-model="form.dbType" placeholder="$('general.pleaseSelect')" @change="changeDB">
<el-option key="mysql" label="MySQL" value="mysql" />
<el-option key="pgsql" :label="'PostgreSQL (' + $t('init.beta') + ')'" value="pgsql" />
</el-select>
</el-form-item>
<el-form-item label="host">
<el-input v-model="form.host" placeholder="请输入数据库链接" />
<el-form-item :label="$t('init.dbHost')">
<el-input v-model="form.host" :placeholder="$t('init.enterDBHost')" />
</el-form-item>
<el-form-item label="port">
<el-input v-model="form.port" placeholder="请输入数据库端口" />
<el-form-item :label="$t('init.dbPort')">
<el-input v-model="form.port" :placeholder="$t('init.enterDBPort')" />
</el-form-item>
<el-form-item label="userName">
<el-input v-model="form.userName" placeholder="请输入数据库用户名" />
<el-form-item :label="$t('init.dbUsername')">
<el-input v-model="form.userName" :placeholder="$t('init.enterDBUsername')" />
</el-form-item>
<el-form-item label="password">
<el-form-item :label="$t('init.dbPassword')">
<el-input
v-model="form.password"
placeholder="请输入数据库密码(没有则为空)"
:placeholder="$t('init.enterDBPassword')"
/>
</el-form-item>
<el-form-item label="dbName">
<el-input v-model="form.dbName" placeholder="请输入数据库名称" />
<el-form-item :label="$t('init.dbName')">
<el-input v-model="form.dbName" :placeholder="$t('init.enterDBName')" />
</el-form-item>
<el-form-item>
<div style="text-align: right">
<el-button type="primary" @click="onSubmit">立即初始化</el-button>
<el-button type="primary" @click="onSubmit">{{ $t('init.initNow') }}</el-button>
</div>
</el-form-item>
</el-form>
@@ -116,7 +116,7 @@ export default {
async onSubmit() {
const loading = this.$loading({
lock: true,
text: '正在初始化数据库,请稍候',
text: this.$t('init.pleaseWait'),
spinner: 'loading',
background: 'rgba(0, 0, 0, 0.7)'
})
+104 -13
View File
@@ -10,6 +10,20 @@
>
<p class="login_panle_form_title_p">{{ $GIN_VUE_ADMIN.appName }}</p>
</div>
<div style="padding-left: 92%; padding-bottom: 20px;">
<el-dropdown trigger="click" @command="handleSetLanguage">
<span class="el-dropdown-link">
<img src="@/assets/language.svg" style="width: 30px; height: 30px;">
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :disabled="$i18n.locale==='en'" command="en"><img src="@/assets/flags/en.svg" class="img">English</el-dropdown-item>
<el-dropdown-item :disabled="$i18n.locale==='zh'" command="zh"><img src="@/assets/flags/zh.svg" class="img">中文</el-dropdown-item>
<el-dropdown-item :disabled="$i18n.locale==='ar'" command="ar"><img src="@/assets/flags/ar.svg" class="img">العربية</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<el-form
ref="loginForm"
:model="loginForm"
@@ -17,7 +31,7 @@
@keyup.enter="submitForm"
>
<el-form-item prop="username">
<el-input v-model="loginForm.username" placeholder="请输入用户名">
<el-input v-model="loginForm.username" :placeholder="$t('login.entUserName')">
<template #suffix>
<span class="input-icon">
<el-icon>
@@ -31,7 +45,7 @@
<el-input
v-model="loginForm.password"
:type="lock === 'lock' ? 'password' : 'text'"
placeholder="请输入密码"
:placeholder="$t('login.entPassword')"
>
<template #suffix>
<span class="input-icon">
@@ -44,14 +58,14 @@
<el-input
v-model="loginForm.captcha"
name="logVerify"
placeholder="请输入验证码"
:placeholder="$t('login.entVerificationCode')"
style="width: 60%"
/>
<div class="vPic">
<img
v-if="picPath"
:src="picPath"
alt="请输入验证码"
:alt="$t('login.entVerificationCode')"
@click="loginVerify()"
>
</div>
@@ -61,12 +75,12 @@
type="primary"
style="width: 46%"
@click="checkInit"
>前往初始化</el-button>
>{{ $t('login.init') }}</el-button>
<el-button
type="primary"
style="width: 46%; margin-left: 8%"
@click="submitForm"
>登 录</el-button>
>{{ $t('login.login') }}</el-button>
</el-form-item>
</el-form>
</div>
@@ -98,6 +112,7 @@ import { mapActions } from 'vuex'
import { captcha } from '@/api/user'
import { checkDB } from '@/api/initdb'
import bootomInfo from '@/view/layout/bottomInfo/bottomInfo.vue'
import Cookies from 'js-cookie'
export default {
name: 'Login',
components: {
@@ -106,14 +121,14 @@ export default {
data() {
const checkUsername = (rule, value, callback) => {
if (value.length < 5) {
return callback(new Error('请输入正确的用户名'))
return callback(new Error(this.$t('login.errUserName')))
} else {
callback()
}
}
const checkPassword = (rule, value, callback) => {
if (value.length < 6) {
return callback(new Error('请输入正确的密码'))
return callback(new Error(this.$t('login.errPassword')))
} else {
callback()
}
@@ -129,17 +144,26 @@ export default {
rules: {
username: [{ validator: checkUsername, trigger: 'blur' }],
password: [{ validator: checkPassword, trigger: 'blur' }],
captcha: [{ required: true, message: '请输入验证码', trigger: 'blur' },
captcha: [{ required: true, message: this.$t('login.entVerificationCode'), trigger: 'blur' },
{
message: '验证码格式不正确',
message: this.$t('login.errVerificationCode'),
trigger: 'blur',
}]
},
logVerify: '',
picPath: ''
picPath: '',
}
},
computed: {
// language() {
// var lang = Cookies.get('language')
// console.log('computed: Loaded language from cookies: ' + lang)
// return (lang || 'en')
// }
},
created() {
this.getLanguage()
this.loginVerify()
},
methods: {
@@ -153,7 +177,7 @@ export default {
} else {
this.$message({
type: 'info',
message: '已配置数据库信息,无法初始化'
message: this.$t('login.errInit')
})
}
}
@@ -171,7 +195,7 @@ export default {
} else {
this.$message({
type: 'error',
message: '请正确填写登录信息',
message: this.$t('login.errLogin'),
showClose: true
})
this.loginVerify()
@@ -189,6 +213,47 @@ export default {
this.picPath = ele.data.picPath
this.loginForm.captchaId = ele.data.captchaId
})
},
setLocale(local) {
console.log('Selected langauge is: ' + local.value)
this.$i18n.locale = local.value
},
getLanguage() {
var lang = Cookies.get('language')
return (lang || 'en')
},
handleSetLanguage(lang) {
this.$i18n.locale = lang
Cookies.set('language', lang)
// this.$store.dispatch('setLanguage', lang)
// if (lang === 'ar') {
// console.log('Arabic language selected changing to RTL')
// document.querySelector('html').classList.add('is-rtl')
// } else {
// console.log('Non Arabic language selected changing to LTR')
// document.querySelector('html').classList.add('is-ltr')
// }
// const htmlEl = document.querySelector('html')
// if (this.$i18n.locale === 'ar') {
// console.log('change language to arabic and ltr to rtl')
// htmlEl.setAttribute('dir', 'rtl')
// } else {
// console.log('change language to english and rtl to ltr')
// htmlEl.setAttribute('dir', 'ltr')
// }
// htmlEl.setAttribute('lang', lang)
this.$message({
message: this.$t('general.langSwitch'),
type: 'success'
})
// this.$emit('handerevent')
}
}
}
@@ -197,4 +262,30 @@ export default {
<style lang="scss" scoped>
@import "@/style/newLogin.scss";
img {
padding-right: 20px;
width: 20px;
height: 20px;
}
prefix {
margin-top: 10px;
width: 100px;
height: 100px;
}
.international-icon {
font-size: 20px;
cursor: pointer;
vertical-align: -5px!important;
}
html.is-rtl * {
direction: rtl;
}
html.is-ltr * {
direction: ltr;
}
</style>
+2 -2
View File
@@ -120,8 +120,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="showPassword=false">取 消</el-button>
<el-button size="small" type="primary" @click="savePassword">确 定</el-button>
<el-button size="small" @click="showPassword=false">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="savePassword">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
+15 -12
View File
@@ -29,15 +29,15 @@
</div>
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="openDialog('addApi')">新增</el-button>
<el-button size="mini" type="primary" icon="plus" @click="openDialog('addApi')">{{ $t('general.add') }}</el-button>
<el-popover v-model:visible="deleteVisible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="deleteVisible = false">取消</el-button>
<el-button size="mini" type="primary" @click="onDelete">确定</el-button>
<el-button size="mini" type="text" @click="deleteVisible = false">{{ $t('general.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="onDelete">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button icon="delete" size="mini" :disabled="!apis.length" style="margin-left: 10px;">删除</el-button>
<el-button icon="delete" size="mini" :disabled="!apis.length" style="margin-left: 10px;">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</div>
@@ -58,20 +58,20 @@
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="200">
<el-table-column align="left" fixed="right" :lable="$t('general.operations')" width="200">
<template #default="scope">
<el-button
icon="edit"
size="small"
type="text"
@click="editApi(scope.row)"
>编辑</el-button>
>{{ $t('general.edit') }}</el-button>
<el-button
icon="delete"
size="small"
type="text"
@click="deleteApi(scope.row)"
>删除</el-button>
>{{ $t('general.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -114,8 +114,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -228,6 +228,9 @@ export default {
// 排序
sortChange({ prop, order }) {
if (prop) {
if (prop === 'ID') {
prop = 'id'
}
this.searchInfo.orderKey = toSQLLine(prop)
this.searchInfo.desc = order === 'descending'
}
@@ -275,9 +278,9 @@ export default {
this.openDialog('edit')
},
async deleteApi(row) {
this.$confirm('此操作将永久删除所有角色下该api, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm('此操作将永久删除所有角色下该api, 是否继续?', this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
})
.then(async() => {
+31 -31
View File
@@ -1,9 +1,9 @@
<template>
<div class="authority">
<warning-bar title="注:右上角头像下拉可切换角色" />
<warning-bar :title="$t('authority.authorityNote')" />
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="addAuthority('0')">新增角色</el-button>
<el-button size="mini" type="primary" icon="plus" @click="addAuthority('0')">{{ $t('authority.addRole') }}</el-button>
</div>
<el-table
:data="tableData"
@@ -11,48 +11,48 @@
row-key="authorityId"
style="width: 100%"
>
<el-table-column label="角色ID" min-width="180" prop="authorityId" />
<el-table-column align="left" label="角色名称" min-width="180" prop="authorityName" />
<el-table-column align="left" label="操作" width="460">
<el-table-column :label="$t('authority.roleID')" min-width="180" prop="authorityId" />
<el-table-column align="left" :label="$t('authority.roleName')" min-width="180" prop="authorityName" />
<el-table-column align="left" :lable="$t('general.operations')" width="460">
<template #default="scope">
<el-button
icon="setting"
size="mini"
type="text"
@click="opdendrawer(scope.row)"
>设置权限</el-button>
>{{ $t('authority.setPermissions') }}</el-button>
<el-button
icon="plus"
size="mini"
type="text"
@click="addAuthority(scope.row.authorityId)"
>新增子角色</el-button>
>{{ $t('general.add') }}</el-button>
<el-button
icon="copy-document"
size="mini"
type="text"
@click="copyAuthority(scope.row)"
>拷贝</el-button>
>{{ $t('general.copy') }}</el-button>
<el-button
icon="edit"
size="mini"
type="text"
@click="editAuthority(scope.row)"
>编辑</el-button>
>{{ $t('general.edit') }}</el-button>
<el-button
icon="delete"
size="mini"
type="text"
@click="deleteAuth(scope.row)"
>删除</el-button>
>{{ $t('general.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 新增角色弹窗 -->
<el-dialog v-model="dialogFormVisible" :title="dialogTitle">
<el-form ref="authorityForm" :model="form" :rules="rules" label-width="80px">
<el-form-item label="父级角色" prop="parentId">
<el-form ref="authorityForm" :model="form" :rules="rules" label-width="100px">
<el-form-item :label="$t('authority.parentRole')" prop="parentId">
<el-cascader
v-model="form.parentId"
style="width:100%"
@@ -63,30 +63,30 @@
filterable
/>
</el-form-item>
<el-form-item label="角色ID" prop="authorityId">
<el-form-item :label="$t('authority.roleID')" prop="authorityId">
<el-input v-model="form.authorityId" :disabled="dialogType=='edit'" autocomplete="off" />
</el-form-item>
<el-form-item label="角色姓名" prop="authorityName">
<el-form-item :label="$t('authority.roleName')" prop="authorityName">
<el-input v-model="form.authorityName" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
<el-drawer v-if="drawer" v-model="drawer" :with-header="false" size="40%" title="角色配置">
<el-drawer v-if="drawer" v-model="drawer" :with-header="false" size="40%" :title="$t('authority.roleConfig')">
<el-tabs :before-leave="autoEnter" class="role-box" type="border-card">
<el-tab-pane label="角色菜单">
<el-tab-pane :label="$t('authority.roleMenu')">
<Menus ref="menus" :row="activeRow" @changeRow="changeRow" />
</el-tab-pane>
<el-tab-pane label="角色api">
<el-tab-pane :label="$t('authority.roleAPI')">
<Apis ref="apis" :row="activeRow" @changeRow="changeRow" />
</el-tab-pane>
<el-tab-pane label="资源权限">
<el-tab-pane :label="$t('authority.resourcePermissions')">
<Datas ref="datas" :authority="tableData" :row="activeRow" @changeRow="changeRow" />
</el-tab-pane>
</el-tabs>
@@ -123,7 +123,7 @@ export default {
data() {
var mustUint = (rule, value, callback) => {
if (!/^[0-9]*[1-9][0-9]*$/.test(value)) {
return callback(new Error('请输入正整数'))
return callback(new Error(this.$t('authority.positiveIntNote')))
}
return callback()
}
@@ -132,7 +132,7 @@ export default {
AuthorityOption: [
{
authorityId: '0',
authorityName: '根角色'
authorityName: this.$t('authority.rootRole')
}
],
listApi: getAuthorityList,
@@ -140,7 +140,7 @@ export default {
dialogType: 'add',
activeRow: {},
activeUserId: 0,
dialogTitle: '新增角色',
dialogTitle: this.$t('authority.addRole'),
dialogFormVisible: false,
apiDialogFlag: false,
copyForm: {},
@@ -151,11 +151,11 @@ export default {
},
rules: {
authorityId: [
{ required: true, message: '请输入角色ID', trigger: 'blur' },
{ required: true, message: this.$t('authority.roleIdNote'), trigger: 'blur' },
{ validator: mustUint, trigger: 'blur' }
],
authorityName: [
{ required: true, message: '请输入角色名', trigger: 'blur' }
{ required: true, message: this.$t('authority.roleNameNote'), trigger: 'blur' }
],
parentId: [
{ required: true, message: '请选择请求方式', trigger: 'blur' }
@@ -197,9 +197,9 @@ export default {
},
// 删除角色
deleteAuth(row) {
this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm('此操作将永久删除该角色, 是否继续?', this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
})
.then(async() => {
@@ -297,7 +297,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '复制成功!'
message: this.$t('general.copySuccess')
})
this.getTableData()
}
@@ -348,7 +348,7 @@ export default {
// 增加角色
addAuthority(parentId) {
this.initForm()
this.dialogTitle = '新增角色'
this.dialogTitle = this.$t('authority.addRole')
this.dialogType = 'add'
this.form.parentId = parentId
this.setOptions()
@@ -357,7 +357,7 @@ export default {
// 编辑角色
editAuthority(row) {
this.setOptions()
this.dialogTitle = '编辑角色'
this.dialogTitle = this.$t('authority.editRole')
this.dialogType = 'edit'
for (const key in this.form) {
this.form[key] = row[key]
@@ -1,7 +1,7 @@
<template>
<div>
<div class="clearflex">
<el-button class="fl-right" size="mini" type="primary" @click="authApiEnter">确 定</el-button>
<el-button class="fl-right" size="mini" type="primary" @click="authApiEnter">{{ $t('general.confirm') }}</el-button>
</div>
<el-tree
ref="apiTree"
@@ -1,8 +1,8 @@
<template>
<div>
<div class="clearflex" style="margin:18px">
<el-button class="fl-right" size="mini" type="primary" @click="authDataEnter">确 定</el-button>
<el-button class="fl-left" size="mini" type="primary" @click="all">全选</el-button>
<el-button class="fl-right" size="mini" type="primary" @click="authDataEnter">{{ $t('general.confirm') }}</el-button>
<el-button class="fl-left" size="mini" type="primary" @click="all">{{ $t('general.selectAll') }}</el-button>
<el-button class="fl-left" size="mini" type="primary" @click="self">本角色</el-button>
<el-button class="fl-left" size="mini" type="primary" @click="selfAndChildren">本角色及子角色</el-button>
</div>
@@ -1,7 +1,7 @@
<template>
<div>
<div class="clearflex">
<el-button class="fl-right" size="mini" type="primary" @click="relation">确 定</el-button>
<el-button class="fl-right" size="mini" type="primary" @click="relation">{{ $t('general.confirm') }}</el-button>
</div>
<el-tree
ref="menuTree"
@@ -28,7 +28,7 @@
</div>
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="openDialog">新增</el-button>
<el-button size="mini" type="primary" icon="plus" @click="openDialog">{{ $t('general.add') }}</el-button>
</div>
<el-table
ref="multipleTable"
@@ -38,7 +38,7 @@
row-key="ID"
>
<el-table-column type="selection" width="55" />
<el-table-column align="left" label="日期" width="180">
<el-table-column align="left" :label="$t('general.date')" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
@@ -59,11 +59,11 @@
<el-popover :visible="scope.row.visible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="deleteSysDictionary(scope.row)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="deleteSysDictionary(scope.row)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button type="text" icon="delete" size="mini" style="margin-left:10px">删除</el-button>
<el-button type="text" icon="delete" size="mini" style="margin-left:10px">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</template>
@@ -101,7 +101,7 @@
/>
</el-form-item>
<el-form-item label="状态" prop="status" required>
<el-switch v-model="formData.status" active-text="开启" inactive-text="停用" />
<el-switch v-model="formData.status" :active-text="$t('general.enable')" inactive-text="停用" />
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="formData.desc" placeholder="请输入描述" clearable :style="{width: '100%'}" />
@@ -109,8 +109,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -216,7 +216,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功'
message: this.$t('general.deleteSuccess')
})
if (this.tableData.length === 1 && this.page > 1) {
this.page--
@@ -32,7 +32,7 @@
row-key="ID"
>
<el-table-column type="selection" width="55" />
<el-table-column align="left" label="日期" width="180">
<el-table-column align="left" :label="$t('general.date')" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
@@ -52,11 +52,11 @@
<el-popover :visible="scope.row.visible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="deleteSysDictionaryDetail(scope.row)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="deleteSysDictionaryDetail(scope.row)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button type="text" icon="delete" size="mini">删除</el-button>
<el-button type="text" icon="delete" size="mini">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</template>
@@ -97,7 +97,7 @@
/>
</el-form-item>
<el-form-item label="启用状态" prop="status" required>
<el-switch v-model="formData.status" active-text="开启" inactive-text="停用" />
<el-switch v-model="formData.status" :active-text="$t('general.enable')" inactive-text="停用" />
</el-form-item>
<el-form-item label="排序标记" prop="sort">
<el-input-number v-model.number="formData.sort" placeholder="排序标记" />
@@ -105,8 +105,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -203,7 +203,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功'
message: this.$t('general.deleteSuccess')
})
if (this.tableData.length === 1 && this.page > 1) {
this.page--
+4
View File
@@ -1160,6 +1160,10 @@ export default {
},
created() {
this.metaData = this.meta
// added by mohamed hassan - PR: Update icon.vue #865
if (this.metaData.icon === '') {
this.metaData.icon = this.options[0].label
}
},
methods: {}
}
+9 -9
View File
@@ -33,7 +33,7 @@
</div>
</template>
</el-table-column>
<el-table-column align="left" fixed="right" label="操作" width="300">
<el-table-column align="left" fixed="right" :lable="$t('general.operations')" width="300">
<template #default="scope">
<el-button
size="mini"
@@ -46,13 +46,13 @@
type="text"
icon="edit"
@click="editMenu(scope.row.ID)"
>编辑</el-button>
>{{ $t('general.edit') }}</el-button>
<el-button
size="mini"
type="text"
icon="delete"
@click="deleteMenu(scope.row.ID)"
>删除</el-button>
>{{ $t('general.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -172,7 +172,7 @@
size="small"
icon="delete"
@click="deleteParameter(form.parameters,scope.$index)"
>删除</el-button>
>{{ $t('general.delete') }}</el-button>
</div>
</template>
</el-table-column>
@@ -180,8 +180,8 @@
</div>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="small" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -311,9 +311,9 @@ export default {
},
// 删除菜单
deleteMenu(ID) {
this.$confirm('此操作将永久删除所有角色下该菜单, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm('此操作将永久删除所有角色下该菜单, 是否继续?', this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
})
.then(async() => {
@@ -23,11 +23,11 @@
<el-popover v-model:visible="deleteVisible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="deleteVisible = false">取消</el-button>
<el-button size="mini" type="primary" @click="onDelete">确定</el-button>
<el-button size="mini" type="text" @click="deleteVisible = false">{{ $t('general.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="onDelete">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button icon="delete" size="mini" style="margin-left: 10px;" :disabled="!multipleSelection.length">删除</el-button>
<el-button icon="delete" size="mini" style="margin-left: 10px;" :disabled="!multipleSelection.length">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</div>
@@ -45,7 +45,7 @@
<div>{{ scope.row.user.userName }}({{ scope.row.user.nickName }})</div>
</template>
</el-table-column>
<el-table-column align="left" label="日期" width="180">
<el-table-column align="left" :label="$t('general.date')" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
<el-table-column align="left" label="状态码" prop="status" width="120">
@@ -94,11 +94,11 @@
<el-popover :visible="scope.row.visible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button size="mini" type="primary" @click="deleteSysOperationRecord(scope.row)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="deleteSysOperationRecord(scope.row)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button icon="delete" size="mini" type="text">删除</el-button>
<el-button icon="delete" size="mini" type="text">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</template>
@@ -175,7 +175,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功'
message: this.$t('general.deleteSuccess')
})
if (this.tableData.length === ids.length && this.page > 1) {
this.page--
@@ -190,7 +190,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '删除成功'
message: this.$t('general.deleteSuccess')
})
if (this.tableData.length === 1 && this.page > 1) {
this.page--
+37 -37
View File
@@ -1,19 +1,19 @@
<template>
<div>
<warning-bar title="注:右上角头像下拉可切换角色" />
<warning-bar :title="$t('authority.authorityNote')" />
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="addUser">新增用户</el-button>
<el-button size="mini" type="primary" icon="plus" @click="addUser">{{ $t('user.addUser') }}</el-button>
</div>
<el-table :data="tableData">
<el-table-column align="left" label="头像" min-width="50">
<el-table-column align="left" :label="$t('user.avatar')" min-width="50">
<template #default="scope">
<CustomPic style="margin-top:8px" :pic-src="scope.row.headerImg" />
</template>
</el-table-column>
<el-table-column align="left" label="UUID" min-width="250" prop="uuid" />
<el-table-column align="left" label="用户名" min-width="150" prop="userName" />
<el-table-column align="left" label="昵称" min-width="100" prop="nickName">
<el-table-column align="left" :label="$t('user.userName')" min-width="150" prop="userName" />
<el-table-column align="left" :label="$t('user.nickName')" min-width="100" prop="nickName">
<template #default="scope">
<p v-if="!scope.row.editFlag" class="nickName">{{ scope.row.nickName }}
<el-icon class="pointer" color="#66b1ff" @click="openEidt(scope.row)">
@@ -31,7 +31,7 @@
</p>
</template>
</el-table-column>
<el-table-column align="left" label="用户角色" min-width="150">
<el-table-column align="left" :label="$t('user.userRole')" min-width="150">
<template #default="scope">
<el-cascader
v-model="scope.row.authorityIds"
@@ -45,19 +45,19 @@
/>
</template>
</el-table-column>
<el-table-column align="left" label="操作" min-width="150">
<el-table-column align="left" :lable="$t('general.operations')" min-width="150">
<template #default="scope">
<el-popover :visible="scope.row.visible" placement="top" width="160">
<p>确定要删除此用户吗</p>
<p>{{ $t('user.deleteUserConfrim') }}</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="deleteUser(scope.row)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="deleteUser(scope.row)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button type="text" icon="delete" size="mini">删除</el-button>
<el-button type="text" icon="delete" size="mini">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
<el-button type="text" icon="magic-stick" size="mini" @click="resetPassword(scope.row)">重置密码</el-button>
<el-button type="text" icon="magic-stick" size="mini" @click="resetPassword(scope.row)">{{ $t('user.resetPassword') }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -73,18 +73,18 @@
/>
</div>
</div>
<el-dialog v-model="addUserDialog" custom-class="user-dialog" title="新增用户">
<el-form ref="userForm" :rules="rules" :model="userInfo" label-width="80px">
<el-form-item label="用户名" prop="username">
<el-dialog v-model="addUserDialog" custom-class="user-dialog" :title="$t('user.addUser')">
<el-form ref="userForm" :rules="rules" :model="userInfo" label-width="90px">
<el-form-item :label="$t('user.userName')" prop="username">
<el-input v-model="userInfo.username" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-form-item :label="$t('user.password')" prop="password">
<el-input v-model="userInfo.password" />
</el-form-item>
<el-form-item label="别名" prop="nickName">
<el-form-item :label="$t('user.nickName')" prop="nickName">
<el-input v-model="userInfo.nickName" />
</el-form-item>
<el-form-item label="用户角色" prop="authorityId">
<el-form-item :label="$t('user.userRole')" prop="authorityId">
<el-cascader
v-model="userInfo.authorityIds"
style="width:100%"
@@ -94,18 +94,18 @@
:clearable="false"
/>
</el-form-item>
<el-form-item label="头像" label-width="80px">
<el-form-item label="" label-width="80px">
<div style="display:inline-block" @click="openHeaderChange">
<img v-if="userInfo.headerImg" class="header-img-box" :src="(userInfo.headerImg && userInfo.headerImg.slice(0, 4) !== 'http')?path+userInfo.headerImg:userInfo.headerImg">
<div v-else class="header-img-box">从媒体库选择</div>
<div v-else class="header-img-box">{{ $t('user.mediaLibrary') }}</div>
</div>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeAddUserDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterAddUserDialog">确 定</el-button>
<el-button size="small" @click="closeAddUserDialog">{{ $t('general.close') }}</el-button>
<el-button size="small" type="primary" @click="enterAddUserDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -150,18 +150,18 @@ export default {
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 5, message: '最低5位字符', trigger: 'blur' }
{ required: true, message: this.$t('user.userNameNote'), trigger: 'blur' },
{ min: 5, message: this.$t('user.userNameLenNote'), trigger: 'blur' }
],
password: [
{ required: true, message: '请输入用户密码', trigger: 'blur' },
{ min: 6, message: '最低6位字符', trigger: 'blur' }
{ required: true, message: this.$t('user.passwordNote'), trigger: 'blur' },
{ min: 6, message: this.$t('user.passwordLenNote'), trigger: 'blur' }
],
nickName: [
{ required: true, message: '请输入用户昵称', trigger: 'blur' }
{ required: true, message: this.$t('user.nickNameNote'), trigger: 'blur' }
],
authorityId: [
{ required: true, message: '请选择用户角色', trigger: 'blur' }
{ required: true, message: this.$t('user.userRoleNote'), trigger: 'blur' }
]
}
}
@@ -182,11 +182,11 @@ export default {
methods: {
resetPassword(row) {
this.$confirm(
'是否将此用户密码重置为123456?',
'警告',
this.$t('user.resetPasswordConfrim'),
this.$t('general.warning'),
{
confirmButtonText: '确定',
cancelButtonText: '取消',
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning',
}
).then(async() => {
@@ -223,7 +223,7 @@ export default {
},
openEidt(row) {
if (this.tableData.some(item => item.editFlag)) {
this.$message('当前存在正在编辑的用户')
this.$message(this.$t('user.anotherUserEdit'))
return
}
this.backNickName = row.nickName
@@ -234,7 +234,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '设置成功'
message: this.$t('user.setUserInfoNote')
})
}
this.backNickName = ''
@@ -268,7 +268,7 @@ export default {
async deleteUser(row) {
const res = await deleteUser({ id: row.ID })
if (res.code === 0) {
this.$message.success('删除成功')
this.$message.success(this.$t('general.deleteSuccess'))
await this.getTableData()
row.visible = false
}
@@ -279,7 +279,7 @@ export default {
if (valid) {
const res = await register(this.userInfo)
if (res.code === 0) {
this.$message({ type: 'success', message: '创建成功' })
this.$message({ type: 'success', message: this.$t('user.userAddedNote') })
}
await this.getTableData()
this.closeAddUserDialog()
@@ -305,7 +305,7 @@ export default {
authorityIds: row.authorityIds
})
if (res.code === 0) {
this.$message({ type: 'success', message: '角色设置成功' })
this.$message({ type: 'success', message: this.$t('user.roleSetNote') })
}
})
},
@@ -1,34 +1,34 @@
<template>
<div>
<warning-bar title="id , created_at , updated_at , deleted_at 会自动生成请勿重复创建。搜索时如果条件为LIKE只支持字符串" />
<warning-bar :title="$t('fieldDialog.note')" />
<el-form
ref="fieldDialogFrom"
:model="middleDate"
label-width="120px"
label-width="160px"
label-position="left"
:rules="rules"
>
<el-form-item label="Field名称" prop="fieldName">
<el-form-item :label="$t('autoCode.fieldName')" prop="fieldName">
<el-input v-model="middleDate.fieldName" autocomplete="off" style="width:80%" />
<el-button size="mini" style="width:18%;margin-left:2%" @click="autoFill">自动填充</el-button>
<el-button size="mini" style="width:18%;margin-left:2%" @click="autoFill">{{ $t('fieldDialog.autoFill') }}</el-button>
</el-form-item>
<el-form-item label="Field中文名" prop="fieldDesc">
<el-form-item :label="$t('autoCode.fieldDesc')" prop="fieldDesc">
<el-input v-model="middleDate.fieldDesc" autocomplete="off" />
</el-form-item>
<el-form-item label="FieldJSON" prop="fieldJson">
<el-form-item :label="$t('autoCode.fieldJson')" prop="fieldJson">
<el-input v-model="middleDate.fieldJson" autocomplete="off" />
</el-form-item>
<el-form-item label="数据库字段名" prop="columnName">
<el-form-item :label="$t('autoCode.columnName')" prop="columnName">
<el-input v-model="middleDate.columnName" autocomplete="off" />
</el-form-item>
<el-form-item label="数据库字段描述" prop="comment">
<el-form-item :label="$t('autoCode.comment')" prop="comment">
<el-input v-model="middleDate.comment" autocomplete="off" />
</el-form-item>
<el-form-item label="Field数据类型" prop="fieldType">
<el-form-item :label="$t('autoCode.fieldDataType')" prop="fieldType">
<el-select
v-model="middleDate.fieldType"
style="width:100%"
placeholder="请选择field数据类型"
:placeholder="$t('fieldDialog.selectDataType')"
clearable
@change="getDbfdOptions"
>
@@ -40,14 +40,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="类型长度" prop="dataTypeLong">
<el-input v-model="middleDate.dataTypeLong" placeholder="数据库类型长度" />
<el-form-item :label="$t('autoCode.fieldLen')" prop="dataTypeLong">
<el-input v-model="middleDate.dataTypeLong" :placeholder="$t('fieldDialog.dataTypeNote')" />
</el-form-item>
<el-form-item label="Field查询条件" prop="fieldSearchType">
<el-form-item :label="$t('autoCode.searchType')" prop="fieldSearchType">
<el-select
v-model="middleDate.fieldSearchType"
style="width:100%"
placeholder="请选择Field查询条件"
:placeholder="$t('fieldDialog.selectSearchType')"
clearable
>
<el-option
@@ -59,12 +59,12 @@
</el-select>
</el-form-item>
<el-form-item label="关联字典" prop="dictType">
<el-form-item :label="$t('fieldDialog.associativeDictionary')" prop="dictType">
<el-select
v-model="middleDate.dictType"
style="width:100%"
:disabled="middleDate.fieldType!=='int'"
placeholder="请选择字典"
:placeholder="$t('fieldDialog.selectDictionary')"
clearable
>
<el-option
@@ -123,41 +123,41 @@ export default {
],
typeOptions: [
{
label: '字符串',
label: this.$t('fieldDialog.string'),
value: 'string'
},
{
label: '整型',
label: this.$t('fieldDialog.integer'),
value: 'int'
},
{
label: '布尔值',
label: this.$t('fieldDialog.boolean'),
value: 'bool'
},
{
label: '浮点型',
label: this.$t('fieldDialog.float'),
value: 'float64'
},
{
label: '时间',
label: this.$t('fieldDialog.time'),
value: 'time.Time'
}
],
rules: {
fieldName: [
{ required: true, message: '请输入field英文名', trigger: 'blur' }
{ required: true, message: this.$t('fieldDialog.entFieldName'), trigger: 'blur' }
],
fieldDesc: [
{ required: true, message: '请输入field中文名', trigger: 'blur' }
{ required: true, message: this.$t('fieldDialog.entFieldDesc'), trigger: 'blur' }
],
fieldJson: [
{ required: true, message: '请输入field格式化json', trigger: 'blur' }
{ required: true, message: this.$t('fieldDialog.entFieldJson'), trigger: 'blur' }
],
columnName: [
{ required: true, message: '请输入数据库字段', trigger: 'blur' }
{ required: true, message: this.$t('fieldDialog.entColumnName'), trigger: 'blur' }
],
fieldType: [
{ required: true, message: '请选择field数据类型', trigger: 'blur' }
{ required: true, message: this.$t('fieldDialog.entFieldDataType'), trigger: 'blur' }
]
}
}
@@ -69,7 +69,7 @@ export default {
copy() {
this.selectText()
document.execCommand('copy')
this.$message.success('复制成功')
this.$message.success(this.$t('general.copySuccess'))
}
}
}
+60 -60
View File
@@ -6,15 +6,15 @@
<el-collapse-item name="1">
<template #title>
<div :style="{fontSize:'16px',paddingLeft:'20px'}">
点这里从现有数据库创建代码
{{ $t('autoCode.existDB') }}
<el-icon class="header-icon ">
<pointer />
</el-icon>
</div>
</template>
<el-form ref="getTableForm" style="margin-top:24px" :inline="true" :model="dbform" label-width="120px">
<el-form-item label="数据库名" prop="structName">
<el-select v-model="dbform.dbName" filterable placeholder="请选择数据库" @change="getTable">
<el-form-item :label="$t('autoCode.dbName')" prop="structName">
<el-select v-model="dbform.dbName" filterable :placeholder="$t('autoCode.selectDB')" @change="getTable">
<el-option
v-for="item in dbOptions"
:key="item.database"
@@ -23,12 +23,12 @@
/>
</el-select>
</el-form-item>
<el-form-item label="表名" prop="structName">
<el-form-item :label="$t('autoCode.tableName')" prop="structName">
<el-select
v-model="dbform.tableName"
:disabled="!dbform.dbName"
filterable
placeholder="请选择表"
:placeholder="$t('autoCode.selectTable')"
>
<el-option
v-for="item in tableOptions"
@@ -39,7 +39,7 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" @click="getColumn">使用此表创建</el-button>
<el-button size="mini" type="primary" @click="getColumn">{{ $t('autoCode.createUsingTable') }}</el-button>
</el-form-item>
</el-form>
</el-collapse-item>
@@ -47,34 +47,34 @@
</div>
<div class="gva-search-box">
<!-- 初始版本自动化代码工具 -->
<el-form ref="autoCodeForm" :rules="rules" :model="form" label-width="120px" :inline="true">
<el-form-item label="Struct名称" prop="structName">
<el-input v-model="form.structName" placeholder="首字母自动转换大写" />
<el-form ref="autoCodeForm" :rules="rules" :model="form" label-width="180px" :inline="true">
<el-form-item :label="$t('autoCode.structName')" prop="structName">
<el-input v-model="form.structName" :placeholder="$t('autoCode.structNameNote')" />
</el-form-item>
<el-form-item label="TableName" prop="tableName">
<el-input v-model="form.tableName" placeholder="指定表名(非必填)" />
<el-form-item :label="$t('autoCode.tableName')" prop="tableName">
<el-input v-model="form.tableName" :placeholder="$t('autoCode.tableNameNote')" />
</el-form-item>
<el-form-item label="Struct简称" prop="abbreviation">
<el-input v-model="form.abbreviation" placeholder="简称会作为入参对象名和路由group" />
<el-form-item :label="$t('autoCode.structAbbreviation')" prop="abbreviation">
<el-input v-model="form.abbreviation" :placeholder="$t('autoCode.structAbbreviationNote')" />
</el-form-item>
<el-form-item label="Struct中文名称" prop="description">
<el-input v-model="form.description" placeholder="中文描述作为自动api描述" />
<el-form-item :label="$t('autoCode.structChineseName')" prop="description">
<el-input v-model="form.description" :placeholder="$t('autoCode.structChineseNameNote')" />
</el-form-item>
<el-form-item label="文件名称" prop="packageName">
<el-input v-model="form.packageName" placeholder="生成文件的默认名称(建议为驼峰格式,首字母小写,如sysXxxXxxx)" @blur="toLowerCase(form,'packageName')" />
<el-form-item :label="$t('autoCode.fileName')" prop="packageName">
<el-input v-model="form.packageName" :placeholder="$t('autoCode.fileNameNote')" @blur="toLowerCase(form,'packageName')" />
</el-form-item>
<el-form-item>
<template #label>
<el-tooltip content="注:把自动生成的API注册进数据库" placement="bottom" effect="light">
<div> 自动创建API </div>
<el-tooltip :content="$t('autoCode.autoAPIDBTip')" placement="bottom" effect="light">
<div> {{ $t('autoCode.autoAPIDBCreate') }} </div>
</el-tooltip>
</template>
<el-checkbox v-model="form.autoCreateApiToSql" />
</el-form-item>
<el-form-item>
<template #label>
<el-tooltip content="注:自动迁移生成的文件到ymal配置的对应位置" placement="bottom" effect="light">
<div> 自动移动文件 </div>
<el-tooltip :content="$t('autoCode.autoMoveFilesTip')" placement="bottom" effect="light">
<div> {{ $t('autoCode.autoMoveFiles') }} </div>
</el-tooltip>
</template>
<el-checkbox v-model="form.autoMoveFile" />
@@ -84,47 +84,47 @@
<!-- 组件列表 -->
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" @click="editAndAddField()">新增Field</el-button>
<el-button size="mini" type="primary" @click="editAndAddField()">{{ $t('autoCode.addField') }}</el-button>
</div>
<el-table :data="form.fields">
<el-table-column align="left" type="index" label="序列" width="100" />
<el-table-column align="left" prop="fieldName" label="Field名" />
<el-table-column align="left" prop="fieldDesc" label="中文名" />
<el-table-column align="left" prop="fieldJson" label="FieldJson" />
<el-table-column align="left" prop="fieldType" label="Field数据类型" width="130" />
<el-table-column align="left" prop="dataTypeLong" label="数据库字段长度" width="130" />
<el-table-column align="left" prop="columnName" label="数据库字段" width="130" />
<el-table-column align="left" prop="comment" label="数据库字段描述" width="130" />
<el-table-column align="left" prop="fieldSearchType" label="搜索条件" width="130" />
<el-table-column align="left" prop="dictType" label="字典" width="130" />
<el-table-column align="left" label="操作" width="300">
<el-table-column align="left" type="index" :label="$t('autoCode.fieldIndex')" width="100" />
<el-table-column align="left" prop="fieldName" :label="$t('autoCode.fieldName')" width="120" />
<el-table-column align="left" prop="fieldDesc" :label="$t('autoCode.fieldDesc')" width="120" />
<el-table-column align="left" prop="fieldJson" :label="$t('autoCode.fieldJson')" width="110" />
<el-table-column align="left" prop="fieldType" :label="$t('autoCode.fieldDataType')" width="130" />
<el-table-column align="left" prop="dataTypeLong" :label="$t('autoCode.fieldLen')" width="130" />
<el-table-column align="left" prop="columnName" :label="$t('autoCode.columnName')" width="130" />
<el-table-column align="left" prop="comment" :label="$t('autoCode.comment')" width="130" />
<el-table-column align="left" prop="fieldSearchType" :label="$t('autoCode.searchType')" width="130" />
<el-table-column align="left" prop="dictType" :label="$t('autoCode.dictionary')" width="130" />
<el-table-column align="left" :lable="$t('general.operations')" width="300">
<template #default="scope">
<el-button
size="mini"
type="text"
icon="edit"
@click="editAndAddField(scope.row)"
>编辑</el-button>
>{{ $t('general.edit') }}</el-button>
<el-button
size="mini"
type="text"
:disabled="scope.$index === 0"
@click="moveUpField(scope.$index)"
>上移</el-button>
>{{ $t('autoCode.moveUp') }}</el-button>
<el-button
size="mini"
type="text"
:disabled="(scope.$index + 1) === form.fields.length"
@click="moveDownField(scope.$index)"
>下移</el-button>
>{{ $t('autoCode.moveDown') }}</el-button>
<el-popover :visible="scope.row.visible" placement="top">
<p>确定删除吗?</p>
<p>{{ $t('autoCode.confirmDelete') }}</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="deleteField(scope.$index)">确定</el-button>
<el-button size="mini" type="text" @click="scope.row.visible = false">{{ $t('general.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="deleteField(scope.$index)">{{ $t('general.confirm') }}</el-button>
</div>
<template #reference>
<el-button size="mini" type="text" icon="delete">删除</el-button>
<el-button size="mini" type="text" icon="delete">{{ $t('general.delete') }}</el-button>
</template>
</el-popover>
</template>
@@ -132,17 +132,17 @@
</el-table>
<!-- 组件列表 -->
<div class="gva-btn-list justify-content-flex-end auto-btn-list">
<el-button size="mini" type="primary" @click="enterForm(true)">预览代码</el-button>
<el-button size="mini" type="primary" @click="enterForm(false)">生成代码</el-button>
<el-button size="mini" type="primary" @click="enterForm(true)">{{ $t('autoCode.codePreview') }}</el-button>
<el-button size="mini" type="primary" @click="enterForm(false)">{{ $t('autoCode.generateCode') }}</el-button>
</div>
</div>
<!-- 组件弹窗 -->
<el-dialog v-model="dialogFlag" title="组件内容">
<el-dialog v-model="dialogFlag" :title="$t('autoCode.componentContent')">
<FieldDialog v-if="dialogFlag" ref="fieldDialog" :dialog-middle="dialogMiddle" />
<template #footer>
<div class="dialog-footer">
<el-button size="mini" @click="closeDialog">取 消</el-button>
<el-button size="mini" type="primary" @click="enterDialog">确 定</el-button>
<el-button size="mini" @click="closeDialog">{{ $t('general.close') }}</el-button>
<el-button size="mini" type="primary" @click="enterDialog">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -150,15 +150,15 @@
<el-dialog v-model="previewFlag">
<template #title>
<div class="previewCodeTool">
<p>操作栏:</p>
<el-button size="mini" type="primary" @click="selectText">全选</el-button>
<el-button size="mini" type="primary" @click="copy">复制</el-button>
<p>{{ $t('autoCode.actionBar') }}</p>
<el-button size="mini" type="primary" @click="selectText">{{ $t('general.selectAll') }}</el-button>
<el-button size="mini" type="primary" @click="copy">{{ $t('autoCode.copy') }}</el-button>
</div>
</template>
<PreviewCodeDialog v-if="previewFlag" ref="preview" :preview-code="preViewCode" />
<template #footer>
<div class="dialog-footer" style="padding-top:14px;padding-right:14px">
<el-button size="small" type="primary" @click="previewFlag = false">确 定</el-button>
<el-button size="small" type="primary" @click="previewFlag = false">{{ $t('general.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@@ -215,18 +215,18 @@ export default {
},
rules: {
structName: [
{ required: true, message: '请输入结构体名称', trigger: 'blur' }
{ required: true, message: this.$t('autoCode.entStructName'), trigger: 'blur' }
],
abbreviation: [
{ required: true, message: '请输入结构体简称', trigger: 'blur' }
{ required: true, message: this.$t('autoCode.entStructAbbreviation'), trigger: 'blur' }
],
description: [
{ required: true, message: '请输入结构体描述', trigger: 'blur' }
{ required: true, message: this.$t('autoCode.entStructDesc'), trigger: 'blur' }
],
packageName: [
{
required: true,
message: '文件名称:sysXxxxXxxx',
message: this.$t('autoCode.entFileName'),
trigger: 'blur'
}
]
@@ -311,7 +311,7 @@ export default {
if (this.form.fields.length <= 0) {
this.$message({
type: 'error',
message: '请填写至少一个field'
message: this.$t('autoCode.errNoFields')
})
return false
}
@@ -320,7 +320,7 @@ export default {
) {
this.$message({
type: 'error',
message: '存在与结构体同名的字段'
message: this.$t('autoCode.errSameFiledName')
})
return false
}
@@ -336,7 +336,7 @@ export default {
if (this.form.structName === this.form.abbreviation) {
this.$message({
type: 'error',
message: 'structName和struct简称不能相同'
message: this.$t('autoCode.errSameStructDescAbbr')
})
return false
}
@@ -353,13 +353,13 @@ export default {
if (this.form.autoMoveFile) {
this.$message({
type: 'success',
message: '自动化代码创建成功,自动移动成功'
message: this.$t('autoCode.codeGenMoveSuccess')
})
return
}
this.$message({
type: 'success',
message: '自动化代码创建成功,正在下载'
message: this.$t('autoCode.codeGenDownload')
})
}
const blob = new Blob([data])
@@ -407,7 +407,7 @@ export default {
this.form.tableName = this.dbform.tableName
this.form.packageName = tbHump
this.form.abbreviation = tbHump
this.form.description = tbHump + '表'
this.form.description = tbHump + this.$t('autoCode.table')
this.form.autoCreateApiToSql = true
this.form.fields = []
res.data.columns &&
@@ -416,7 +416,7 @@ export default {
const fbHump = toHump(item.columnName)
this.form.fields.push({
fieldName: toUpperCase(fbHump),
fieldDesc: item.columnComment || fbHump + '字段',
fieldDesc: item.columnComment || fbHump + this.$t('autoCode.field'),
fieldType: this.fdMap[item.dataType],
dataType: item.dataType,
fieldJson: fbHump,
@@ -2,7 +2,7 @@
<div>
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button size="mini" type="primary" icon="plus" @click="goAutoCode(null)">新增</el-button>
<el-button size="mini" type="primary" icon="plus" @click="goAutoCode(null)">{{ $t('general.add') }}</el-button>
</div>
<el-table :data="tableData">
<el-table-column
@@ -10,13 +10,13 @@
width="55"
/>
<el-table-column align="left" label="id" width="60" prop="ID" />
<el-table-column align="left" label="日期" width="180">
<el-table-column align="left" :label="$t('general.date')" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
<el-table-column align="left" label="结构体名" min-width="150" prop="structName" />
<el-table-column align="left" label="结构体描述" min-width="150" prop="structCNName" />
<el-table-column align="left" label="表名称" min-width="150" prop="tableName" />
<el-table-column align="left" label="回滚标记" min-width="150" prop="flag">
<el-table-column align="left" :label="$t('autoCode.structName')" min-width="150" prop="structName" />
<el-table-column align="left" :label="$t('autoCode.structChineseName')" min-width="150" prop="structCNName" />
<el-table-column align="left" :label="$t('autoCode.tableName')" min-width="150" prop="tableName" />
<el-table-column align="left" :label="$t('autoCodeAdmin.rollBackMark')" min-width="150" prop="flag">
<template #default="scope">
<el-tag
v-if="scope.row.flag"
@@ -24,7 +24,7 @@
size="mini"
effect="dark"
>
已回滚
{{ $t('autoCodeAdmin.rolledBack') }}
</el-tag>
<el-tag
v-else
@@ -32,16 +32,16 @@
type="success"
effect="dark"
>
未回滚
{{ $t('autoCodeAdmin.notRolledBack') }}
</el-tag>
</template>
</el-table-column>
<el-table-column align="left" label="操作" min-width="180">
<el-table-column align="left" :lable="$t('general.operations')" min-width="180">
<template #default="scope">
<div>
<el-button size="mini" type="text" :disabled="scope.row.flag === 1" @click="rollback(scope.row)">回滚</el-button>
<el-button size="mini" type="text" @click="goAutoCode(scope.row)">复用</el-button>
<el-button size="mini" type="text" @click="deleteRow(scope.row)">删除</el-button>
<el-button size="mini" type="text" :disabled="scope.row.flag === 1" @click="rollback(scope.row)">{{ $t('autoCodeAdmin.rollBack') }}</el-button>
<el-button size="mini" type="text" @click="goAutoCode(scope.row)">{{ $t('autoCodeAdmin.reuse') }}</el-button>
<el-button size="mini" type="text" @click="deleteRow(scope.row)">{{ $t('general.delete') }}</el-button>
</div>
</template>
</el-table-column>
@@ -79,27 +79,27 @@ export default {
},
methods: {
async deleteRow(row) {
this.$confirm('此操作将删除本历史, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(this.$t('autoCodeAdmin.deleteHistoryConfirm'), this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
}).then(async() => {
const res = await delSysHistory({ id: Number(row.ID) })
if (res.code === 0) {
this.$message.success('删除成功')
this.$message.success(this.$t('general.deleteSuccess'))
this.getTableData()
}
})
},
async rollback(row) {
this.$confirm('此操作将删除自动创建的文件和api, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(this.$t('autoCodeAdmin.rollbackConfirm'), this.$t('general.hint'), {
confirmButtonText: this.$t('general.confirm'),
cancelButtonText: this.$t('general.cancel'),
type: 'warning'
}).then(async() => {
const res = await rollback({ id: Number(row.ID) })
if (res.code === 0) {
this.$message.success('回滚成功')
this.$message.success(this.$t('autoCodeAdmin.rollbackSuccess'))
this.getTableData()
}
})
+29 -30
View File
@@ -3,21 +3,21 @@
<el-form ref="form" :model="config" label-width="240px">
<!-- System start -->
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse-item title="系统配置" name="1">
<el-form-item label="环境值">
<el-collapse-item :title="$t('system.systemConfig')" name="1">
<el-form-item :label="$t('system.envValues')">
<el-input v-model="config.system.env" />
</el-form-item>
<el-form-item label="端口值">
<el-form-item :label="$t('system.portValue')">
<el-input v-model.number="config.system.addr" />
</el-form-item>
<el-form-item label="数据库类型">
<el-select v-model="config.system.dbType" style="width:100%">
<el-option value="mysql" />
<el-option value="pgsql" />
<el-form-item :label="$t('init.dbType')">
<el-select v-model="config.system.dbType" style="width: 100%">
<el-option value="MySQL" />
<el-option value="PostgreSQL" />
</el-select>
</el-form-item>
<el-form-item label="Oss类型">
<el-select v-model="config.system.ossType" style="width:100%">
<el-form-item :label="$t('system.ossType')">
<el-select v-model="config.system.ossType" style="width: 100%">
<el-option value="local" />
<el-option value="qiniu" />
<el-option value="tencent-cos" />
@@ -25,8 +25,8 @@
<el-option value="huawei-obs" />
</el-select>
</el-form-item>
<el-form-item label="多点登录拦截">
<el-checkbox v-model="config.system.useMultipoint">开启</el-checkbox>
<el-form-item :label="$t('system.multiLogin')">
<el-checkbox v-model="config.system.useMultipoint">{{ $t('general.enable') }}</el-checkbox>
</el-form-item>
<el-form-item label="限流次数">
<el-input-number v-model.number="config.system.iplimitCount" />
@@ -208,7 +208,7 @@
<el-input v-model="config.qiniu.imgPath" />
</el-form-item>
<el-form-item label="是否使用https">
<el-checkbox v-model="config.qiniu.useHttps">开启</el-checkbox>
<el-checkbox v-model="config.qiniu.useHttps">{{ $t('general.enable') }}</el-checkbox>
</el-form-item>
<el-form-item label="accessKey">
<el-input v-model="config.qiniu.accessKey" />
@@ -217,7 +217,7 @@
<el-input v-model="config.qiniu.secretKey" />
</el-form-item>
<el-form-item label="上传是否使用CDN上传加速">
<el-checkbox v-model="config.qiniu.useCdnDomains">开启</el-checkbox>
<el-checkbox v-model="config.qiniu.useCdnDomains">{{ $t('general.enable') }}</el-checkbox>
</el-form-item>
</template>
<template v-if="config.system.ossType === 'tencent-cos'">
@@ -277,7 +277,6 @@
<el-input v-model="config.huaWeiObs.secretKey" />
</el-form-item>
</template>
</el-collapse-item>
<el-collapse-item title="Excel上传配置" name="11">
@@ -335,9 +334,9 @@
<el-form-item label="Spec(CRON表达式)">
<el-input v-model="config.timer.spec" />
</el-form-item>
<template v-for="(item,k) in config.timer.detail">
<div v-for="(key,k2) in item" :key="k2">
<el-form-item :key="k+k2" :label="k2">
<template v-for="(item, k) in config.timer.detail">
<div v-for="(key, k2) in item" :key="k2">
<el-form-item :key="k + k2" :label="k2">
<el-input v-model="item[k2]" />
</el-form-item>
</div>
@@ -377,9 +376,9 @@ export default {
local: {},
email: {},
timer: {
detail: {}
}
}
detail: {},
},
},
}
},
async created() {
@@ -398,7 +397,7 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '配置文件设置成功'
message: '配置文件设置成功',
})
await this.initForm()
}
@@ -408,24 +407,24 @@ export default {
if (res.code === 0) {
this.$message({
type: 'success',
message: '邮件发送成功'
message: '邮件发送成功',
})
await this.initForm()
} else {
this.$message({
type: 'error',
message: '邮件发送失败'
message: '邮件发送失败',
})
}
}
}
},
},
}
</script>
<style lang="scss">
.system {
background: #fff;
padding:36px;
padding: 36px;
border-radius: 2px;
h2 {
padding: 10px;
@@ -433,11 +432,11 @@ export default {
font-size: 16px;
box-shadow: -4px 0px 0px 0px #e7e8e8;
}
::v-deep(.el-input-number__increase){
top:5px !important;
::v-deep(.el-input-number__increase) {
top: 5px !important;
}
.gva-btn-list{
margin-top:16px;
.gva-btn-list {
margin-top: 16px;
}
}
</style>
+86 -78
View File
@@ -7,86 +7,94 @@ import * as dotenv from 'dotenv'
import * as fs from 'fs'
import vuePlugin from '@vitejs/plugin-vue'
// @see https://cn.vitejs.dev/config/
// import vueI18n from '@intlify/vite-plugin-vue-i18n'
const vueI18n = require('@intlify/vite-plugin-vue-i18n').default // added by mohamed hassan to support multilanguage
export default ({
command,
mode
command,
mode
}) => {
const NODE_ENV = process.env.NODE_ENV || 'development'
const envFiles = [
`.env.${NODE_ENV}`
]
for (const file of envFiles) {
const envConfig = dotenv.parse(fs.readFileSync(file))
for (const k in envConfig) {
process.env[k] = envConfig[k]
const NODE_ENV = process.env.NODE_ENV || 'development'
const envFiles = [
`.env.${NODE_ENV}`
]
for (const file of envFiles) {
const envConfig = dotenv.parse(fs.readFileSync(file))
for (const k in envConfig) {
process.env[k] = envConfig[k]
}
}
viteLogo(process.env)
const timestamp = Date.parse(new Date())
const rollupOptions = {
output: {
entryFileNames: `gva/gin-vue-admin-[name].${timestamp}.js`,
chunkFileNames: `js/gin-vue-admin-[name].${timestamp}.js`,
assetFileNames: `assets/gin-vue-admin-[name].${timestamp}.[ext]`
}
}
const optimizeDeps = {}
const alias = {
'@': path.resolve(__dirname, './src'),
'vue$': 'vue/dist/vue.runtime.esm-bundler.js',
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.svg'],
}
const esbuild = {}
return {
base: './', // index.html文件所在位置
root: './', // js导入的资源路径,src
resolve: {
alias,
},
define: {
'process.env': {}
},
server: {
open: true,
port: process.env.VITE_CLI_PORT,
proxy: {
// 把key的路径代理到target位置
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VITE_BASE_API]: { // 需要代理的路径 例如 '/api'
target: `${process.env.VITE_BASE_PATH}:${process.env.VITE_SERVER_PORT}/`, // 代理到 目标路径
changeOrigin: true,
rewrite: path => path.replace(new RegExp('^' + process.env.VITE_BASE_API), ''),
}
}
viteLogo(process.env)
const timestamp = Date.parse(new Date())
const rollupOptions = {
output: {
entryFileNames: `gva/gin-vue-admin-[name].${timestamp}.js`,
chunkFileNames: `js/gin-vue-admin-[name].${timestamp}.js`,
assetFileNames: `assets/gin-vue-admin-[name].${timestamp}.[ext]`
},
},
build: {
target: 'es2015',
minify: 'terser', // 是否进行压缩,boolean | 'terser' | 'esbuild',默认使用terser
manifest: false, // 是否产出maifest.json
sourcemap: false, // 是否产出soucemap.json
outDir: 'dist', // 产出目录
rollupOptions,
},
esbuild,
optimizeDeps,
plugins: [
vueI18n({
include: path.resolve(__dirname, './src/locales/**')
}),
legacyPlugin({
targets: ['Android > 39', 'Chrome >= 60', 'Safari >= 10.1', 'iOS >= 10.3', 'Firefox >= 54', 'Edge >= 15'],
}), vuePlugin(), [Banner(`\n Build based on gin-vue-admin \n Time : ${timestamp}`)]
],
css: {
preprocessorOptions: {
less: {
// 支持内联 JavaScript
javascriptEnabled: true,
}
}
}
const optimizeDeps = {}
const alias = {
'@': path.resolve(__dirname, './src'),
'vue$': 'vue/dist/vue.runtime.esm-bundler.js',
}
const esbuild = {}
return {
base: './', // index.html文件所在位置
root: './', // js导入的资源路径,src
resolve: {
alias,
},
define: {
'process.env': {}
},
server: {
open: true,
port: process.env.VITE_CLI_PORT,
proxy: {
// 把key的路径代理到target位置
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VITE_BASE_API]: { // 需要代理的路径 例如 '/api'
target: `${process.env.VITE_BASE_PATH}:${process.env.VITE_SERVER_PORT}/`, // 代理到 目标路径
changeOrigin: true,
rewrite: path => path.replace(new RegExp('^' + process.env.VITE_BASE_API), ''),
}
},
},
build: {
target: 'es2015',
minify: 'terser', // 是否进行压缩,boolean | 'terser' | 'esbuild',默认使用terser
manifest: false, // 是否产出maifest.json
sourcemap: false, // 是否产出soucemap.json
outDir: 'dist', // 产出目录
rollupOptions,
},
esbuild,
optimizeDeps,
plugins: [
legacyPlugin({
targets: ['Android > 39', 'Chrome >= 60', 'Safari >= 10.1', 'iOS >= 10.3', 'Firefox >= 54', 'Edge >= 15'],
}), vuePlugin(), [Banner(`\n Build based on gin-vue-admin \n Time : ${timestamp}`)]
],
css: {
preprocessorOptions: {
less: {
// 支持内联 JavaScript
javascriptEnabled: true,
}
}
},
}
}
}
}