@ -0,0 +1,22 @@ |
||||
# 告诉EditorConfig插件,这是根文件,不用继续往上查找 |
||||
root = true |
||||
|
||||
# 匹配全部文件 |
||||
[*] |
||||
# 设置字符集 |
||||
charset = utf-8 |
||||
# 缩进风格,可选space、tab |
||||
indent_style = space |
||||
# 缩进的空格数 |
||||
indent_size = 2 |
||||
# 结尾换行符,可选lf、cr、crlf |
||||
end_of_line = lf |
||||
# 在文件结尾插入新行 |
||||
insert_final_newline = true |
||||
# 删除一行中的前后空格 |
||||
trim_trailing_whitespace = true |
||||
|
||||
# 匹配md结尾的文件 |
||||
[*.md] |
||||
insert_final_newline = false |
||||
trim_trailing_whitespace = false |
@ -0,0 +1,11 @@ |
||||
# 页面标题 |
||||
VUE_APP_TITLE = 对嘛管理系统 |
||||
|
||||
# 开发环境配置 |
||||
ENV = 'development' |
||||
|
||||
# 对嘛管理系统/开发环境 |
||||
VUE_APP_BASE_API = '/dev-api' |
||||
|
||||
# 路由懒加载 |
||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true |
@ -0,0 +1,8 @@ |
||||
# 页面标题 |
||||
VUE_APP_TITLE = 对嘛管理系统 |
||||
|
||||
# 生产环境配置 |
||||
ENV = 'production' |
||||
|
||||
# 对嘛管理系统/生产环境 |
||||
VUE_APP_BASE_API = '/prod-api' |
@ -0,0 +1,10 @@ |
||||
# 页面标题 |
||||
VUE_APP_TITLE = 对嘛管理系统 |
||||
|
||||
NODE_ENV = production |
||||
|
||||
# 测试环境配置 |
||||
ENV = 'staging' |
||||
|
||||
# 对嘛管理系统/测试环境 |
||||
VUE_APP_BASE_API = '/stage-api' |
@ -0,0 +1,11 @@ |
||||
# 忽略dist目录下类型为js的文件的语法检查 |
||||
dist |
||||
# 忽略src/assets目录下文件的语法检查 |
||||
src/static |
||||
# 忽略public目录下文件的语法检查 |
||||
public |
||||
# # 忽略当前目录下为js的文件的语法检查 |
||||
# *.js |
||||
# # 忽略当前目录下为vue的文件的语法检查 |
||||
# *.vue |
||||
node_modules |
@ -0,0 +1,10 @@ |
||||
# 忽略build目录下类型为js的文件的语法检查 |
||||
build/*.js |
||||
# 忽略src/assets目录下文件的语法检查 |
||||
src/assets |
||||
# 忽略public目录下文件的语法检查 |
||||
public |
||||
# 忽略当前目录下为js的文件的语法检查 |
||||
*.js |
||||
# 忽略当前目录下为vue的文件的语法检查 |
||||
*.vue |
@ -0,0 +1,295 @@ |
||||
// ESlint 检查配置
|
||||
module.exports = { |
||||
root: true, // 将ESLint限制到当前配置文件所在的目录下
|
||||
parserOptions: { |
||||
parser: 'babel-eslint', |
||||
sourceType: 'module' // 设置"script"(默认)或"module"如果你的代码是在ECMAScript中的模块。
|
||||
}, |
||||
// 指定脚本的运行环境。每种环境都有一组特定的预定义全局变量
|
||||
env: { |
||||
browser: true, |
||||
node: true, |
||||
es6: true |
||||
}, |
||||
// 添加全局变量
|
||||
globals: { |
||||
uni: 'readonly', |
||||
wx: 'readonly' |
||||
}, |
||||
extends: ['plugin:vue/recommended', 'eslint:recommended'], // 使用的默认的规则集
|
||||
|
||||
// 约束规则
|
||||
// it is base on https://github.com/vuejs/eslint-config-vue
|
||||
rules: { |
||||
'vue/max-attributes-per-line': [ |
||||
2, |
||||
{ |
||||
singleline: 10, // 当开始标签位于单行时,每行的最大属性数
|
||||
// 当开始标签位于多行时,每行的最大属性数
|
||||
multiline: { |
||||
max: 1, |
||||
allowFirstLine: false |
||||
} |
||||
} |
||||
], |
||||
'vue/singleline-html-element-content-newline': 'off', // 在单行元素的内容之前和之后需要换行符
|
||||
'vue/multiline-html-element-content-newline': 'off', // 在多行元素的内容之前和之后需要换行符
|
||||
'vue/name-property-casing': ['error', 'PascalCase'], // 为 Vue 组件中的 name 属性强制使用特定大小写(PascalCase | kebab-case)
|
||||
'vue/no-v-html': 'off', // 禁止使用 v-html 来防止 XSS 攻击
|
||||
'accessor-pairs': 2, // 强制 getter 和 setter 在对象中成对出现
|
||||
// 在箭头函数中的箭头前后强制保持一致的间距
|
||||
'arrow-spacing': [ |
||||
2, |
||||
{ |
||||
before: true, |
||||
after: true |
||||
} |
||||
], |
||||
'block-spacing': [2, 'always'], // 禁止或强制在代码块中开括号前和闭括号后有空格
|
||||
// 强制在代码块中使用一致的大括号风格
|
||||
'brace-style': [ |
||||
2, |
||||
'1tbs', |
||||
{ |
||||
allowSingleLine: true // 允许一个块打开和关闭括号在同一行上
|
||||
} |
||||
], |
||||
// 强制使用骆驼拼写法命名约定
|
||||
camelcase: [ |
||||
0, |
||||
{ |
||||
properties: 'always' |
||||
} |
||||
], |
||||
'comma-dangle': [2, 'never'], // 要求或禁止末尾逗号(当前禁止)
|
||||
// 在逗号前后强制保持一致的间距
|
||||
'comma-spacing': [ |
||||
2, |
||||
{ |
||||
before: false, |
||||
after: true |
||||
} |
||||
], |
||||
'comma-style': [2, 'last'], // 强制使用一致的逗号样式
|
||||
'constructor-super': 2, // 要求在构造函数中有 super() 的调用
|
||||
curly: [2, 'multi-line'], // 强制所有控制语句使用一致的括号风格
|
||||
'dot-location': [2, 'property'], // 在点之前和之后执行一致的换行符
|
||||
'eol-last': 2, // 要求或禁止文件末尾存在空行
|
||||
eqeqeq: ['error', 'always', { null: 'ignore' }], // 要求使用 === 和 !==
|
||||
// 强制 generator 函数中 * 号周围使用一致的空格
|
||||
'generator-star-spacing': [ |
||||
2, |
||||
{ |
||||
before: true, |
||||
after: true |
||||
} |
||||
], |
||||
'handle-callback-err': [2, '^(err|error)$'], // 要求回调函数中有容错处理
|
||||
// 强制使用一致的缩进
|
||||
indent: [ |
||||
2, |
||||
2, |
||||
{ |
||||
SwitchCase: 1 |
||||
} |
||||
], |
||||
'jsx-quotes': [2, 'prefer-single'], // 强制在 JSX 属性中一致地使用双引号或单引号
|
||||
// 强制在对象字面量的属性中键和值之间使用一致的间距
|
||||
'key-spacing': [ |
||||
2, |
||||
{ |
||||
beforeColon: false, |
||||
afterColon: true |
||||
} |
||||
], |
||||
// 强制在关键字前后使用一致的空格
|
||||
'keyword-spacing': [ |
||||
2, |
||||
{ |
||||
before: true, |
||||
after: true |
||||
} |
||||
], |
||||
// 要求构造函数首字母大写
|
||||
'new-cap': [ |
||||
2, |
||||
{ |
||||
newIsCap: true, |
||||
capIsNew: false |
||||
} |
||||
], |
||||
'new-parens': 2, // 强制或禁止调用无参构造函数时有圆括号
|
||||
'no-array-constructor': 2, // 禁用 Array 构造函数
|
||||
'no-caller': 2, // 禁用 arguments.caller 或 arguments.callee
|
||||
'no-console': 'off', // 禁用 console
|
||||
'no-class-assign': 2, // 禁止修改类声明的变量
|
||||
'no-cond-assign': 2, // 禁止条件表达式中出现赋值操作符
|
||||
'no-const-assign': 2, // 禁止修改 const 声明的变量
|
||||
'no-control-regex': 0, // 禁止在正则表达式中使用控制字符
|
||||
'no-delete-var': 2, // 禁止删除变量
|
||||
'no-dupe-args': 2, // 禁止 function 定义中出现重名参数
|
||||
'no-dupe-class-members': 2, // 禁止类成员中出现重复的名称
|
||||
'no-dupe-keys': 2, // 禁止对象字面量中出现重复的 key
|
||||
'no-duplicate-case': 2, // 禁止出现重复的 case 标签
|
||||
'no-empty-character-class': 2, // 禁止在正则表达式中使用空字符集
|
||||
'no-empty-pattern': 2, // 禁止使用空解构模式
|
||||
'no-eval': 2, // 禁用 eval()
|
||||
'no-ex-assign': 2, // 禁止对 catch 子句的参数重新赋值
|
||||
'no-extend-native': 2, // 禁止扩展原生类型
|
||||
'no-extra-bind': 2, // 禁止不必要的 .bind() 调用
|
||||
'no-extra-boolean-cast': 2, // 禁止不必要的布尔转换
|
||||
'no-extra-parens': [2, 'functions'], // 禁止不必要的括号
|
||||
'no-fallthrough': 2, // 禁止 case 语句落空
|
||||
'no-floating-decimal': 2, // 禁止数字字面量中使用前导和末尾小数点
|
||||
'no-func-assign': 2, // 禁止对 function 声明重新赋值
|
||||
'no-implied-eval': 2, // 禁用隐式的eval()
|
||||
'no-inner-declarations': [2, 'functions'], // 禁止在嵌套的块中出现变量声明或 function 声明
|
||||
'no-invalid-regexp': 2, // 禁止 RegExp 构造函数中存在无效的正则表达式字符串
|
||||
'no-irregular-whitespace': 2, // 禁止不规则的空白
|
||||
'no-iterator': 2, // 禁用 __iterator__ 属性
|
||||
'no-label-var': 2, // 不允许标签与变量同名
|
||||
// 禁用标签语句
|
||||
'no-labels': [ |
||||
2, |
||||
{ |
||||
allowLoop: true, |
||||
allowSwitch: false |
||||
} |
||||
], |
||||
'no-lone-blocks': 2, // 禁用不必要的嵌套块
|
||||
'no-mixed-spaces-and-tabs': 2, // 禁止空格和 tab 的混合缩进
|
||||
'no-multi-spaces': 2, // 禁止使用多个空格
|
||||
'no-multi-str': 2, // 禁止多行字符串
|
||||
// 禁止出现多行空行
|
||||
'no-multiple-empty-lines': [ |
||||
2, |
||||
{ |
||||
max: 1 |
||||
} |
||||
], |
||||
'no-native-reassign': 2, // 不允许修改只读全局变量
|
||||
'no-negated-in-lhs': 2, // 禁止对关系运算符 in 的左操作数使用否定操作符(!)
|
||||
'no-new-object': 2, // 不允许使用Object构造函数
|
||||
'no-new-require': 2, // 禁止调用 require 时使用 new 操作符
|
||||
'no-new-symbol': 2, // 禁止new Symbol
|
||||
'no-new-wrappers': 2, // 禁止对 String,Number 和 Boolean 使用 new 操作符
|
||||
'no-obj-calls': 2, // 禁止把全局对象作为函数调用
|
||||
'no-octal': 2, // 禁用八进制字面量
|
||||
'no-octal-escape': 2, // 禁止在字符串字面量中使用八进制转义序列
|
||||
'no-path-concat': 2, // 禁止对 __dirname 和 __filename 进行字符串连接
|
||||
'no-proto': 2, // 禁用 __proto__ 属性
|
||||
'no-redeclare': 2, // 禁止多次声明同一变量
|
||||
'no-regex-spaces': 2, // 禁止正则表达式字面量中出现多个空格
|
||||
'no-return-assign': [2, 'except-parens'], // 禁止在 return 语句中使用赋值语句
|
||||
'no-self-assign': 2, // 禁止自我赋值
|
||||
'no-self-compare': 2, // 禁止自身比较
|
||||
'no-sequences': 2, // 禁用逗号操作符
|
||||
'no-shadow-restricted-names': 2, // 禁止将标识符定义为受限的名字
|
||||
'no-spaced-func': 2, // 要求或禁止在函数标识符和其调用之间有空格
|
||||
'no-sparse-arrays': 2, // 禁用稀疏数组
|
||||
'no-this-before-super': 2, // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
|
||||
'no-throw-literal': 2, // 禁止抛出异常字面量
|
||||
'no-trailing-spaces': 2, // 禁用行尾空格
|
||||
'no-undef': 2, // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
|
||||
'no-undef-init': 2, // 禁止将变量初始化为 undefined
|
||||
'no-unexpected-multiline': 2, // 不允许混淆多行表达式
|
||||
'no-unmodified-loop-condition': 2, // 该规则查找循环条件内的引用,然后检查这些引用的变量是否在循环中被修改
|
||||
// 当存在更简单的选择时,此规则不允许三元运算符
|
||||
'no-unneeded-ternary': [ |
||||
2, |
||||
{ |
||||
defaultAssignment: false |
||||
} |
||||
], |
||||
'no-unreachable': 2, // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
|
||||
'no-unsafe-finally': 2, // 禁止在 finally 语句块中出现控制流语句
|
||||
// 禁止出现未使用的变量,函数和函数的参数
|
||||
'no-unused-vars': [ |
||||
2, |
||||
{ |
||||
vars: 'all', |
||||
args: 'none' |
||||
} |
||||
], |
||||
'no-useless-call': 2, // 禁止不必要的 .call() 和 .apply()
|
||||
'no-useless-computed-key': 2, // 禁止在对象中使用不必要的计算属性键
|
||||
'no-useless-constructor': 2, // 禁用不必要的构造函数
|
||||
'no-useless-escape': 0, // 禁用不必要的转义字符
|
||||
'no-whitespace-before-property': 2, // 如果对象的属性位于同一行上,则该规则不允许围绕点或在开头括号之前留出空白。当对象和属性位于不同的行上时,此规则允许使用空格,因为向更长的属性链添加换行符是很常见的
|
||||
'no-with': 2, // 禁用 with 语句
|
||||
// 使用同一个关键字声明多个变量时要么在同一行声明要么都换行声明。这条规则在变量声明周围执行一致的换行符。这条规则忽略了for循环条件中的变量声明
|
||||
'one-var': [ |
||||
2, |
||||
{ |
||||
initialized: 'never' |
||||
} |
||||
], |
||||
// 强制操作符使用一致的换行符
|
||||
'operator-linebreak': [ |
||||
2, |
||||
'after', |
||||
{ |
||||
overrides: { |
||||
'?': 'before', |
||||
':': 'before' |
||||
} |
||||
} |
||||
], |
||||
'padded-blocks': [2, 'never'], // 要求或禁止块内填充
|
||||
// 强制一致使用反引号,双引号或单引号
|
||||
quotes: [ |
||||
2, |
||||
'single', |
||||
{ |
||||
avoidEscape: true, |
||||
allowTemplateLiterals: true |
||||
} |
||||
], |
||||
semi: [2, 'always'], // 要求或禁止使用分号
|
||||
// 强制分号之前和之后使用一致的空格
|
||||
'semi-spacing': [ |
||||
2, |
||||
{ |
||||
before: false, |
||||
after: true |
||||
} |
||||
], |
||||
'space-before-blocks': [2, 'always'], // 强制在块之前使用一致的空格
|
||||
'space-before-function-paren': 'off', // 强制在 function的左括号之前使用一致的空格(当前关闭)
|
||||
'space-in-parens': [2, 'never'], // 强制在圆括号内使用一致的空格
|
||||
'space-infix-ops': 2, // 要求操作符周围有空格
|
||||
// 强制在一元操作符前后使用一致的空格
|
||||
'space-unary-ops': [ |
||||
2, |
||||
{ |
||||
words: true, |
||||
nonwords: false |
||||
} |
||||
], |
||||
// 强制在注释中 // 或 /* 使用一致的空格
|
||||
'spaced-comment': [ |
||||
2, |
||||
'always', |
||||
{ |
||||
markers: ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] |
||||
} |
||||
], |
||||
'template-curly-spacing': [2, 'never'], // 要求或禁止模板字符串中的嵌入表达式周围空格的使用
|
||||
'use-isnan': 2, // 要求使用 isNaN() 检查 NaN
|
||||
'valid-typeof': 2, // 强制 typeof 表达式与有效的字符串进行比较
|
||||
'wrap-iife': [2, 'any'], // 该规则要求所有立即调用的函数表达式都包含在圆括号中
|
||||
'yield-star-spacing': [2, 'both'], // 此规则强制执行*周围 yield*表达式的间距
|
||||
yoda: [2, 'never'], // 这条规则旨在强制执行一种将变量与文字值进行比较的一致条件样式
|
||||
'prefer-const': 2, // 要求使用 const 声明那些声明后不再被修改的变量
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 禁用 debugger
|
||||
// 此规则在对象文字的大括号内执行一致的间距,解构赋值和导入/导出说明符
|
||||
'object-curly-spacing': [ |
||||
2, |
||||
'always', |
||||
{ |
||||
objectsInObjects: false |
||||
} |
||||
], |
||||
'array-bracket-spacing': [2, 'never'] // 该规则在数组括号内强制实现一致的间距
|
||||
} |
||||
}; |
@ -0,0 +1,199 @@ |
||||
// ESlint 检查配置
|
||||
module.exports = { |
||||
root: true, |
||||
parserOptions: { |
||||
parser: 'babel-eslint', |
||||
sourceType: 'module' |
||||
}, |
||||
env: { |
||||
browser: true, |
||||
node: true, |
||||
es6: true, |
||||
}, |
||||
extends: ['plugin:vue/recommended', 'eslint:recommended'], |
||||
|
||||
// add your custom rules here
|
||||
//it is base on https://github.com/vuejs/eslint-config-vue
|
||||
rules: { |
||||
"vue/max-attributes-per-line": [2, { |
||||
"singleline": 10, |
||||
"multiline": { |
||||
"max": 1, |
||||
"allowFirstLine": false |
||||
} |
||||
}], |
||||
"vue/singleline-html-element-content-newline": "off", |
||||
"vue/multiline-html-element-content-newline":"off", |
||||
"vue/name-property-casing": ["error", "PascalCase"], |
||||
"vue/no-v-html": "off", |
||||
'accessor-pairs': 2, |
||||
'arrow-spacing': [2, { |
||||
'before': true, |
||||
'after': true |
||||
}], |
||||
'block-spacing': [2, 'always'], |
||||
'brace-style': [2, '1tbs', { |
||||
'allowSingleLine': true |
||||
}], |
||||
'camelcase': [0, { |
||||
'properties': 'always' |
||||
}], |
||||
'comma-dangle': [2, 'never'], |
||||
'comma-spacing': [2, { |
||||
'before': false, |
||||
'after': true |
||||
}], |
||||
'comma-style': [2, 'last'], |
||||
'constructor-super': 2, |
||||
'curly': [2, 'multi-line'], |
||||
'dot-location': [2, 'property'], |
||||
'eol-last': 2, |
||||
'eqeqeq': ["error", "always", {"null": "ignore"}], |
||||
'generator-star-spacing': [2, { |
||||
'before': true, |
||||
'after': true |
||||
}], |
||||
'handle-callback-err': [2, '^(err|error)$'], |
||||
'indent': [2, 2, { |
||||
'SwitchCase': 1 |
||||
}], |
||||
'jsx-quotes': [2, 'prefer-single'], |
||||
'key-spacing': [2, { |
||||
'beforeColon': false, |
||||
'afterColon': true |
||||
}], |
||||
'keyword-spacing': [2, { |
||||
'before': true, |
||||
'after': true |
||||
}], |
||||
'new-cap': [2, { |
||||
'newIsCap': true, |
||||
'capIsNew': false |
||||
}], |
||||
'new-parens': 2, |
||||
'no-array-constructor': 2, |
||||
'no-caller': 2, |
||||
'no-console': 'off', |
||||
'no-class-assign': 2, |
||||
'no-cond-assign': 2, |
||||
'no-const-assign': 2, |
||||
'no-control-regex': 0, |
||||
'no-delete-var': 2, |
||||
'no-dupe-args': 2, |
||||
'no-dupe-class-members': 2, |
||||
'no-dupe-keys': 2, |
||||
'no-duplicate-case': 2, |
||||
'no-empty-character-class': 2, |
||||
'no-empty-pattern': 2, |
||||
'no-eval': 2, |
||||
'no-ex-assign': 2, |
||||
'no-extend-native': 2, |
||||
'no-extra-bind': 2, |
||||
'no-extra-boolean-cast': 2, |
||||
'no-extra-parens': [2, 'functions'], |
||||
'no-fallthrough': 2, |
||||
'no-floating-decimal': 2, |
||||
'no-func-assign': 2, |
||||
'no-implied-eval': 2, |
||||
'no-inner-declarations': [2, 'functions'], |
||||
'no-invalid-regexp': 2, |
||||
'no-irregular-whitespace': 2, |
||||
'no-iterator': 2, |
||||
'no-label-var': 2, |
||||
'no-labels': [2, { |
||||
'allowLoop': false, |
||||
'allowSwitch': false |
||||
}], |
||||
'no-lone-blocks': 2, |
||||
'no-mixed-spaces-and-tabs': 2, |
||||
'no-multi-spaces': 2, |
||||
'no-multi-str': 2, |
||||
'no-multiple-empty-lines': [2, { |
||||
'max': 1 |
||||
}], |
||||
'no-native-reassign': 2, |
||||
'no-negated-in-lhs': 2, |
||||
'no-new-object': 2, |
||||
'no-new-require': 2, |
||||
'no-new-symbol': 2, |
||||
'no-new-wrappers': 2, |
||||
'no-obj-calls': 2, |
||||
'no-octal': 2, |
||||
'no-octal-escape': 2, |
||||
'no-path-concat': 2, |
||||
'no-proto': 2, |
||||
'no-redeclare': 2, |
||||
'no-regex-spaces': 2, |
||||
'no-return-assign': [2, 'except-parens'], |
||||
'no-self-assign': 2, |
||||
'no-self-compare': 2, |
||||
'no-sequences': 2, |
||||
'no-shadow-restricted-names': 2, |
||||
'no-spaced-func': 2, |
||||
'no-sparse-arrays': 2, |
||||
'no-this-before-super': 2, |
||||
'no-throw-literal': 2, |
||||
'no-trailing-spaces': 2, |
||||
'no-undef': 2, |
||||
'no-undef-init': 2, |
||||
'no-unexpected-multiline': 2, |
||||
'no-unmodified-loop-condition': 2, |
||||
'no-unneeded-ternary': [2, { |
||||
'defaultAssignment': false |
||||
}], |
||||
'no-unreachable': 2, |
||||
'no-unsafe-finally': 2, |
||||
'no-unused-vars': [2, { |
||||
'vars': 'all', |
||||
'args': 'none' |
||||
}], |
||||
'no-useless-call': 2, |
||||
'no-useless-computed-key': 2, |
||||
'no-useless-constructor': 2, |
||||
'no-useless-escape': 0, |
||||
'no-whitespace-before-property': 2, |
||||
'no-with': 2, |
||||
'one-var': [2, { |
||||
'initialized': 'never' |
||||
}], |
||||
'operator-linebreak': [2, 'after', { |
||||
'overrides': { |
||||
'?': 'before', |
||||
':': 'before' |
||||
} |
||||
}], |
||||
'padded-blocks': [2, 'never'], |
||||
'quotes': [2, 'single', { |
||||
'avoidEscape': true, |
||||
'allowTemplateLiterals': true |
||||
}], |
||||
'semi': [2, 'never'], |
||||
'semi-spacing': [2, { |
||||
'before': false, |
||||
'after': true |
||||
}], |
||||
'space-before-blocks': [2, 'always'], |
||||
'space-before-function-paren': [2, 'never'], |
||||
'space-in-parens': [2, 'never'], |
||||
'space-infix-ops': 2, |
||||
'space-unary-ops': [2, { |
||||
'words': true, |
||||
'nonwords': false |
||||
}], |
||||
'spaced-comment': [2, 'always', { |
||||
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] |
||||
}], |
||||
'template-curly-spacing': [2, 'never'], |
||||
'use-isnan': 2, |
||||
'valid-typeof': 2, |
||||
'wrap-iife': [2, 'any'], |
||||
'yield-star-spacing': [2, 'both'], |
||||
'yoda': [2, 'never'], |
||||
'prefer-const': 2, |
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, |
||||
'object-curly-spacing': [2, 'always', { |
||||
objectsInObjects: false |
||||
}], |
||||
'array-bracket-spacing': [2, 'never'] |
||||
} |
||||
} |
@ -0,0 +1,46 @@ |
||||
{ |
||||
"printWidth": 150, |
||||
"singleQuote": true, |
||||
"trailingComma": "none", |
||||
"semi": true, |
||||
"tabWidth": 2, |
||||
"useTabs": false, |
||||
"bracketSpacing": true, |
||||
"jsxBracketSameLine": false, |
||||
"arrowParens": "always", |
||||
"proseWrap": "preserve", |
||||
"overrides": [ |
||||
{ |
||||
"files": ["*.json", ".eslintrc", ".tslintrc", ".prettierrc", ".tern-project"], |
||||
"options": { |
||||
"parser": "json", |
||||
"tabWidth": 2 |
||||
} |
||||
}, |
||||
{ |
||||
"files": "*.{css,sass,scss,less}", |
||||
"options": { |
||||
"parser": "css", |
||||
"tabWidth": 2 |
||||
} |
||||
}, |
||||
{ |
||||
"files": "*.ts", |
||||
"options": { |
||||
"parser": "typescript" |
||||
} |
||||
}, |
||||
{ |
||||
"files": "*.vue", |
||||
"options": { |
||||
"parser": "vue" |
||||
} |
||||
}, |
||||
{ |
||||
"files": "*.md", |
||||
"options": { |
||||
"parser": "markdown" |
||||
} |
||||
} |
||||
] |
||||
} |
@ -1,3 +1,41 @@ |
||||
# dm-manage-web |
||||
## 开发 |
||||
|
||||
管理系统PC前端 |
||||
``` bash |
||||
# 全局配置 如全局变量、全局方法、全局自定义组件,请于 src/global文件夹中维护 |
||||
|
||||
1. 使用 element-ui时,单一项目的规则相对固定,如需修改element组件默认属性,请前往src/global/element.js中修改 |
||||
例:所有的日期时间组件,单一项目中默认都取 'yyyy-MM-dd' 格式,可配置成 |
||||
Element.DatePicker.props.format = { type: String, default: "yyyy-MM-dd" }; |
||||
Element.DatePicker.props.valueFormat = { type: String, default: "yyyy-MM-dd" }; |
||||
|
||||
2. 全局css存储与src/assets/styles文件夹中 |
||||
单项目全局自定义class样式建议在ruoyi.scss中修改 |
||||
单项目全局原生组件class样式,建议在index.scss中修改 |
||||
使用 element-ui时,单一项目的样式主体相对统一,如需修改,可在element-variables.scss中修改 |
||||
菜单栏样式可在variables.scss中修改 |
||||
element-ui原生组件样式全局修改,建议于element-ui.scss中修改 |
||||
|
||||
3. 工具方法,存储于src/utils文件夹中 |
||||
开发中可按需引入工具方法 |
||||
|
||||
# 指令使用 |
||||
v-jtrim 去除输入框输入的所有空格 |
||||
v-jclick 点击节流 |
||||
|
||||
# 混入使用 |
||||
类似后端继承,可继承属性和方法,在单页面中引用后,可重写覆盖 |
||||
|
||||
``` |
||||
|
||||
## 标准 |
||||
1. `icon`使用 |
||||
* `element-ui`自带的用`icon` |
||||
* 非自带的用`svg-icon` |
||||
2. 标准页面参考`base -> basePage` |
||||
3. 标准组件参考`base -> components` |
||||
4. 启用`eslint` |
||||
* `Strings must use singlequote` |
||||
* `Attribute "key" should go before "prop"` |
||||
* `Attribute "v-jclick" should go before "type"` |
||||
* `Expected '===' and instead saw '=='` |
||||
* `'params' is never reassigned. Use 'const' instead` |
@ -0,0 +1,13 @@ |
||||
module.exports = { |
||||
presets: [ |
||||
// https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
|
||||
'@vue/cli-plugin-babel/preset' |
||||
], |
||||
'env': { |
||||
'development': { |
||||
// babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
|
||||
// This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
|
||||
'plugins': ['dynamic-import-node'] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
@echo off |
||||
echo. |
||||
echo [信息] 打包Web工程,生成dist文件。 |
||||
echo. |
||||
|
||||
%~d0 |
||||
cd %~dp0 |
||||
|
||||
cd .. |
||||
npm run build:prod |
||||
|
||||
pause |
@ -0,0 +1,12 @@ |
||||
@echo off |
||||
echo. |
||||
echo [信息] 安装Web工程,生成node_modules文件。 |
||||
echo. |
||||
|
||||
%~d0 |
||||
cd %~dp0 |
||||
|
||||
cd .. |
||||
npm install --registry=https://registry.npmmirror.com |
||||
|
||||
pause |
@ -0,0 +1,12 @@ |
||||
@echo off |
||||
echo. |
||||
echo [信息] 使用 Vue CLI 命令运行 Web 工程。 |
||||
echo. |
||||
|
||||
%~d0 |
||||
cd %~dp0 |
||||
|
||||
cd .. |
||||
npm run dev |
||||
|
||||
pause |
@ -0,0 +1,35 @@ |
||||
const { run } = require('runjs') |
||||
const chalk = require('chalk') |
||||
const config = require('../vue.config.js') |
||||
const rawArgv = process.argv.slice(2) |
||||
const args = rawArgv.join(' ') |
||||
|
||||
if (process.env.npm_config_preview || rawArgv.includes('--preview')) { |
||||
const report = rawArgv.includes('--report') |
||||
|
||||
run(`vue-cli-service build ${args}`) |
||||
|
||||
const port = 9526 |
||||
const publicPath = config.publicPath |
||||
|
||||
var connect = require('connect') |
||||
var serveStatic = require('serve-static') |
||||
const app = connect() |
||||
|
||||
app.use( |
||||
publicPath, |
||||
serveStatic('./dist', { |
||||
index: ['index.html', '/'] |
||||
}) |
||||
) |
||||
|
||||
app.listen(port, function () { |
||||
console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) |
||||
if (report) { |
||||
console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) |
||||
} |
||||
|
||||
}) |
||||
} else { |
||||
run(`vue-cli-service build ${args}`) |
||||
} |
@ -0,0 +1,76 @@ |
||||
{ |
||||
"name": "river", |
||||
"version": "1.0.0", |
||||
"description": "对嘛管理系统", |
||||
"author": "对嘛", |
||||
"license": "MIT", |
||||
"scripts": { |
||||
"dev": "vue-cli-service serve", |
||||
"build:prod": "vue-cli-service build", |
||||
"build:stage": "vue-cli-service build --mode staging", |
||||
"preview": "node build/index.js --preview", |
||||
"lint": "eslint --ext .js,.vue src" |
||||
}, |
||||
"husky": { |
||||
"hooks": { |
||||
"pre-commit": "lint-staged" |
||||
} |
||||
}, |
||||
"lint-staged": { |
||||
"src/**/*.{js,vue}": ["eslint --fix", "git add"] |
||||
}, |
||||
"keywords": ["vue", "admin", "dashboard", "element-ui", "boilerplate", "admin-template", "management-system"], |
||||
"repository": { |
||||
"type": "git", |
||||
"url": "https://gitee.com/y_project/RuoYi-Vue.git" |
||||
}, |
||||
"dependencies": { |
||||
"@riophae/vue-treeselect": "0.4.0", |
||||
"axios": "0.24.0", |
||||
"clipboard": "2.0.8", |
||||
"core-js": "3.25.3", |
||||
"echarts": "4.9.0", |
||||
"element-ui": "2.15.10", |
||||
"file-saver": "2.0.5", |
||||
"fuse.js": "6.4.3", |
||||
"highlight.js": "9.18.5", |
||||
"js-beautify": "1.13.0", |
||||
"js-cookie": "3.0.1", |
||||
"jsencrypt": "3.0.0-rc.1", |
||||
"nprogress": "0.2.0", |
||||
"quill": "1.3.7", |
||||
"screenfull": "5.0.2", |
||||
"sortablejs": "1.10.2", |
||||
"vue": "2.6.12", |
||||
"vue-count-to": "1.0.13", |
||||
"vue-cropper": "0.5.5", |
||||
"vue-meta": "2.4.0", |
||||
"vue-router": "3.4.9", |
||||
"vuedraggable": "2.24.3", |
||||
"vuex": "3.6.0" |
||||
}, |
||||
"devDependencies": { |
||||
"@vue/cli-plugin-babel": "4.4.6", |
||||
"@vue/cli-plugin-eslint": "4.4.6", |
||||
"@vue/cli-service": "4.4.6", |
||||
"babel-eslint": "10.1.0", |
||||
"babel-plugin-dynamic-import-node": "2.3.3", |
||||
"chalk": "4.1.0", |
||||
"compression-webpack-plugin": "5.0.2", |
||||
"connect": "3.6.6", |
||||
"eslint": "7.15.0", |
||||
"eslint-plugin-vue": "7.2.0", |
||||
"lint-staged": "10.5.3", |
||||
"runjs": "4.4.2", |
||||
"sass": "1.32.13", |
||||
"sass-loader": "10.1.1", |
||||
"script-ext-html-webpack-plugin": "2.1.5", |
||||
"svg-sprite-loader": "5.1.1", |
||||
"vue-template-compiler": "2.6.12" |
||||
}, |
||||
"engines": { |
||||
"node": ">=8.9", |
||||
"npm": ">= 3.0.0" |
||||
}, |
||||
"browserslist": ["> 1%", "last 2 versions"] |
||||
} |
After Width: | Height: | Size: 5.5 KiB |
@ -0,0 +1,208 @@ |
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
||||
<meta name="renderer" content="webkit"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> |
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
||||
<title><%= webpackConfig.name %></title> |
||||
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> |
||||
<style> |
||||
html, |
||||
body, |
||||
#app { |
||||
height: 100%; |
||||
margin: 0px; |
||||
padding: 0px; |
||||
} |
||||
.chromeframe { |
||||
margin: 0.2em 0; |
||||
background: #ccc; |
||||
color: #000; |
||||
padding: 0.2em 0; |
||||
} |
||||
|
||||
#loader-wrapper { |
||||
position: fixed; |
||||
top: 0; |
||||
left: 0; |
||||
width: 100%; |
||||
height: 100%; |
||||
z-index: 999999; |
||||
} |
||||
|
||||
#loader { |
||||
display: block; |
||||
position: relative; |
||||
left: 50%; |
||||
top: 50%; |
||||
width: 150px; |
||||
height: 150px; |
||||
margin: -75px 0 0 -75px; |
||||
border-radius: 50%; |
||||
border: 3px solid transparent; |
||||
border-top-color: #FFF; |
||||
-webkit-animation: spin 2s linear infinite; |
||||
-ms-animation: spin 2s linear infinite; |
||||
-moz-animation: spin 2s linear infinite; |
||||
-o-animation: spin 2s linear infinite; |
||||
animation: spin 2s linear infinite; |
||||
z-index: 1001; |
||||
} |
||||
|
||||
#loader:before { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 5px; |
||||
left: 5px; |
||||
right: 5px; |
||||
bottom: 5px; |
||||
border-radius: 50%; |
||||
border: 3px solid transparent; |
||||
border-top-color: #FFF; |
||||
-webkit-animation: spin 3s linear infinite; |
||||
-moz-animation: spin 3s linear infinite; |
||||
-o-animation: spin 3s linear infinite; |
||||
-ms-animation: spin 3s linear infinite; |
||||
animation: spin 3s linear infinite; |
||||
} |
||||
|
||||
#loader:after { |
||||
content: ""; |
||||
position: absolute; |
||||
top: 15px; |
||||
left: 15px; |
||||
right: 15px; |
||||
bottom: 15px; |
||||
border-radius: 50%; |
||||
border: 3px solid transparent; |
||||
border-top-color: #FFF; |
||||
-moz-animation: spin 1.5s linear infinite; |
||||
-o-animation: spin 1.5s linear infinite; |
||||
-ms-animation: spin 1.5s linear infinite; |
||||
-webkit-animation: spin 1.5s linear infinite; |
||||
animation: spin 1.5s linear infinite; |
||||
} |
||||
|
||||
|
||||
@-webkit-keyframes spin { |
||||
0% { |
||||
-webkit-transform: rotate(0deg); |
||||
-ms-transform: rotate(0deg); |
||||
transform: rotate(0deg); |
||||
} |
||||
100% { |
||||
-webkit-transform: rotate(360deg); |
||||
-ms-transform: rotate(360deg); |
||||
transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
@keyframes spin { |
||||
0% { |
||||
-webkit-transform: rotate(0deg); |
||||
-ms-transform: rotate(0deg); |
||||
transform: rotate(0deg); |
||||
} |
||||
100% { |
||||
-webkit-transform: rotate(360deg); |
||||
-ms-transform: rotate(360deg); |
||||
transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
|
||||
#loader-wrapper .loader-section { |
||||
position: fixed; |
||||
top: 0; |
||||
width: 51%; |
||||
height: 100%; |
||||
background: #7171C6; |
||||
z-index: 1000; |
||||
-webkit-transform: translateX(0); |
||||
-ms-transform: translateX(0); |
||||
transform: translateX(0); |
||||
} |
||||
|
||||
#loader-wrapper .loader-section.section-left { |
||||
left: 0; |
||||
} |
||||
|
||||
#loader-wrapper .loader-section.section-right { |
||||
right: 0; |
||||
} |
||||
|
||||
|
||||
.loaded #loader-wrapper .loader-section.section-left { |
||||
-webkit-transform: translateX(-100%); |
||||
-ms-transform: translateX(-100%); |
||||
transform: translateX(-100%); |
||||
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
||||
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
||||
} |
||||
|
||||
.loaded #loader-wrapper .loader-section.section-right { |
||||
-webkit-transform: translateX(100%); |
||||
-ms-transform: translateX(100%); |
||||
transform: translateX(100%); |
||||
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
||||
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
||||
} |
||||
|
||||
.loaded #loader { |
||||
opacity: 0; |
||||
-webkit-transition: all 0.3s ease-out; |
||||
transition: all 0.3s ease-out; |
||||
} |
||||
|
||||
.loaded #loader-wrapper { |
||||
visibility: hidden; |
||||
-webkit-transform: translateY(-100%); |
||||
-ms-transform: translateY(-100%); |
||||
transform: translateY(-100%); |
||||
-webkit-transition: all 0.3s 1s ease-out; |
||||
transition: all 0.3s 1s ease-out; |
||||
} |
||||
|
||||
.no-js #loader-wrapper { |
||||
display: none; |
||||
} |
||||
|
||||
.no-js h1 { |
||||
color: #222222; |
||||
} |
||||
|
||||
#loader-wrapper .load_title { |
||||
font-family: 'Open Sans'; |
||||
color: #FFF; |
||||
font-size: 19px; |
||||
width: 100%; |
||||
text-align: center; |
||||
z-index: 9999999999999; |
||||
position: absolute; |
||||
top: 60%; |
||||
opacity: 1; |
||||
line-height: 30px; |
||||
} |
||||
|
||||
#loader-wrapper .load_title span { |
||||
font-weight: normal; |
||||
font-style: italic; |
||||
font-size: 13px; |
||||
color: #FFF; |
||||
opacity: 0.5; |
||||
} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<div id="app"> |
||||
<div id="loader-wrapper"> |
||||
<div id="loader"></div> |
||||
<div class="loader-section section-left"></div> |
||||
<div class="loader-section section-right"></div> |
||||
<div class="load_title">正在加载系统资源,请耐心等待</div> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,2 @@ |
||||
User-agent: * |
||||
Disallow: / |
@ -0,0 +1,28 @@ |
||||
<template> |
||||
<div id="app"> |
||||
<router-view /> |
||||
<theme-picker /> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import ThemePicker from '@/components/ThemePicker'; |
||||
|
||||
export default { |
||||
name: 'App', |
||||
components: { ThemePicker }, |
||||
metaInfo() { |
||||
return { |
||||
title: this.$store.state.settings.dynamicTitle && this.$store.state.settings.title, |
||||
titleTemplate: (title) => { |
||||
return title ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE; |
||||
} |
||||
}; |
||||
} |
||||
}; |
||||
</script> |
||||
<style scoped> |
||||
#app .theme-picker { |
||||
display: none; |
||||
} |
||||
</style> |
@ -0,0 +1,32 @@ |
||||
import request from '@/utils/request'; |
||||
|
||||
export default { |
||||
pageList(data = {}) { |
||||
return request({ |
||||
url: '', |
||||
method: 'POST', |
||||
data |
||||
}); |
||||
}, |
||||
insert(data = {}) { |
||||
return request({ |
||||
url: '', |
||||
method: 'POST', |
||||
data |
||||
}); |
||||
}, |
||||
update(data = {}) { |
||||
return request({ |
||||
url: '', |
||||
method: 'POST', |
||||
data |
||||
}); |
||||
}, |
||||
remove(data = {}) { |
||||
return request({ |
||||
url: '', |
||||
method: 'POST', |
||||
params: data |
||||
}); |
||||
} |
||||
}; |
@ -0,0 +1,59 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 登录方法
|
||||
export function login(username, password, code, uuid) { |
||||
const data = { |
||||
username, |
||||
password, |
||||
code, |
||||
uuid |
||||
} |
||||
return request({ |
||||
url: '/login', |
||||
headers: { |
||||
isToken: false |
||||
}, |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 注册方法
|
||||
export function register(data) { |
||||
return request({ |
||||
url: '/register', |
||||
headers: { |
||||
isToken: false |
||||
}, |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 获取用户详细信息
|
||||
export function getInfo() { |
||||
return request({ |
||||
url: '/getInfo', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 退出方法
|
||||
export function logout() { |
||||
return request({ |
||||
url: '/logout', |
||||
method: 'post' |
||||
}) |
||||
} |
||||
|
||||
// 获取验证码
|
||||
export function getCodeImg() { |
||||
return request({ |
||||
url: '/captchaImage', |
||||
headers: { |
||||
isToken: false |
||||
}, |
||||
method: 'get', |
||||
timeout: 20000 |
||||
}) |
||||
} |
@ -0,0 +1,9 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 获取路由
|
||||
export const getRouters = () => { |
||||
return request({ |
||||
url: '/getRouters', |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,57 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询缓存详细
|
||||
export function getCache() { |
||||
return request({ |
||||
url: '/monitor/cache', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 查询缓存名称列表
|
||||
export function listCacheName() { |
||||
return request({ |
||||
url: '/monitor/cache/getNames', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 查询缓存键名列表
|
||||
export function listCacheKey(cacheName) { |
||||
return request({ |
||||
url: '/monitor/cache/getKeys/' + cacheName, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 查询缓存内容
|
||||
export function getCacheValue(cacheName, cacheKey) { |
||||
return request({ |
||||
url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 清理指定名称缓存
|
||||
export function clearCacheName(cacheName) { |
||||
return request({ |
||||
url: '/monitor/cache/clearCacheName/' + cacheName, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 清理指定键名缓存
|
||||
export function clearCacheKey(cacheKey) { |
||||
return request({ |
||||
url: '/monitor/cache/clearCacheKey/' + cacheKey, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 清理全部缓存
|
||||
export function clearCacheAll() { |
||||
return request({ |
||||
url: '/monitor/cache/clearCacheAll', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,71 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询定时任务调度列表
|
||||
export function listJob(query) { |
||||
return request({ |
||||
url: '/monitor/job/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询定时任务调度详细
|
||||
export function getJob(jobId) { |
||||
return request({ |
||||
url: '/monitor/job/' + jobId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增定时任务调度
|
||||
export function addJob(data) { |
||||
return request({ |
||||
url: '/monitor/job', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改定时任务调度
|
||||
export function updateJob(data) { |
||||
return request({ |
||||
url: '/monitor/job', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除定时任务调度
|
||||
export function delJob(jobId) { |
||||
return request({ |
||||
url: '/monitor/job/' + jobId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 任务状态修改
|
||||
export function changeJobStatus(jobId, status) { |
||||
const data = { |
||||
jobId, |
||||
status |
||||
} |
||||
return request({ |
||||
url: '/monitor/job/changeStatus', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
|
||||
// 定时任务立即执行一次
|
||||
export function runJob(jobId, jobGroup) { |
||||
const data = { |
||||
jobId, |
||||
jobGroup |
||||
} |
||||
return request({ |
||||
url: '/monitor/job/run', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
@ -0,0 +1,26 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询调度日志列表
|
||||
export function listJobLog(query) { |
||||
return request({ |
||||
url: '/monitor/jobLog/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 删除调度日志
|
||||
export function delJobLog(jobLogId) { |
||||
return request({ |
||||
url: '/monitor/jobLog/' + jobLogId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 清空调度日志
|
||||
export function cleanJobLog() { |
||||
return request({ |
||||
url: '/monitor/jobLog/clean', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,34 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询登录日志列表
|
||||
export function list(query) { |
||||
return request({ |
||||
url: '/monitor/logininfor/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 删除登录日志
|
||||
export function delLogininfor(infoId) { |
||||
return request({ |
||||
url: '/monitor/logininfor/' + infoId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 解锁用户登录状态
|
||||
export function unlockLogininfor(userName) { |
||||
return request({ |
||||
url: '/monitor/logininfor/unlock/' + userName, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 清空登录日志
|
||||
export function cleanLogininfor() { |
||||
return request({ |
||||
url: '/monitor/logininfor/clean', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,18 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询在线用户列表
|
||||
export function list(query) { |
||||
return request({ |
||||
url: '/monitor/online/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 强退用户
|
||||
export function forceLogout(tokenId) { |
||||
return request({ |
||||
url: '/monitor/online/' + tokenId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,26 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询操作日志列表
|
||||
export function list(query) { |
||||
return request({ |
||||
url: '/monitor/operlog/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 删除操作日志
|
||||
export function delOperlog(operId) { |
||||
return request({ |
||||
url: '/monitor/operlog/' + operId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 清空操作日志
|
||||
export function cleanOperlog() { |
||||
return request({ |
||||
url: '/monitor/operlog/clean', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,9 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 获取服务信息
|
||||
export function getServer() { |
||||
return request({ |
||||
url: '/monitor/server', |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,60 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询参数列表
|
||||
export function listConfig(query) { |
||||
return request({ |
||||
url: '/system/config/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询参数详细
|
||||
export function getConfig(configId) { |
||||
return request({ |
||||
url: '/system/config/' + configId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 根据参数键名查询参数值
|
||||
export function getConfigKey(configKey) { |
||||
return request({ |
||||
url: '/system/config/configKey/' + configKey, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增参数配置
|
||||
export function addConfig(data) { |
||||
return request({ |
||||
url: '/system/config', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改参数配置
|
||||
export function updateConfig(data) { |
||||
return request({ |
||||
url: '/system/config', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除参数配置
|
||||
export function delConfig(configId) { |
||||
return request({ |
||||
url: '/system/config/' + configId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 刷新参数缓存
|
||||
export function refreshCache() { |
||||
return request({ |
||||
url: '/system/config/refreshCache', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,52 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询部门列表
|
||||
export function listDept(query) { |
||||
return request({ |
||||
url: '/system/dept/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询部门列表(排除节点)
|
||||
export function listDeptExcludeChild(deptId) { |
||||
return request({ |
||||
url: '/system/dept/list/exclude/' + deptId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 查询部门详细
|
||||
export function getDept(deptId) { |
||||
return request({ |
||||
url: '/system/dept/' + deptId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增部门
|
||||
export function addDept(data) { |
||||
return request({ |
||||
url: '/system/dept', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改部门
|
||||
export function updateDept(data) { |
||||
return request({ |
||||
url: '/system/dept', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除部门
|
||||
export function delDept(deptId) { |
||||
return request({ |
||||
url: '/system/dept/' + deptId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,52 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询字典数据列表
|
||||
export function listData(query) { |
||||
return request({ |
||||
url: '/system/dict/data/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询字典数据详细
|
||||
export function getData(dictCode) { |
||||
return request({ |
||||
url: '/system/dict/data/' + dictCode, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 根据字典类型查询字典数据信息
|
||||
export function getDicts(dictType) { |
||||
return request({ |
||||
url: '/system/dict/data/type/' + dictType, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增字典数据
|
||||
export function addData(data) { |
||||
return request({ |
||||
url: '/system/dict/data', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改字典数据
|
||||
export function updateData(data) { |
||||
return request({ |
||||
url: '/system/dict/data', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除字典数据
|
||||
export function delData(dictCode) { |
||||
return request({ |
||||
url: '/system/dict/data/' + dictCode, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,60 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询字典类型列表
|
||||
export function listType(query) { |
||||
return request({ |
||||
url: '/system/dict/type/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询字典类型详细
|
||||
export function getType(dictId) { |
||||
return request({ |
||||
url: '/system/dict/type/' + dictId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增字典类型
|
||||
export function addType(data) { |
||||
return request({ |
||||
url: '/system/dict/type', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改字典类型
|
||||
export function updateType(data) { |
||||
return request({ |
||||
url: '/system/dict/type', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除字典类型
|
||||
export function delType(dictId) { |
||||
return request({ |
||||
url: '/system/dict/type/' + dictId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 刷新字典缓存
|
||||
export function refreshCache() { |
||||
return request({ |
||||
url: '/system/dict/type/refreshCache', |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 获取字典选择框列表
|
||||
export function optionselect() { |
||||
return request({ |
||||
url: '/system/dict/type/optionselect', |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,60 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询菜单列表
|
||||
export function listMenu(query) { |
||||
return request({ |
||||
url: '/system/menu/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询菜单详细
|
||||
export function getMenu(menuId) { |
||||
return request({ |
||||
url: '/system/menu/' + menuId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 查询菜单下拉树结构
|
||||
export function treeselect() { |
||||
return request({ |
||||
url: '/system/menu/treeselect', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 根据角色ID查询菜单下拉树结构
|
||||
export function roleMenuTreeselect(roleId) { |
||||
return request({ |
||||
url: '/system/menu/roleMenuTreeselect/' + roleId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增菜单
|
||||
export function addMenu(data) { |
||||
return request({ |
||||
url: '/system/menu', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改菜单
|
||||
export function updateMenu(data) { |
||||
return request({ |
||||
url: '/system/menu', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除菜单
|
||||
export function delMenu(menuId) { |
||||
return request({ |
||||
url: '/system/menu/' + menuId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,44 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询公告列表
|
||||
export function listNotice(query) { |
||||
return request({ |
||||
url: '/system/notice/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询公告详细
|
||||
export function getNotice(noticeId) { |
||||
return request({ |
||||
url: '/system/notice/' + noticeId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增公告
|
||||
export function addNotice(data) { |
||||
return request({ |
||||
url: '/system/notice', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改公告
|
||||
export function updateNotice(data) { |
||||
return request({ |
||||
url: '/system/notice', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除公告
|
||||
export function delNotice(noticeId) { |
||||
return request({ |
||||
url: '/system/notice/' + noticeId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,44 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询岗位列表
|
||||
export function listPost(query) { |
||||
return request({ |
||||
url: '/system/post/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询岗位详细
|
||||
export function getPost(postId) { |
||||
return request({ |
||||
url: '/system/post/' + postId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增岗位
|
||||
export function addPost(data) { |
||||
return request({ |
||||
url: '/system/post', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改岗位
|
||||
export function updatePost(data) { |
||||
return request({ |
||||
url: '/system/post', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除岗位
|
||||
export function delPost(postId) { |
||||
return request({ |
||||
url: '/system/post/' + postId, |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,119 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询角色列表
|
||||
export function listRole(query) { |
||||
return request({ |
||||
url: '/system/role/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询角色详细
|
||||
export function getRole(roleId) { |
||||
return request({ |
||||
url: '/system/role/' + roleId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增角色
|
||||
export function addRole(data) { |
||||
return request({ |
||||
url: '/system/role', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改角色
|
||||
export function updateRole(data) { |
||||
return request({ |
||||
url: '/system/role', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 角色数据权限
|
||||
export function dataScope(data) { |
||||
return request({ |
||||
url: '/system/role/dataScope', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 角色状态修改
|
||||
export function changeRoleStatus(roleId, status) { |
||||
const data = { |
||||
roleId, |
||||
status |
||||
} |
||||
return request({ |
||||
url: '/system/role/changeStatus', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除角色
|
||||
export function delRole(roleId) { |
||||
return request({ |
||||
url: '/system/role/' + roleId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 查询角色已授权用户列表
|
||||
export function allocatedUserList(query) { |
||||
return request({ |
||||
url: '/system/role/authUser/allocatedList', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询角色未授权用户列表
|
||||
export function unallocatedUserList(query) { |
||||
return request({ |
||||
url: '/system/role/authUser/unallocatedList', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 取消用户授权角色
|
||||
export function authUserCancel(data) { |
||||
return request({ |
||||
url: '/system/role/authUser/cancel', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 批量取消用户授权角色
|
||||
export function authUserCancelAll(data) { |
||||
return request({ |
||||
url: '/system/role/authUser/cancelAll', |
||||
method: 'put', |
||||
params: data |
||||
}) |
||||
} |
||||
|
||||
// 授权用户选择
|
||||
export function authUserSelectAll(data) { |
||||
return request({ |
||||
url: '/system/role/authUser/selectAll', |
||||
method: 'put', |
||||
params: data |
||||
}) |
||||
} |
||||
|
||||
// 根据角色ID查询部门树结构
|
||||
export function deptTreeSelect(roleId) { |
||||
return request({ |
||||
url: '/system/role/deptTree/' + roleId, |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,135 @@ |
||||
import request from '@/utils/request' |
||||
import { parseStrEmpty } from "@/utils/ruoyi"; |
||||
|
||||
// 查询用户列表
|
||||
export function listUser(query) { |
||||
return request({ |
||||
url: '/system/user/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询用户详细
|
||||
export function getUser(userId) { |
||||
return request({ |
||||
url: '/system/user/' + parseStrEmpty(userId), |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 新增用户
|
||||
export function addUser(data) { |
||||
return request({ |
||||
url: '/system/user', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 修改用户
|
||||
export function updateUser(data) { |
||||
return request({ |
||||
url: '/system/user', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 删除用户
|
||||
export function delUser(userId) { |
||||
return request({ |
||||
url: '/system/user/' + userId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 用户密码重置
|
||||
export function resetUserPwd(userId, password) { |
||||
const data = { |
||||
userId, |
||||
password |
||||
} |
||||
return request({ |
||||
url: '/system/user/resetPwd', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 用户状态修改
|
||||
export function changeUserStatus(userId, status) { |
||||
const data = { |
||||
userId, |
||||
status |
||||
} |
||||
return request({ |
||||
url: '/system/user/changeStatus', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 查询用户个人信息
|
||||
export function getUserProfile() { |
||||
return request({ |
||||
url: '/system/user/profile', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 修改用户个人信息
|
||||
export function updateUserProfile(data) { |
||||
return request({ |
||||
url: '/system/user/profile', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 用户密码重置
|
||||
export function updateUserPwd(oldPassword, newPassword) { |
||||
const data = { |
||||
oldPassword, |
||||
newPassword |
||||
} |
||||
return request({ |
||||
url: '/system/user/profile/updatePwd', |
||||
method: 'put', |
||||
params: data |
||||
}) |
||||
} |
||||
|
||||
// 用户头像上传
|
||||
export function uploadAvatar(data) { |
||||
return request({ |
||||
url: '/system/user/profile/avatar', |
||||
method: 'post', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 查询授权角色
|
||||
export function getAuthRole(userId) { |
||||
return request({ |
||||
url: '/system/user/authRole/' + userId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 保存授权角色
|
||||
export function updateAuthRole(data) { |
||||
return request({ |
||||
url: '/system/user/authRole', |
||||
method: 'put', |
||||
params: data |
||||
}) |
||||
} |
||||
|
||||
// 查询部门下拉树结构
|
||||
export function deptTreeSelect() { |
||||
return request({ |
||||
url: '/system/user/deptTree', |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,76 @@ |
||||
import request from '@/utils/request' |
||||
|
||||
// 查询生成表数据
|
||||
export function listTable(query) { |
||||
return request({ |
||||
url: '/tool/gen/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
// 查询db数据库列表
|
||||
export function listDbTable(query) { |
||||
return request({ |
||||
url: '/tool/gen/db/list', |
||||
method: 'get', |
||||
params: query |
||||
}) |
||||
} |
||||
|
||||
// 查询表详细信息
|
||||
export function getGenTable(tableId) { |
||||
return request({ |
||||
url: '/tool/gen/' + tableId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 修改代码生成信息
|
||||
export function updateGenTable(data) { |
||||
return request({ |
||||
url: '/tool/gen', |
||||
method: 'put', |
||||
data: data |
||||
}) |
||||
} |
||||
|
||||
// 导入表
|
||||
export function importTable(data) { |
||||
return request({ |
||||
url: '/tool/gen/importTable', |
||||
method: 'post', |
||||
params: data |
||||
}) |
||||
} |
||||
|
||||
// 预览生成代码
|
||||
export function previewTable(tableId) { |
||||
return request({ |
||||
url: '/tool/gen/preview/' + tableId, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 删除表数据
|
||||
export function delTable(tableId) { |
||||
return request({ |
||||
url: '/tool/gen/' + tableId, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
// 生成代码(自定义路径)
|
||||
export function genCode(tableName) { |
||||
return request({ |
||||
url: '/tool/gen/genCode/' + tableName, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
// 同步数据库
|
||||
export function synchDb(tableName) { |
||||
return request({ |
||||
url: '/tool/gen/synchDb/' + tableName, |
||||
method: 'get' |
||||
}) |
||||
} |
After Width: | Height: | Size: 160 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 4.7 KiB |
@ -0,0 +1,9 @@ |
||||
import Vue from 'vue' |
||||
import SvgIcon from '@/components/SvgIcon'// svg component
|
||||
|
||||
// register globally
|
||||
Vue.component('svg-icon', SvgIcon) |
||||
|
||||
const req = require.context('./svg', false, /\.svg$/) |
||||
const requireAll = requireContext => requireContext.keys().map(requireContext) |
||||
requireAll(req) |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 954 B |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 179 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 971 B |
After Width: | Height: | Size: 732 B |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 418 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 356 B |
After Width: | Height: | Size: 724 B |
After Width: | Height: | Size: 818 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 347 B |
After Width: | Height: | Size: 497 B |
After Width: | Height: | Size: 459 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 944 B |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 421 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 320 B |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 744 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 285 B |
After Width: | Height: | Size: 1017 B |
After Width: | Height: | Size: 444 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 669 B |
After Width: | Height: | Size: 335 B |
After Width: | Height: | Size: 883 B |
After Width: | Height: | Size: 821 B |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 731 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.2 KiB |