Commit 6664949d by 初志鑫

prettier代码格式重新配置

parent d134f932
......@@ -10,6 +10,7 @@ module.exports = {
bracketSpacing: true,
jsxBracketSameLine: false,
arrowParens: "always",
vueIndentScriptAndStyle: false,
htmlWhitespaceSensitivity: "ignore",
vueIndentScriptAndStyle: true,
endOfLine: "lf",
};
......@@ -5,8 +5,8 @@
</template>
<script>
export default {
name: "App",
mounted() {},
};
export default {
name: "App",
mounted() {},
};
</script>
......@@ -7,105 +7,105 @@
</template>
<script>
import CodeMirror from "codemirror";
import "codemirror/addon/lint/lint.css";
import "codemirror/lib/codemirror.css";
import "codemirror/theme/rubyblue.css";
import "codemirror/mode/javascript/javascript";
import "codemirror/addon/lint/lint";
import "codemirror/addon/lint/json-lint";
import CodeMirror from "codemirror";
import "codemirror/addon/lint/lint.css";
import "codemirror/lib/codemirror.css";
import "codemirror/theme/rubyblue.css";
import "codemirror/mode/javascript/javascript";
import "codemirror/addon/lint/lint";
import "codemirror/addon/lint/json-lint";
require("script-loader!jsonlint");
require("script-loader!jsonlint");
export default {
name: "JsonEditor",
props: {
value: {
type: [Array, Object],
default: () => {
return null;
export default {
name: "JsonEditor",
props: {
value: {
type: [Array, Object],
default: () => {
return null;
},
},
},
},
data() {
return {
jsonEditor: false,
};
},
watch: {
value(value) {
const editorValue = this.jsonEditor.getValue();
if (editorValue) {
this.$emit("change", editorValue);
} else {
this.$baseMessage("JSON不能为空,否则无法生成表格", "error");
}
if (value !== editorValue) {
this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
}
data() {
return {
jsonEditor: false,
};
},
},
mounted() {
this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {
lineNumbers: true,
mode: "application/json",
gutters: ["CodeMirror-lint-markers"],
theme: "rubyblue",
lint: true,
});
watch: {
value(value) {
const editorValue = this.jsonEditor.getValue();
this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
this.jsonEditor.on("change", (cm) => {
if (this.isJsonString(cm.getValue())) {
this.$emit("change", cm.getValue());
}
});
},
methods: {
getValue() {
return this.jsonEditor.getValue();
if (editorValue) {
this.$emit("change", editorValue);
} else {
this.$baseMessage("JSON不能为空,否则无法生成表格", "error");
}
if (value !== editorValue) {
this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
}
},
},
isJsonString(str) {
try {
if (typeof JSON.parse(str) == "object") {
return true;
mounted() {
this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {
lineNumbers: true,
mode: "application/json",
gutters: ["CodeMirror-lint-markers"],
theme: "rubyblue",
lint: true,
});
this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
this.jsonEditor.on("change", (cm) => {
if (this.isJsonString(cm.getValue())) {
this.$emit("change", cm.getValue());
}
} catch (e) {}
return false;
});
},
methods: {
getValue() {
return this.jsonEditor.getValue();
},
isJsonString(str) {
try {
if (typeof JSON.parse(str) == "object") {
return true;
}
} catch (e) {}
return false;
},
},
},
};
};
</script>
<style scoped>
.json-editor {
position: relative;
height: 100%;
}
.json-editor {
position: relative;
height: 100%;
}
.json-editor >>> .CodeMirror {
height: auto;
min-height: calc(100vh - 220px);
}
.json-editor >>> .CodeMirror {
height: auto;
min-height: calc(100vh - 220px);
}
.json-editor >>> .CodeMirror-scroll {
min-height: calc(100vh - 220px);
}
.json-editor >>> .CodeMirror-scroll {
min-height: calc(100vh - 220px);
}
.json-editor >>> .cm-s-rubyblue span.cm-string {
color: #f08047;
}
.json-editor >>> .cm-s-rubyblue span.cm-string {
color: #f08047;
}
.json-editor >>> .cm-s-rubyblue .CodeMirror-gutters {
padding-right: 10px;
.json-editor >>> .cm-s-rubyblue .CodeMirror-gutters {
padding-right: 10px;
/* background: transparent; */
border-right: 1px solid #fff;
}
/* background: transparent; */
border-right: 1px solid #fff;
}
.json-editor >>> .cm-s-rubyblue.CodeMirror {
/* background: #08233e; */
color: white;
}
.json-editor >>> .cm-s-rubyblue.CodeMirror {
/* background: #08233e; */
color: white;
}
</style>
......@@ -31,168 +31,168 @@
</template>
<script>
export default {
name: "SelectTreeTemplate",
props: {
/* 树形结构数据 */
treeOptions: {
type: Array,
default: () => {
return [];
export default {
name: "SelectTreeTemplate",
props: {
/* 树形结构数据 */
treeOptions: {
type: Array,
default: () => {
return [];
},
},
},
/* 单选/多选 */
selectType: {
type: String,
default: () => {
return "single";
/* 单选/多选 */
selectType: {
type: String,
default: () => {
return "single";
},
},
},
/* 初始选中值key */
selectedKey: {
type: String,
default: () => {
return "";
/* 初始选中值key */
selectedKey: {
type: String,
default: () => {
return "";
},
},
},
/* 初始选中值name */
selectedValue: {
type: String,
default: () => {
return "";
/* 初始选中值name */
selectedValue: {
type: String,
default: () => {
return "";
},
},
},
/* 可做选择的层级 */
selectLevel: {
type: [String, Number],
default: () => {
return "";
/* 可做选择的层级 */
selectLevel: {
type: [String, Number],
default: () => {
return "";
},
},
},
/* 可清空选项 */
clearable: {
type: Boolean,
default: () => {
return true;
/* 可清空选项 */
clearable: {
type: Boolean,
default: () => {
return true;
},
},
},
},
data() {
return {
defaultProps: {
children: "children",
label: "name",
},
defaultSelectedKeys: [], //初始选中值数组
currentNodeKey: this.selectedKey,
selectValue:
this.selectType == "multiple"
? this.selectedValue.split(",")
: this.selectedValue, //下拉框选中值label
selectKey:
this.selectType == "multiple"
? this.selectedKey.split(",")
: this.selectedKey, //下拉框选中值value
};
},
mounted() {
const that = this;
this.initTree();
},
methods: {
// 初始化树的值
initTree() {
data() {
return {
defaultProps: {
children: "children",
label: "name",
},
defaultSelectedKeys: [], //初始选中值数组
currentNodeKey: this.selectedKey,
selectValue:
this.selectType == "multiple"
? this.selectedValue.split(",")
: this.selectedValue, //下拉框选中值label
selectKey:
this.selectType == "multiple"
? this.selectedKey.split(",")
: this.selectedKey, //下拉框选中值value
};
},
mounted() {
const that = this;
if (that.selectedKey) {
that.defaultSelectedKeys = that.selectedKey.split(","); // 设置默认展开
this.initTree();
},
methods: {
// 初始化树的值
initTree() {
const that = this;
if (that.selectedKey) {
that.defaultSelectedKeys = that.selectedKey.split(","); // 设置默认展开
if (that.selectType == "single") {
that.$refs.treeOption.setCurrentKey(that.selectedKey); // 设置默认选中
} else {
that.$refs.treeOption.setCheckedKeys(that.defaultSelectedKeys);
}
}
},
// 清除选中
clearHandle() {
const that = this;
this.selectValue = "";
this.selectKey = "";
this.defaultSelectedKeys = [];
this.currentNodeKey = "";
this.clearSelected();
if (that.selectType == "single") {
that.$refs.treeOption.setCurrentKey(that.selectedKey); // 设置默认选中
that.$refs.treeOption.setCurrentKey(""); // 设置默认选中
} else {
that.$refs.treeOption.setCheckedKeys(that.defaultSelectedKeys);
that.$refs.treeOption.setCheckedKeys([]);
}
}
},
// 清除选中
clearHandle() {
const that = this;
this.selectValue = "";
this.selectKey = "";
this.defaultSelectedKeys = [];
this.currentNodeKey = "";
this.clearSelected();
if (that.selectType == "single") {
that.$refs.treeOption.setCurrentKey(""); // 设置默认选中
} else {
that.$refs.treeOption.setCheckedKeys([]);
}
},
/* 清空选中样式 */
clearSelected() {
const allNode = document.querySelectorAll("#treeOption .el-tree-node");
allNode.forEach((element) => element.classList.remove("is-current"));
},
// select多选时移除某项操作
removeTag(val) {
this.$refs.treeOption.setCheckedKeys([]);
},
// 点击叶子节点
nodeClick(data, node, el) {
if (data.rank >= this.selectLevel) {
this.selectValue = data.name;
this.selectKey = data.id;
}
},
// 节点选中操作
checkNode(data, node, el) {
const checkedNodes = this.$refs.treeOption.getCheckedNodes();
const keyArr = [];
const valueArr = [];
checkedNodes.forEach((item) => {
if (item.rank >= this.selectLevel) {
keyArr.push(item.id);
valueArr.push(item.name);
},
/* 清空选中样式 */
clearSelected() {
const allNode = document.querySelectorAll("#treeOption .el-tree-node");
allNode.forEach((element) => element.classList.remove("is-current"));
},
// select多选时移除某项操作
removeTag(val) {
this.$refs.treeOption.setCheckedKeys([]);
},
// 点击叶子节点
nodeClick(data, node, el) {
if (data.rank >= this.selectLevel) {
this.selectValue = data.name;
this.selectKey = data.id;
}
});
this.selectValue = valueArr;
this.selectKey = keyArr;
},
// 节点选中操作
checkNode(data, node, el) {
const checkedNodes = this.$refs.treeOption.getCheckedNodes();
const keyArr = [];
const valueArr = [];
checkedNodes.forEach((item) => {
if (item.rank >= this.selectLevel) {
keyArr.push(item.id);
valueArr.push(item.name);
}
});
this.selectValue = valueArr;
this.selectKey = keyArr;
},
},
},
};
};
</script>
<style lang="scss" scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
max-height: 274px;
padding: 0;
overflow-y: auto;
}
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
max-height: 274px;
padding: 0;
overflow-y: auto;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
</style>
<style lang="scss">
/* .vab-tree-select{
/* .vab-tree-select{
.el-tag__close.el-icon-close{
width:0;
overflow:hidden;
......
......@@ -23,169 +23,169 @@
</template>
<script>
export default {
name: "VabCharge",
props: {
styleObj: {
type: Object,
default: () => {
return {};
export default {
name: "VabCharge",
props: {
styleObj: {
type: Object,
default: () => {
return {};
},
},
startVal: {
type: Number,
default: 0,
},
endVal: {
type: Number,
default: 100,
},
},
startVal: {
type: Number,
default: 0,
},
endVal: {
type: Number,
default: 100,
data() {
return {
decimals: 2,
prefix: "",
suffix: "%",
separator: ",",
duration: 3000,
};
},
},
data() {
return {
decimals: 2,
prefix: "",
suffix: "%",
separator: ",",
duration: 3000,
};
},
created() {},
mounted() {},
methods: {},
};
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.content {
position: relative;
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
width: 100%;
background: #000;
.g-number {
position: absolute;
top: 27%;
z-index: 99;
width: 300px;
font-size: 32px;
color: #fff;
text-align: center;
}
.g-container {
.content {
position: relative;
width: 300px;
height: 400px;
margin: auto;
}
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
width: 100%;
background: #000;
.g-contrast {
width: 300px;
height: 400px;
overflow: hidden;
background-color: #000;
filter: contrast(15) hue-rotate(0);
animation: hueRotate 10s infinite linear;
}
.g-number {
position: absolute;
top: 27%;
z-index: 99;
width: 300px;
font-size: 32px;
color: #fff;
text-align: center;
}
.g-circle {
position: relative;
box-sizing: border-box;
width: 300px;
height: 300px;
filter: blur(8px);
.g-container {
position: relative;
width: 300px;
height: 400px;
margin: auto;
}
.g-contrast {
width: 300px;
height: 400px;
overflow: hidden;
background-color: #000;
filter: contrast(15) hue-rotate(0);
animation: hueRotate 10s infinite linear;
}
&::after {
.g-circle {
position: relative;
box-sizing: border-box;
width: 300px;
height: 300px;
filter: blur(8px);
&::after {
position: absolute;
top: 40%;
left: 50%;
width: 200px;
height: 200px;
content: "";
background-color: #00ff6f;
border-radius: 42% 38% 62% 49% / 45%;
transform: translate(-50%, -50%) rotate(0);
animation: rotate 10s infinite linear;
}
&::before {
position: absolute;
top: 40%;
left: 50%;
z-index: 99;
width: 176px;
height: 176px;
content: "";
background-color: #000;
border-radius: 50%;
transform: translate(-50%, -50%);
}
}
.g-bubbles {
position: absolute;
top: 40%;
bottom: 0;
left: 50%;
width: 200px;
height: 200px;
content: "";
width: 100px;
height: 40px;
background-color: #00ff6f;
border-radius: 42% 38% 62% 49% / 45%;
transform: translate(-50%, -50%) rotate(0);
animation: rotate 10s infinite linear;
filter: blur(5px);
border-radius: 100px 100px 0 0;
transform: translate(-50%, 0);
}
&::before {
li {
position: absolute;
top: 40%;
left: 50%;
z-index: 99;
width: 176px;
height: 176px;
content: "";
background-color: #000;
background: #00ff6f;
border-radius: 50%;
transform: translate(-50%, -50%);
}
}
.g-bubbles {
position: absolute;
bottom: 0;
left: 50%;
width: 100px;
height: 40px;
background-color: #00ff6f;
filter: blur(5px);
border-radius: 100px 100px 0 0;
transform: translate(-50%, 0);
}
li {
position: absolute;
background: #00ff6f;
border-radius: 50%;
}
@for $i from 0 through 15 {
li:nth-child(#{$i}) {
$width: 15 + random(15) + px;
top: 50%;
left: 15 + random(70) + px;
width: $width;
height: $width;
transform: translate(-50%, -50%);
animation: moveToTop
#{random(6) +
3}s
ease-in-out -#{random(5000) /
1000}s
infinite;
@for $i from 0 through 15 {
li:nth-child(#{$i}) {
$width: 15 + random(15) + px;
top: 50%;
left: 15 + random(70) + px;
width: $width;
height: $width;
transform: translate(-50%, -50%);
animation: moveToTop
#{random(6) +
3}s
ease-in-out -#{random(5000) /
1000}s
infinite;
}
}
}
@keyframes rotate {
50% {
border-radius: 45% / 42% 38% 58% 49%;
}
@keyframes rotate {
50% {
border-radius: 45% / 42% 38% 58% 49%;
}
100% {
transform: translate(-50%, -50%) rotate(720deg);
100% {
transform: translate(-50%, -50%) rotate(720deg);
}
}
}
@keyframes moveToTop {
90% {
opacity: 1;
}
@keyframes moveToTop {
90% {
opacity: 1;
}
100% {
opacity: 0.1;
transform: translate(-50%, -180px);
100% {
opacity: 0.1;
transform: translate(-50%, -180px);
}
}
}
@keyframes hueRotate {
100% {
filter: contrast(15) hue-rotate(360deg);
@keyframes hueRotate {
100% {
filter: contrast(15) hue-rotate(360deg);
}
}
}
}
</style>
......@@ -17,76 +17,76 @@
</template>
<script>
export default {
name: "VabImage",
components: {},
props: {
bigSrc: {
type: String,
default: "",
export default {
name: "VabImage",
components: {},
props: {
bigSrc: {
type: String,
default: "",
},
smallSrc: {
type: String,
default: "",
},
percent: {
type: Number,
default: 97,
},
},
smallSrc: {
type: String,
default: "",
data() {
return {};
},
percent: {
type: Number,
default: 97,
created() {},
mounted() {},
methods: {
clickBig() {
this.$emit("clickBig");
},
clickSmall() {
this.$emit("clickSmall");
},
},
},
data() {
return {};
},
created() {},
mounted() {},
methods: {
clickBig() {
this.$emit("clickBig");
},
clickSmall() {
this.$emit("clickSmall");
},
},
};
};
</script>
<style lang="scss" scoped>
.vab-image {
&__outter {
position: relative;
width: 100%;
height: 100%;
.vab-image {
&__outter {
position: relative;
width: 100%;
height: 100%;
::v-deep {
img {
border-radius: $base-border-radius;
::v-deep {
img {
border-radius: $base-border-radius;
}
}
}
&__small {
position: absolute;
top: 0;
right: 0;
width: 80px;
height: 100px;
border-bottom: 1px solid $base-color-white;
border-left: 1px solid $base-color-white;
border-radius: $base-border-radius;
}
&__small {
position: absolute;
top: 0;
right: 0;
width: 80px;
height: 100px;
border-bottom: 1px solid $base-color-white;
border-left: 1px solid $base-color-white;
border-radius: $base-border-radius;
}
&__percent {
position: absolute;
right: 0;
bottom: 0;
display: inline-block;
min-width: 50px;
height: 25px;
line-height: 25px;
color: $base-color-white;
text-align: center;
background-color: $base-color-red;
border-radius: $base-border-radius;
&__percent {
position: absolute;
right: 0;
bottom: 0;
display: inline-block;
min-width: 50px;
height: 25px;
line-height: 25px;
color: $base-color-white;
text-align: center;
background-color: $base-color-red;
border-radius: $base-border-radius;
}
}
}
}
</style>
......@@ -25,289 +25,289 @@
</template>
<script>
export default {
name: "VabProfile",
props: {
styleObj: {
type: Object,
default: () => {
return {};
export default {
name: "VabProfile",
props: {
styleObj: {
type: Object,
default: () => {
return {};
},
},
},
username: {
type: String,
default: "",
},
avatar: {
type: String,
default: "",
},
iconArray: {
type: Array,
default: () => {
return [
{ icon: "bell", url: "" },
{ icon: "bookmark", url: "" },
{ icon: "cloud-sun", url: "" },
];
username: {
type: String,
default: "",
},
avatar: {
type: String,
default: "",
},
iconArray: {
type: Array,
default: () => {
return [
{ icon: "bell", url: "" },
{ icon: "bookmark", url: "" },
{ icon: "cloud-sun", url: "" },
];
},
},
},
data() {
return {};
},
},
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.card {
--card-bg-color: hsl(240, 31%, 25%);
--card-bg-color-transparent: hsla(240, 31%, 25%, 0.7);
position: relative;
width: 100%;
height: 100%;
.card-borders {
position: absolute;
top: 0;
left: 0;
.card {
--card-bg-color: hsl(240, 31%, 25%);
--card-bg-color-transparent: hsla(240, 31%, 25%, 0.7);
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
.border-top {
.card-borders {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: var(--card-bg-color);
transform: translateX(-100%);
animation: slide-in-horizontal 0.8s cubic-bezier(0.645, 0.045, 0.355, 1)
forwards;
}
.border-right {
position: absolute;
right: 0;
width: 2px;
height: 100%;
background: var(--card-bg-color);
transform: translateY(100%);
animation: slide-in-vertical 0.8s cubic-bezier(0.645, 0.045, 0.355, 1)
forwards;
}
.border-bottom {
position: absolute;
bottom: 0;
width: 100%;
height: 2px;
background: var(--card-bg-color);
transform: translateX(100%);
animation: slide-in-horizontal-reverse 0.8s
cubic-bezier(0.645, 0.045, 0.355, 1) forwards;
}
overflow: hidden;
.border-left {
position: absolute;
top: 0;
width: 2px;
height: 100%;
background: var(--card-bg-color);
transform: translateY(-100%);
animation: slide-in-vertical-reverse 0.8s
cubic-bezier(0.645, 0.045, 0.355, 1) forwards;
}
}
.border-top {
position: absolute;
top: 0;
width: 100%;
height: 2px;
background: var(--card-bg-color);
transform: translateX(-100%);
animation: slide-in-horizontal 0.8s cubic-bezier(0.645, 0.045, 0.355, 1)
forwards;
}
.card-content {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
padding: 40px 0 40px 0;
background: var(--card-bg-color-transparent);
opacity: 0;
transform: scale(0.6);
animation: bump-in 0.5s 0.8s forwards;
.avatar {
width: 80px;
height: 80px;
border: 1px solid $base-color-white;
border-radius: 50%;
opacity: 0;
transform: scale(0.6);
animation: bump-in 0.5s 1s forwards;
}
.border-right {
position: absolute;
right: 0;
width: 2px;
height: 100%;
background: var(--card-bg-color);
transform: translateY(100%);
animation: slide-in-vertical 0.8s cubic-bezier(0.645, 0.045, 0.355, 1)
forwards;
}
.username {
position: relative;
margin-top: 20px;
margin-bottom: 20px;
font-size: 26px;
color: transparent;
letter-spacing: 2px;
animation: fill-text-white 1.2s 2s forwards;
.border-bottom {
position: absolute;
bottom: 0;
width: 100%;
height: 2px;
background: var(--card-bg-color);
transform: translateX(100%);
animation: slide-in-horizontal-reverse 0.8s
cubic-bezier(0.645, 0.045, 0.355, 1) forwards;
}
&::before {
.border-left {
position: absolute;
top: 0;
left: 0;
width: 100%;
width: 2px;
height: 100%;
color: black;
content: "";
background: #35b9f1;
transform: scaleX(0);
transform-origin: left;
animation: slide-in-out 1.2s 1.2s cubic-bezier(0.75, 0, 0, 1) forwards;
background: var(--card-bg-color);
transform: translateY(-100%);
animation: slide-in-vertical-reverse 0.8s
cubic-bezier(0.645, 0.045, 0.355, 1) forwards;
}
}
.social-icons {
.card-content {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
padding: 40px 0 40px 0;
background: var(--card-bg-color-transparent);
opacity: 0;
transform: scale(0.6);
animation: bump-in 0.5s 0.8s forwards;
.social-icon {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 2.5em;
height: 2.5em;
margin: 0 15px;
color: white;
text-decoration: none;
.avatar {
width: 80px;
height: 80px;
border: 1px solid $base-color-white;
border-radius: 50%;
opacity: 0;
transform: scale(0.6);
animation: bump-in 0.5s 1s forwards;
}
@for $i from 1 through 3 {
&:nth-child(#{$i}) {
&::before {
animation-delay: 2s + 0.1s * $i;
}
&::after {
animation-delay: 2.1s + 0.1s * $i;
}
svg {
animation-delay: 2.2s + 0.1s * $i;
}
}
}
.username {
position: relative;
margin-top: 20px;
margin-bottom: 20px;
font-size: 26px;
color: transparent;
letter-spacing: 2px;
animation: fill-text-white 1.2s 2s forwards;
&::before,
&::after {
&::before {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
color: black;
content: "";
border-radius: inherit;
transform: scale(0);
background: #35b9f1;
transform: scaleX(0);
transform-origin: left;
animation: slide-in-out 1.2s 1.2s cubic-bezier(0.75, 0, 0, 1) forwards;
}
}
&::before {
background: #f7f1e3;
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
}
.social-icons {
display: flex;
&::after {
background: #2c3e50;
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
}
.social-icon {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 2.5em;
height: 2.5em;
margin: 0 15px;
color: white;
text-decoration: none;
border-radius: 50%;
@for $i from 1 through 3 {
&:nth-child(#{$i}) {
&::before {
animation-delay: 2s + 0.1s * $i;
}
&::after {
animation-delay: 2.1s + 0.1s * $i;
}
svg {
animation-delay: 2.2s + 0.1s * $i;
}
}
}
&::before,
&::after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
content: "";
border-radius: inherit;
transform: scale(0);
}
&::before {
background: #f7f1e3;
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
}
svg {
z-index: 99;
transform: scale(0);
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
&::after {
background: #2c3e50;
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
}
svg {
z-index: 99;
transform: scale(0);
animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards;
}
}
}
}
}
}
@keyframes bump-in {
50% {
transform: scale(1.05);
}
@keyframes bump-in {
50% {
transform: scale(1.05);
}
to {
opacity: 1;
transform: scale(1);
to {
opacity: 1;
transform: scale(1);
}
}
}
@keyframes slide-in-horizontal {
50% {
transform: translateX(0);
}
@keyframes slide-in-horizontal {
50% {
transform: translateX(0);
}
to {
transform: translateX(100%);
to {
transform: translateX(100%);
}
}
}
@keyframes slide-in-horizontal-reverse {
50% {
transform: translateX(0);
}
@keyframes slide-in-horizontal-reverse {
50% {
transform: translateX(0);
}
to {
transform: translateX(-100%);
to {
transform: translateX(-100%);
}
}
}
@keyframes slide-in-vertical {
50% {
transform: translateY(0);
}
@keyframes slide-in-vertical {
50% {
transform: translateY(0);
}
to {
transform: translateY(-100%);
to {
transform: translateY(-100%);
}
}
}
@keyframes slide-in-vertical-reverse {
50% {
transform: translateY(0);
}
@keyframes slide-in-vertical-reverse {
50% {
transform: translateY(0);
}
to {
transform: translateY(100%);
to {
transform: translateY(100%);
}
}
}
@keyframes slide-in-out {
50% {
transform: scaleX(1);
transform-origin: left;
}
@keyframes slide-in-out {
50% {
transform: scaleX(1);
transform-origin: left;
}
50.1% {
transform-origin: right;
}
50.1% {
transform-origin: right;
}
100% {
transform: scaleX(0);
transform-origin: right;
100% {
transform: scaleX(0);
transform-origin: right;
}
}
}
@keyframes fill-text-white {
to {
color: white;
@keyframes fill-text-white {
to {
color: white;
}
}
}
@keyframes scale-in {
to {
transform: scale(1);
@keyframes scale-in {
to {
transform: scale(1);
}
}
}
</style>
......@@ -5,40 +5,40 @@
</template>
<script>
import VueQArt from "vue-qart";
import qrImg from "@/assets/qr_logo/lqr_logo.png";
import VueQArt from "vue-qart";
import qrImg from "@/assets/qr_logo/lqr_logo.png";
export default {
name: "VabQrCode",
components: {
VueQArt,
},
props: {
imagePath: {
type: String,
default: qrImg,
export default {
name: "VabQrCode",
components: {
VueQArt,
},
url: {
type: String,
default: "http://www.boyunvision.com/",
props: {
imagePath: {
type: String,
default: qrImg,
},
url: {
type: String,
default: "http://www.boyunvision.com/",
},
size: {
type: Number,
default: 500,
},
},
size: {
type: Number,
default: 500,
data() {
return {
config: {
value: this.url,
imagePath: this.imagePath,
filter: "color",
size: this.size,
},
};
},
},
data() {
return {
config: {
value: this.url,
imagePath: this.imagePath,
filter: "color",
size: this.size,
},
};
},
created() {},
mounted() {},
methods: {},
};
created() {},
mounted() {},
methods: {},
};
</script>
......@@ -5,77 +5,78 @@
</template>
<script>
export default {
name: "VabSnow",
props: {
styleObj: {
type: Object,
default: () => {
return {};
export default {
name: "VabSnow",
props: {
styleObj: {
type: Object,
default: () => {
return {};
},
},
},
},
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.content {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
filter: drop-shadow(0 0 10px white);
}
@function random_range($min, $max) {
$rand: random();
$random_range: $min + floor($rand * (($max - $min) + 1));
.content {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
filter: drop-shadow(0 0 10px white);
}
@return $random_range;
}
@function random_range($min, $max) {
$rand: random();
$random_range: $min + floor($rand * (($max - $min) + 1));
.snow {
$total: 200;
@return $random_range;
}
position: absolute;
width: 10px;
height: 10px;
background: white;
border-radius: 50%;
.snow {
$total: 200;
@for $i from 1 through $total {
$random-x: random(1000000) * 0.0001vw;
$random-offset: random_range(-100000, 100000) * 0.0001vw;
$random-x-end: $random-x + $random-offset;
$random-x-end-yoyo: $random-x + ($random-offset / 2);
$random-yoyo-time: random_range(30000, 80000) / 100000;
$random-yoyo-y: $random-yoyo-time * 100vh;
$random-scale: random(10000) * 0.0001;
$fall-duration: random_range(10, 30) * 1s;
$fall-delay: random(30) * -1s;
position: absolute;
width: 10px;
height: 10px;
background: white;
border-radius: 50%;
&:nth-child(#{$i}) {
opacity: random(10000) * 0.0001;
transform: translate($random-x, -10px) scale($random-scale);
animation: fall-#{$i} $fall-duration $fall-delay linear infinite;
}
@for $i from 1 through $total {
$random-x: random(1000000) * 0.0001vw;
$random-offset: random_range(-100000, 100000) * 0.0001vw;
$random-x-end: $random-x + $random-offset;
$random-x-end-yoyo: $random-x + ($random-offset / 2);
$random-yoyo-time: random_range(30000, 80000) / 100000;
$random-yoyo-y: $random-yoyo-time * 100vh;
$random-scale: random(10000) * 0.0001;
$fall-duration: random_range(10, 30) * 1s;
$fall-delay: random(30) * -1s;
@keyframes fall-#{$i} {
#{percentage($random-yoyo-time)} {
transform: translate($random-x-end, $random-yoyo-y) scale($random-scale);
&:nth-child(#{$i}) {
opacity: random(10000) * 0.0001;
transform: translate($random-x, -10px) scale($random-scale);
animation: fall-#{$i} $fall-duration $fall-delay linear infinite;
}
to {
transform: translate($random-x-end-yoyo, 100vh) scale($random-scale);
@keyframes fall-#{$i} {
#{percentage($random-yoyo-time)} {
transform: translate($random-x-end, $random-yoyo-y)
scale($random-scale);
}
to {
transform: translate($random-x-end-yoyo, 100vh) scale($random-scale);
}
}
}
}
}
</style>
......@@ -16,80 +16,80 @@
</template>
<script>
export default {
name: "VabSticky",
props: {
stickyTop: {
type: Number,
default: 0,
export default {
name: "VabSticky",
props: {
stickyTop: {
type: Number,
default: 0,
},
zIndex: {
type: Number,
default: 1,
},
className: {
type: String,
default: "",
},
},
zIndex: {
type: Number,
default: 1,
data() {
return {
active: false,
position: "",
width: undefined,
height: undefined,
isSticky: false,
};
},
className: {
type: String,
default: "",
mounted() {
this.height = this.$el.getBoundingClientRect().height;
window.addEventListener("scroll", this.handleScroll);
window.addEventListener("resize", this.handleResize);
},
},
data() {
return {
active: false,
position: "",
width: undefined,
height: undefined,
isSticky: false,
};
},
mounted() {
this.height = this.$el.getBoundingClientRect().height;
window.addEventListener("scroll", this.handleScroll);
window.addEventListener("resize", this.handleResize);
},
activated() {
this.handleScroll();
},
destroyed() {
window.removeEventListener("scroll", this.handleScroll);
window.removeEventListener("resize", this.handleResize);
},
methods: {
sticky() {
if (this.active) {
return;
}
this.position = "fixed";
this.active = true;
this.width = this.width + "px";
this.isSticky = true;
activated() {
this.handleScroll();
},
handleReset() {
if (!this.active) {
return;
}
this.reset();
destroyed() {
window.removeEventListener("scroll", this.handleScroll);
window.removeEventListener("resize", this.handleResize);
},
reset() {
this.position = "";
this.width = "auto";
this.active = false;
this.isSticky = false;
methods: {
sticky() {
if (this.active) {
return;
}
this.position = "fixed";
this.active = true;
this.width = this.width + "px";
this.isSticky = true;
},
handleReset() {
if (!this.active) {
return;
}
this.reset();
},
reset() {
this.position = "";
this.width = "auto";
this.active = false;
this.isSticky = false;
},
handleScroll() {
const width = this.$el.getBoundingClientRect().width;
this.width = width || "auto";
const offsetTop = this.$el.getBoundingClientRect().top;
if (offsetTop < this.stickyTop) {
this.sticky();
return;
}
this.handleReset();
},
handleResize() {
if (this.isSticky) {
this.width = this.$el.getBoundingClientRect().width + "px";
}
},
},
handleScroll() {
const width = this.$el.getBoundingClientRect().width;
this.width = width || "auto";
const offsetTop = this.$el.getBoundingClientRect().top;
if (offsetTop < this.stickyTop) {
this.sticky();
return;
}
this.handleReset();
},
handleResize() {
if (this.isSticky) {
this.width = this.$el.getBoundingClientRect().width + "px";
}
},
},
};
};
</script>
......@@ -11,8 +11,7 @@
:closable="false"
:title="`支持jpg、jpeg、png格式,单次可最多选择${limit}张图片,每张不可大于${size}M,如果大于${size}M会自动为您过滤`"
type="info"
>
</el-alert>
></el-alert>
<br />
<el-upload
ref="upload"
......@@ -68,155 +67,66 @@
type="success"
:loading="loading"
@click="submitUpload"
>开始上传
>
开始上传
</el-button>
</div>
</el-dialog>
</template>
<script>
import { tokenName } from "@/config/settings";
export default {
name: "VabUpload",
props: {
url: {
type: String,
default: "/upload",
required: true,
},
name: {
type: String,
default: "file",
required: true,
},
limit: {
type: Number,
default: 50,
required: true,
},
size: {
type: Number,
default: 1,
required: true,
},
},
data() {
return {
show: false,
loading: false,
dialogVisible: false,
dialogImageUrl: "",
action: "",
headers: {},
fileList: [],
picture: "picture",
imgNum: 0,
imgSuccessNum: 0,
imgErrorNum: 0,
typeList: null,
title: "上传",
dialogFormVisible: false,
data: {},
};
},
computed: {
percentage() {
if (this.allImgNum == 0) return 0;
return this.$baseLodash.round(this.imgNum / this.allImgNum, 2) * 100;
},
},
created() {
if ("development" === process.env.NODE_ENV) {
this.api = process.env.VUE_APP_BASE_API;
} else {
this.api = `${window.location.protocol}//${window.location.host}`;
}
import { tokenName } from "@/config/settings";
this.action = this.api + this.url;
this.headers[tokenName] = this.$baseAccessToken();
},
methods: {
submitUpload() {
this.$refs.upload.submit();
export default {
name: "VabUpload",
props: {
url: {
type: String,
default: "/upload",
required: true,
},
name: {
type: String,
default: "file",
required: true,
},
limit: {
type: Number,
default: 50,
required: true,
},
size: {
type: Number,
default: 1,
required: true,
},
},
handleProgress(event, file, fileList) {
this.loading = true;
this.show = true;
data() {
return {
show: false,
loading: false,
dialogVisible: false,
dialogImageUrl: "",
action: "",
headers: {},
fileList: [],
picture: "picture",
imgNum: 0,
imgSuccessNum: 0,
imgErrorNum: 0,
typeList: null,
title: "上传",
dialogFormVisible: false,
data: {},
};
},
handleChange(file, fileList) {
if (file.size > 1048576 * this.size) {
fileList.map((item, index) => {
if (item === file) {
fileList.splice(index, 1);
}
});
this.fileList = fileList;
} else {
this.allImgNum = fileList.length;
}
},
handleSuccess(response, file, fileList) {
this.imgNum = this.imgNum + 1;
this.imgSuccessNum = this.imgSuccessNum + 1;
if (fileList.length === this.imgNum) {
setTimeout(() => {
this.$emit("fetchDatas");
this.$baseMessage(
`上传完成! 共上传${fileList.length}张图片`,
"success"
);
}, 1000);
}
setTimeout(() => {
this.loading = false;
this.show = false;
}, 1000);
},
handleError(err, file, fileList) {
this.imgNum = this.imgNum + 1;
this.imgErrorNum = this.imgErrorNum + 1;
this.$baseMessage(
`文件[${file.raw.name}]上传失败,文件大小为${this.$baseLodash.round(
file.raw.size / 1024,
0
)}KB`,
"error"
);
setTimeout(() => {
this.loading = false;
this.show = false;
}, 1000);
},
handleRemove(file, fileList) {
this.imgNum = this.imgNum - 1;
this.allNum = this.allNum - 1;
},
handlePreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
handleExceed(files, fileList) {
this.$baseMessage(
`当前限制选择 ${this.limit} 个文件,本次选择了
${files.length}
个文件`,
"error"
);
computed: {
percentage() {
if (this.allImgNum == 0) return 0;
return this.$baseLodash.round(this.imgNum / this.allImgNum, 2) * 100;
},
},
handleShow(data) {
this.title = "上传";
this.data = data;
this.dialogFormVisible = true;
},
handleClose() {
this.fileList = [];
this.picture = "picture";
this.allImgNum = 0;
this.imgNum = 0;
this.imgSuccessNum = 0;
this.imgErrorNum = 0;
created() {
if ("development" === process.env.NODE_ENV) {
this.api = process.env.VUE_APP_BASE_API;
} else {
......@@ -225,43 +135,133 @@ export default {
this.action = this.api + this.url;
this.headers[tokenName] = this.$baseAccessToken();
this.dialogFormVisible = false;
},
},
};
</script>
methods: {
submitUpload() {
this.$refs.upload.submit();
},
handleProgress(event, file, fileList) {
this.loading = true;
this.show = true;
},
handleChange(file, fileList) {
if (file.size > 1048576 * this.size) {
fileList.map((item, index) => {
if (item === file) {
fileList.splice(index, 1);
}
});
this.fileList = fileList;
} else {
this.allImgNum = fileList.length;
}
},
handleSuccess(response, file, fileList) {
this.imgNum = this.imgNum + 1;
this.imgSuccessNum = this.imgSuccessNum + 1;
if (fileList.length === this.imgNum) {
setTimeout(() => {
this.$emit("fetchDatas");
this.$baseMessage(
`上传完成! 共上传${fileList.length}张图片`,
"success"
);
}, 1000);
}
<style lang="scss" scoped>
.upload {
height: 600px;
setTimeout(() => {
this.loading = false;
this.show = false;
}, 1000);
},
handleError(err, file, fileList) {
this.imgNum = this.imgNum + 1;
this.imgErrorNum = this.imgErrorNum + 1;
this.$baseMessage(
`文件[${file.raw.name}]上传失败,文件大小为${this.$baseLodash.round(
file.raw.size / 1024,
0
)}KB`,
"error"
);
setTimeout(() => {
this.loading = false;
this.show = false;
}, 1000);
},
handleRemove(file, fileList) {
this.imgNum = this.imgNum - 1;
this.allNum = this.allNum - 1;
},
handlePreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
handleExceed(files, fileList) {
this.$baseMessage(
`当前限制选择 ${this.limit} 个文件,本次选择了
${files.length}
个文件`,
"error"
);
},
handleShow(data) {
this.title = "上传";
this.data = data;
this.dialogFormVisible = true;
},
handleClose() {
this.fileList = [];
this.picture = "picture";
this.allImgNum = 0;
this.imgNum = 0;
this.imgSuccessNum = 0;
this.imgErrorNum = 0;
if ("development" === process.env.NODE_ENV) {
this.api = process.env.VUE_APP_BASE_API;
} else {
this.api = `${window.location.protocol}//${window.location.host}`;
}
.upload-content {
.el-upload__tip {
display: block;
height: 30px;
line-height: 30px;
}
this.action = this.api + this.url;
this.headers[tokenName] = this.$baseAccessToken();
this.dialogFormVisible = false;
},
},
};
</script>
::v-deep {
.el-upload--picture-card {
width: 128px;
height: 128px;
margin: 3px 8px 8px 8px;
border: 2px dashed #c0ccda;
}
<style lang="scss" scoped>
.upload {
height: 600px;
.el-upload-list--picture {
margin-bottom: 20px;
.upload-content {
.el-upload__tip {
display: block;
height: 30px;
line-height: 30px;
}
.el-upload-list--picture-card {
.el-upload-list__item {
::v-deep {
.el-upload--picture-card {
width: 128px;
height: 128px;
margin: 3px 8px 8px 8px;
border: 2px dashed #c0ccda;
}
.el-upload-list--picture {
margin-bottom: 20px;
}
.el-upload-list--picture-card {
.el-upload-list__item {
width: 128px;
height: 128px;
margin: 3px 8px 8px 8px;
}
}
}
}
}
}
</style>
......@@ -9,44 +9,44 @@
indicator-position="none"
>
<el-carousel-item v-for="(item, index) in adList" :key="index">
<el-tag type="warning"> Ad</el-tag>
<a target="_blank" :href="item.url"> {{ item.title }}</a>
<el-tag type="warning">Ad</el-tag>
<a target="_blank" :href="item.url">{{ item.title }}</a>
</el-carousel-item>
</el-carousel>
</div>
</template>
<script>
import { getList } from "@/api/ad";
export default {
data() {
return {
nodeEnv: process.env.NODE_ENV,
adList: [],
};
},
created() {
this.fetchData();
},
methods: {
async fetchData() {
const { data } = await getList();
this.adList = data;
import { getList } from "@/api/ad";
export default {
data() {
return {
nodeEnv: process.env.NODE_ENV,
adList: [],
};
},
},
};
created() {
this.fetchData();
},
methods: {
async fetchData() {
const { data } = await getList();
this.adList = data;
},
},
};
</script>
<style lang="scss" scoped>
.vab-ad {
height: 30px;
padding-right: $base-padding;
padding-left: $base-padding;
line-height: 30px;
cursor: pointer;
background: #eef1f6;
box-shadow: 0 -1px 2px rgba(0, 21, 41, 0.08) inset;
.vab-ad {
height: 30px;
padding-right: $base-padding;
padding-left: $base-padding;
line-height: 30px;
cursor: pointer;
background: #eef1f6;
box-shadow: 0 -1px 2px rgba(0, 21, 41, 0.08) inset;
a {
color: #999;
a {
color: #999;
}
}
}
</style>
......@@ -52,261 +52,262 @@
</template>
<script>
import { Ad, AppMain, NavBar, SideBar, TagsBar, TopBar } from "./components";
import { mapActions, mapGetters } from "vuex";
import { tokenName } from "@/config/settings";
export default {
name: "Layout",
components: {
Ad,
TopBar,
NavBar,
SideBar,
AppMain,
TagsBar,
},
data() {
return { oldLayout: "" };
},
computed: {
...mapGetters({
layout: "settings/layout",
tagsBar: "settings/tagsBar",
collapse: "settings/collapse",
header: "settings/header",
device: "settings/device",
}),
classObj() {
return {
mobile: this.device === "mobile",
};
import { Ad, AppMain, NavBar, SideBar, TagsBar, TopBar } from "./components";
import { mapActions, mapGetters } from "vuex";
import { tokenName } from "@/config/settings";
export default {
name: "Layout",
components: {
Ad,
TopBar,
NavBar,
SideBar,
AppMain,
TagsBar,
},
},
beforeMount() {
window.addEventListener("resize", this.handleResize);
},
beforeDestroy() {
window.removeEventListener("resize", this.handleResize);
},
mounted() {
this.oldLayout = this.layout;
const userAgent = navigator.userAgent;
if (userAgent.includes("Juejin")) {
this.$baseAlert(
"vue-admin-beautiful不支持在掘金内置浏览器演示,请手动复制以下地址到浏览器中查看http://mpfhrd48.sanxing.uz7.cn/vue-admin-beautiful"
);
}
const isMobile = this.handleIsMobile();
if (isMobile) {
if (isMobile) {
//横向布局时如果是手机端访问那么改成纵向版
this.$store.dispatch("settings/changeLayout", "vertical");
} else {
this.$store.dispatch("settings/changeLayout", this.oldLayout);
}
this.$store.dispatch("settings/toggleDevice", "mobile");
setTimeout(() => {
this.$store.dispatch("settings/foldSideBar");
}, 2000);
} else {
this.$store.dispatch("settings/openSideBar");
}
this.$nextTick(() => {
window.addEventListener(
"storage",
(e) => {
if (e.key === tokenName || e.key === null) window.location.reload();
if (e.key === tokenName && e.value === null) window.location.reload();
},
false
);
});
},
methods: {
...mapActions({
handleFoldSideBar: "settings/foldSideBar",
}),
handleIsMobile() {
return document.body.getBoundingClientRect().width - 1 < 992;
data() {
return { oldLayout: "" };
},
computed: {
...mapGetters({
layout: "settings/layout",
tagsBar: "settings/tagsBar",
collapse: "settings/collapse",
header: "settings/header",
device: "settings/device",
}),
classObj() {
return {
mobile: this.device === "mobile",
};
},
},
handleResize() {
if (!document.hidden) {
const isMobile = this.handleIsMobile();
beforeMount() {
window.addEventListener("resize", this.handleResize);
},
beforeDestroy() {
window.removeEventListener("resize", this.handleResize);
},
mounted() {
this.oldLayout = this.layout;
const userAgent = navigator.userAgent;
if (userAgent.includes("Juejin")) {
this.$baseAlert(
"vue-admin-beautiful不支持在掘金内置浏览器演示,请手动复制以下地址到浏览器中查看http://mpfhrd48.sanxing.uz7.cn/vue-admin-beautiful"
);
}
const isMobile = this.handleIsMobile();
if (isMobile) {
if (isMobile) {
//横向布局时如果是手机端访问那么改成纵向版
this.$store.dispatch("settings/changeLayout", "vertical");
} else {
this.$store.dispatch("settings/changeLayout", this.oldLayout);
}
this.$store.dispatch(
"settings/toggleDevice",
isMobile ? "mobile" : "desktop"
);
this.$store.dispatch("settings/toggleDevice", "mobile");
setTimeout(() => {
this.$store.dispatch("settings/foldSideBar");
}, 2000);
} else {
this.$store.dispatch("settings/openSideBar");
}
this.$nextTick(() => {
window.addEventListener(
"storage",
(e) => {
if (e.key === tokenName || e.key === null) window.location.reload();
if (e.key === tokenName && e.value === null)
window.location.reload();
},
false
);
});
},
},
};
methods: {
...mapActions({
handleFoldSideBar: "settings/foldSideBar",
}),
handleIsMobile() {
return document.body.getBoundingClientRect().width - 1 < 992;
},
handleResize() {
if (!document.hidden) {
const isMobile = this.handleIsMobile();
if (isMobile) {
//横向布局时如果是手机端访问那么改成纵向版
this.$store.dispatch("settings/changeLayout", "vertical");
} else {
this.$store.dispatch("settings/changeLayout", this.oldLayout);
}
this.$store.dispatch(
"settings/toggleDevice",
isMobile ? "mobile" : "desktop"
);
}
},
},
};
</script>
<style lang="scss" scoped>
@mixin fix-header {
position: fixed;
top: 0;
right: 0;
left: 0;
z-index: $base-z-index - 2;
width: 100%;
overflow: hidden;
}
.vue-admin-beautiful-wrapper {
position: relative;
width: 100%;
height: 100%;
@mixin fix-header {
position: fixed;
top: 0;
right: 0;
left: 0;
z-index: $base-z-index - 2;
width: 100%;
overflow: hidden;
}
.layout-container-horizontal {
.vue-admin-beautiful-wrapper {
position: relative;
width: 100%;
height: 100%;
&.fixed {
padding-top: calc(#{$base-top-bar-height} + #{$base-tags-bar-height});
}
&.fixed.no-tags-bar {
padding-top: $base-top-bar-height;
}
.layout-container-horizontal {
position: relative;
::v-deep {
.vab-main {
width: 88%;
margin: auto;
&.fixed {
padding-top: calc(#{$base-top-bar-height} + #{$base-tags-bar-height});
}
.fixed-header {
@include fix-header;
&.fixed.no-tags-bar {
padding-top: $base-top-bar-height;
}
.tag-view-show {
background: $base-color-white;
box-shadow: $base-box-shadow;
}
::v-deep {
.vab-main {
width: 88%;
margin: auto;
}
.nav-bar-container {
.fold-unfold {
display: none;
.fixed-header {
@include fix-header;
}
}
.main-padding {
.app-main-container {
margin-top: $base-padding;
margin-bottom: $base-padding;
.tag-view-show {
background: $base-color-white;
box-shadow: $base-box-shadow;
}
.nav-bar-container {
.fold-unfold {
display: none;
}
}
.main-padding {
.app-main-container {
margin-top: $base-padding;
margin-bottom: $base-padding;
background: $base-color-white;
}
}
}
}
}
.layout-container-vertical {
position: relative;
.layout-container-vertical {
position: relative;
.mask {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: $base-z-index - 1;
width: 100%;
height: 100vh;
overflow: hidden;
background: #000;
opacity: 0.5;
}
.mask {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: $base-z-index - 1;
width: 100%;
height: 100vh;
overflow: hidden;
background: #000;
opacity: 0.5;
}
&.fixed {
padding-top: calc(#{$base-nav-bar-height} + #{$base-tags-bar-height});
}
&.fixed {
padding-top: calc(#{$base-nav-bar-height} + #{$base-tags-bar-height});
}
&.fixed.no-tags-bar {
padding-top: $base-nav-bar-height;
}
&.fixed.no-tags-bar {
padding-top: $base-nav-bar-height;
}
.vab-main {
position: relative;
min-height: 100%;
margin-left: $base-left-menu-width;
background: #f6f8f9;
transition: $base-transition;
.vab-main {
position: relative;
min-height: 100%;
margin-left: $base-left-menu-width;
background: #f6f8f9;
transition: $base-transition;
::v-deep {
.fixed-header {
@include fix-header;
::v-deep {
.fixed-header {
@include fix-header;
left: $base-left-menu-width;
width: $base-right-content-width;
box-shadow: $base-box-shadow;
transition: $base-transition;
}
left: $base-left-menu-width;
width: $base-right-content-width;
box-shadow: $base-box-shadow;
transition: $base-transition;
}
.nav-bar-container {
position: relative;
box-sizing: border-box;
}
.nav-bar-container {
position: relative;
box-sizing: border-box;
}
.tags-bar-container {
box-sizing: border-box;
}
.tags-bar-container {
box-sizing: border-box;
}
.app-main-container {
width: calc(100% - #{$base-padding} - #{$base-padding});
margin: $base-padding auto;
background: $base-color-white;
border-radius: $base-border-radius;
.app-main-container {
width: calc(100% - #{$base-padding} - #{$base-padding});
margin: $base-padding auto;
background: $base-color-white;
border-radius: $base-border-radius;
}
}
}
&.is-collapse-main {
margin-left: $base-left-menu-width-min;
&.is-collapse-main {
margin-left: $base-left-menu-width-min;
::v-deep {
.fixed-header {
left: $base-left-menu-width-min;
width: calc(100% - 65px);
::v-deep {
.fixed-header {
left: $base-left-menu-width-min;
width: calc(100% - 65px);
}
}
}
}
}
}
/* 手机端开始 */
&.mobile {
::v-deep {
.el-pager,
.el-pagination__jump {
display: none;
}
.layout-container-vertical {
.el-scrollbar.side-bar-container.is-collapse {
width: 0;
/* 手机端开始 */
&.mobile {
::v-deep {
.el-pager,
.el-pagination__jump {
display: none;
}
.vab-main {
width: 100%;
margin-left: 0;
.layout-container-vertical {
.el-scrollbar.side-bar-container.is-collapse {
width: 0;
}
.vab-main {
width: 100%;
margin-left: 0;
}
}
}
.vab-main {
.fixed-header {
left: 0 !important;
width: 100% !important;
.vab-main {
.fixed-header {
left: 0 !important;
width: 100% !important;
}
}
}
}
}
/* 手机端结束 */
}
/* 手机端结束 */
}
</style>
......@@ -36,7 +36,7 @@ service.interceptors.request.use(
}
if (process.env.NODE_ENV !== "preview") {
if (contentType === "application/x-www-form-urlencoded;charset=UTF-8") {
if (config.data && !config.data.param) {
if (config.data) {
config.data = qs.stringify(config.data);
}
}
......
......@@ -43,254 +43,254 @@
</template>
<script>
export default {
name: "Page401",
data() {
return {
jumpTime: 5,
oops: "抱歉!",
headline: "您没有操作权限...",
info: "当前帐号没有操作权限,请联系管理员。",
btn: "返回",
timer: 0,
};
},
mounted() {
this.timeChange();
},
beforeDestroy() {
clearInterval(this.timer);
},
methods: {
timeChange() {
this.timer = setInterval(() => {
if (this.jumpTime) {
this.jumpTime--;
} else {
this.$router.push({ path: "/" });
this.$store.dispatch("tagsBar/delOthersRoutes", {
path: "/",
});
clearInterval(this.timer);
}
}, 1000);
export default {
name: "Page401",
data() {
return {
jumpTime: 5,
oops: "抱歉!",
headline: "您没有操作权限...",
info: "当前帐号没有操作权限,请联系管理员。",
btn: "返回",
timer: 0,
};
},
mounted() {
this.timeChange();
},
beforeDestroy() {
clearInterval(this.timer);
},
},
};
methods: {
timeChange() {
this.timer = setInterval(() => {
if (this.jumpTime) {
this.jumpTime--;
} else {
this.$router.push({ path: "/" });
this.$store.dispatch("tagsBar/delOthersRoutes", {
path: "/",
});
clearInterval(this.timer);
}
}, 1000);
},
},
};
</script>
<style lang="scss" scoped>
.error-container {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
.error-content {
.pic-error {
position: relative;
float: left;
width: 120%;
overflow: hidden;
.error-container {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
&-parent {
width: 100%;
}
&-child {
position: absolute;
&.left {
top: 17px;
left: 220px;
width: 80px;
opacity: 0;
animation-name: cloudLeft;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
.error-content {
.pic-error {
position: relative;
float: left;
width: 120%;
overflow: hidden;
&.mid {
top: 10px;
left: 420px;
width: 46px;
opacity: 0;
animation-name: cloudMid;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1.2s;
animation-fill-mode: forwards;
&-parent {
width: 100%;
}
&.right {
top: 100px;
left: 500px;
width: 62px;
opacity: 0;
animation-name: cloudRight;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
&-child {
position: absolute;
@keyframes cloudLeft {
0% {
&.left {
top: 17px;
left: 220px;
width: 80px;
opacity: 0;
animation-name: cloudLeft;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
20% {
top: 33px;
left: 188px;
opacity: 1;
}
80% {
top: 81px;
left: 92px;
opacity: 1;
}
100% {
top: 97px;
left: 60px;
opacity: 0;
}
}
@keyframes cloudMid {
0% {
&.mid {
top: 10px;
left: 420px;
width: 46px;
opacity: 0;
animation-name: cloudMid;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1.2s;
animation-fill-mode: forwards;
}
20% {
top: 40px;
left: 360px;
opacity: 1;
}
70% {
top: 130px;
left: 180px;
opacity: 1;
}
100% {
top: 160px;
left: 120px;
opacity: 0;
}
}
@keyframes cloudRight {
0% {
&.right {
top: 100px;
left: 500px;
width: 62px;
opacity: 0;
animation-name: cloudRight;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
20% {
top: 120px;
left: 460px;
opacity: 1;
}
@keyframes cloudLeft {
0% {
top: 17px;
left: 220px;
opacity: 0;
}
80% {
top: 180px;
left: 340px;
opacity: 1;
20% {
top: 33px;
left: 188px;
opacity: 1;
}
80% {
top: 81px;
left: 92px;
opacity: 1;
}
100% {
top: 97px;
left: 60px;
opacity: 0;
}
}
100% {
top: 200px;
left: 300px;
opacity: 0;
@keyframes cloudMid {
0% {
top: 10px;
left: 420px;
opacity: 0;
}
20% {
top: 40px;
left: 360px;
opacity: 1;
}
70% {
top: 130px;
left: 180px;
opacity: 1;
}
100% {
top: 160px;
left: 120px;
opacity: 0;
}
}
}
}
}
.bullshit {
position: relative;
float: left;
width: 300px;
padding: 30px 0;
overflow: hidden;
@keyframes cloudRight {
0% {
top: 100px;
left: 500px;
opacity: 0;
}
&-oops {
margin-bottom: 20px;
font-size: 32px;
font-weight: bold;
line-height: 40px;
color: $base-color-blue;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-fill-mode: forwards;
}
20% {
top: 120px;
left: 460px;
opacity: 1;
}
&-headline {
margin-bottom: 10px;
font-size: 20px;
font-weight: bold;
line-height: 24px;
color: #222;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.1s;
animation-fill-mode: forwards;
}
80% {
top: 180px;
left: 340px;
opacity: 1;
}
&-info {
margin-bottom: 30px;
font-size: 13px;
line-height: 21px;
color: $base-color-gray;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.2s;
animation-fill-mode: forwards;
100% {
top: 200px;
left: 300px;
opacity: 0;
}
}
}
}
&-return-home {
display: block;
.bullshit {
position: relative;
float: left;
width: 110px;
height: 36px;
font-size: 14px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: $base-color-blue;
border-radius: 100px;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.3s;
animation-fill-mode: forwards;
}
width: 300px;
padding: 30px 0;
overflow: hidden;
@keyframes slideUp {
0% {
&-oops {
margin-bottom: 20px;
font-size: 32px;
font-weight: bold;
line-height: 40px;
color: $base-color-blue;
opacity: 0;
transform: translateY(60px);
animation-name: slideUp;
animation-duration: 0.5s;
animation-fill-mode: forwards;
}
&-headline {
margin-bottom: 10px;
font-size: 20px;
font-weight: bold;
line-height: 24px;
color: #222;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.1s;
animation-fill-mode: forwards;
}
&-info {
margin-bottom: 30px;
font-size: 13px;
line-height: 21px;
color: $base-color-gray;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.2s;
animation-fill-mode: forwards;
}
&-return-home {
display: block;
float: left;
width: 110px;
height: 36px;
font-size: 14px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: $base-color-blue;
border-radius: 100px;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.3s;
animation-fill-mode: forwards;
}
100% {
opacity: 1;
transform: translateY(0);
@keyframes slideUp {
0% {
opacity: 0;
transform: translateY(60px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
}
}
}
}
</style>
......@@ -43,254 +43,254 @@
</template>
<script>
export default {
name: "Page404",
data() {
return {
jumpTime: 5,
oops: "抱歉!",
headline: "当前页面不存在...",
info: "请检查您输入的网址是否正确,或点击下面的按钮返回首页。",
btn: "返回首页",
timer: 0,
};
},
mounted() {
this.timeChange();
},
beforeDestroy() {
clearInterval(this.timer);
},
methods: {
timeChange() {
this.timer = setInterval(() => {
if (this.jumpTime) {
this.jumpTime--;
} else {
this.$router.push({ path: "/" });
this.$store.dispatch("tagsBar/delOthersRoutes", {
path: "/",
});
clearInterval(this.timer);
}
}, 1000);
export default {
name: "Page404",
data() {
return {
jumpTime: 5,
oops: "抱歉!",
headline: "当前页面不存在...",
info: "请检查您输入的网址是否正确,或点击下面的按钮返回首页。",
btn: "返回首页",
timer: 0,
};
},
mounted() {
this.timeChange();
},
beforeDestroy() {
clearInterval(this.timer);
},
},
};
methods: {
timeChange() {
this.timer = setInterval(() => {
if (this.jumpTime) {
this.jumpTime--;
} else {
this.$router.push({ path: "/" });
this.$store.dispatch("tagsBar/delOthersRoutes", {
path: "/",
});
clearInterval(this.timer);
}
}, 1000);
},
},
};
</script>
<style lang="scss" scoped>
.error-container {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
.error-content {
.pic-error {
position: relative;
float: left;
width: 120%;
overflow: hidden;
.error-container {
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
&-parent {
width: 100%;
}
&-child {
position: absolute;
&.left {
top: 17px;
left: 220px;
width: 80px;
opacity: 0;
animation-name: cloudLeft;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
.error-content {
.pic-error {
position: relative;
float: left;
width: 120%;
overflow: hidden;
&.mid {
top: 10px;
left: 420px;
width: 46px;
opacity: 0;
animation-name: cloudMid;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1.2s;
animation-fill-mode: forwards;
&-parent {
width: 100%;
}
&.right {
top: 100px;
left: 500px;
width: 62px;
opacity: 0;
animation-name: cloudRight;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
&-child {
position: absolute;
@keyframes cloudLeft {
0% {
&.left {
top: 17px;
left: 220px;
width: 80px;
opacity: 0;
animation-name: cloudLeft;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
20% {
top: 33px;
left: 188px;
opacity: 1;
}
80% {
top: 81px;
left: 92px;
opacity: 1;
}
100% {
top: 97px;
left: 60px;
opacity: 0;
}
}
@keyframes cloudMid {
0% {
&.mid {
top: 10px;
left: 420px;
width: 46px;
opacity: 0;
animation-name: cloudMid;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1.2s;
animation-fill-mode: forwards;
}
20% {
top: 40px;
left: 360px;
opacity: 1;
}
70% {
top: 130px;
left: 180px;
opacity: 1;
}
100% {
top: 160px;
left: 120px;
opacity: 0;
}
}
@keyframes cloudRight {
0% {
&.right {
top: 100px;
left: 500px;
width: 62px;
opacity: 0;
animation-name: cloudRight;
animation-duration: 2s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode: forwards;
}
20% {
top: 120px;
left: 460px;
opacity: 1;
}
@keyframes cloudLeft {
0% {
top: 17px;
left: 220px;
opacity: 0;
}
80% {
top: 180px;
left: 340px;
opacity: 1;
20% {
top: 33px;
left: 188px;
opacity: 1;
}
80% {
top: 81px;
left: 92px;
opacity: 1;
}
100% {
top: 97px;
left: 60px;
opacity: 0;
}
}
100% {
top: 200px;
left: 300px;
opacity: 0;
@keyframes cloudMid {
0% {
top: 10px;
left: 420px;
opacity: 0;
}
20% {
top: 40px;
left: 360px;
opacity: 1;
}
70% {
top: 130px;
left: 180px;
opacity: 1;
}
100% {
top: 160px;
left: 120px;
opacity: 0;
}
}
}
}
}
.bullshit {
position: relative;
float: left;
width: 300px;
padding: 30px 0;
overflow: hidden;
@keyframes cloudRight {
0% {
top: 100px;
left: 500px;
opacity: 0;
}
&-oops {
margin-bottom: 20px;
font-size: 32px;
font-weight: bold;
line-height: 40px;
color: $base-color-blue;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-fill-mode: forwards;
}
20% {
top: 120px;
left: 460px;
opacity: 1;
}
&-headline {
margin-bottom: 10px;
font-size: 20px;
font-weight: bold;
line-height: 24px;
color: #222;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.1s;
animation-fill-mode: forwards;
}
80% {
top: 180px;
left: 340px;
opacity: 1;
}
&-info {
margin-bottom: 30px;
font-size: 13px;
line-height: 21px;
color: $base-color-gray;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.2s;
animation-fill-mode: forwards;
100% {
top: 200px;
left: 300px;
opacity: 0;
}
}
}
}
&-return-home {
display: block;
.bullshit {
position: relative;
float: left;
width: 110px;
height: 36px;
font-size: 14px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: $base-color-blue;
border-radius: 100px;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.3s;
animation-fill-mode: forwards;
}
width: 300px;
padding: 30px 0;
overflow: hidden;
@keyframes slideUp {
0% {
&-oops {
margin-bottom: 20px;
font-size: 32px;
font-weight: bold;
line-height: 40px;
color: $base-color-blue;
opacity: 0;
transform: translateY(60px);
animation-name: slideUp;
animation-duration: 0.5s;
animation-fill-mode: forwards;
}
&-headline {
margin-bottom: 10px;
font-size: 20px;
font-weight: bold;
line-height: 24px;
color: #222;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.1s;
animation-fill-mode: forwards;
}
&-info {
margin-bottom: 30px;
font-size: 13px;
line-height: 21px;
color: $base-color-gray;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.2s;
animation-fill-mode: forwards;
}
&-return-home {
display: block;
float: left;
width: 110px;
height: 36px;
font-size: 14px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: $base-color-blue;
border-radius: 100px;
opacity: 0;
animation-name: slideUp;
animation-duration: 0.5s;
animation-delay: 0.3s;
animation-fill-mode: forwards;
}
100% {
opacity: 1;
transform: translateY(0);
@keyframes slideUp {
0% {
opacity: 0;
transform: translateY(60px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
}
}
}
}
</style>
......@@ -44,8 +44,8 @@
:options="fwl"
/>
<div class="bottom">
<span
>日均访问量:
<span>
日均访问量:
<vab-count
:start-val="config1.startVal"
......@@ -71,8 +71,8 @@
:options="sqs"
/>
<div class="bottom">
<span
>总授权数:
<span>
总授权数:
<vab-count
:start-val="config2.startVal"
:end-val="config2.endVal"
......@@ -81,7 +81,8 @@
:prefix="config2.prefix"
:suffix="config2.suffix"
:decimals="config2.decimals"
/></span>
/>
</span>
</div>
</el-card>
</el-col>
......@@ -98,8 +99,9 @@
@click="handleClick"
/>
<div class="bottom">
<span
>词云数量:<vab-count
<span>
词云数量:
<vab-count
:start-val="config3.startVal"
:end-val="config3.endVal"
:duration="config3.duration"
......@@ -107,7 +109,8 @@
:prefix="config3.prefix"
:suffix="config3.suffix"
:decimals="config3.decimals"
/></span>
/>
</span>
</div>
</el-card>
</el-col>
......@@ -273,12 +276,10 @@
:title="item.title"
:type="item.type"
:closable="item.closable"
>
</el-alert>
></el-alert>
<br />
</div>
<el-alert :closable="false" :title="userAgent" type="info">
</el-alert>
<el-alert :closable="false" :title="userAgent" type="info"></el-alert>
<br />
</el-card>
<el-card shadow="never">
......@@ -296,446 +297,446 @@
</template>
<script>
import VabChart from "@/plugins/echarts";
import { dependencies, devDependencies } from "../../../package.json";
import { getList } from "@/api/changeLog";
import { getNoticeList } from "@/api/notice";
import { getRepos, getStargazers } from "@/api/github";
export default {
name: "Index",
components: {
VabChart,
},
data() {
return {
timer: 0,
updateTime: process.env.VUE_APP_UPDATE_TIME,
nodeEnv: process.env.NODE_ENV,
dependencies: dependencies,
devDependencies: devDependencies,
config1: {
startVal: 0,
endVal: this.$baseLodash.random(20000, 60000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
config2: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
config3: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
import VabChart from "@/plugins/echarts";
import { dependencies, devDependencies } from "../../../package.json";
import { getList } from "@/api/changeLog";
import { getNoticeList } from "@/api/notice";
import { getRepos, getStargazers } from "@/api/github";
export default {
name: "Index",
components: {
VabChart,
},
data() {
return {
timer: 0,
updateTime: process.env.VUE_APP_UPDATE_TIME,
nodeEnv: process.env.NODE_ENV,
dependencies: dependencies,
devDependencies: devDependencies,
config1: {
startVal: 0,
endVal: this.$baseLodash.random(20000, 60000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
config2: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
config3: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: "",
suffix: "",
separator: ",",
duration: 8000,
},
//访问量
fwl: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
containLabel: true,
//访问量
fwl: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: false,
data: [],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: "value",
},
],
series: [
{
name: "访问量",
type: "line",
data: [],
smooth: true,
areaStyle: {},
},
],
},
xAxis: [
{
type: "category",
boundaryGap: false,
data: [],
axisTick: {
alignWithLabel: true,
//授权数
sqs: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
containLabel: true,
},
xAxis: [
{
type: "category",
/*boundaryGap: false,*/
data: ["0时", "4时", "8时", "12时", "16时", "20时", "24时"],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: "value",
},
],
series: [
{
name: "授权数",
type: "bar",
barWidth: "60%",
data: [10, 52, 20, 33, 39, 33, 22],
},
],
},
//词云
cy: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
},
],
yAxis: [
series: [
{
type: "wordCloud",
gridSize: 15,
sizeRange: [12, 40],
rotationRange: [0, 0],
width: "100%",
height: "100%",
textStyle: {
normal: {
color() {
const arr = [
"#1890FF",
"#36CBCB",
"#4ECB73",
"#FBD437",
"#F2637B",
"#975FE5",
];
let index = Math.floor(Math.random() * arr.length);
return arr[index];
},
},
},
data: [
{
name: "vue-admin-beautiful",
value: 15000,
},
{
name: "element",
value: 10081,
},
{
name: "beautiful",
value: 9386,
},
{
name: "vue",
value: 6500,
},
{
name: "chuzhixin",
value: 6000,
},
{
name: "good",
value: 4500,
},
{
name: "success",
value: 3800,
},
{
name: "never",
value: 3000,
},
{
name: "boy",
value: 2500,
},
{
name: "girl",
value: 2300,
},
{
name: "github",
value: 2000,
},
{
name: "hbuilder",
value: 1900,
},
{
name: "dcloud",
value: 1800,
},
{
name: "china",
value: 1700,
},
{
name: "1204505056",
value: 1600,
},
{
name: "972435319",
value: 1500,
},
{
name: "young",
value: 1200,
},
{
name: "old",
value: 1100,
},
{
name: "vuex",
value: 900,
},
{
name: "router",
value: 800,
},
{
name: "money",
value: 700,
},
{
name: "qingdao",
value: 800,
},
{
name: "yantai",
value: 9000,
},
{
name: "author is very cool",
value: 9200,
},
],
},
],
},
//中国地图
zgdt: {
title: {
text: "2099年全国GDP分布",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
},
series: [
{
name: "2099年全国GDP分布",
type: "map",
roam: false,
zoom: 1.25,
mapType: "china",
mapLocation: {
x: "center",
},
selectedMode: "multiple",
itemStyle: {
normal: {
label: {
show: false,
},
},
emphasis: {
label: {
show: true,
},
},
},
data: [
{ name: "西藏", value: 605.83 },
{ name: "青海", value: 1670.44 },
{ name: "宁夏", value: 2102.21 },
{ name: "海南", value: 2522.66 },
{ name: "甘肃", value: 5020.37 },
{ name: "贵州", value: 5701.84 },
{ name: "新疆", value: 6610.05 },
{ name: "云南", value: 8893.12 },
{ name: "重庆", value: 10011.37 },
{ name: "吉林", value: 10568.83 },
{ name: "山西", value: 11237.55 },
{ name: "天津", value: 11307.28 },
{ name: "江西", value: 11702.82 },
{ name: "广西", value: 11720.87 },
{ name: "陕西", value: 12512.3 },
{ name: "黑龙江", value: 12582 },
{ name: "内蒙古", value: 14359.88 },
{ name: "安徽", value: 15300.65 },
{ name: "北京", value: 16251.93 },
{ name: "福建", value: 17560.18 },
{ name: "上海", value: 19195.69 },
{ name: "湖北", value: 19632.26 },
{ name: "湖南", value: 19669.56 },
{ name: "四川", value: 21026.68 },
{ name: "辽宁", value: 22226.7 },
{ name: "河北", value: 24515.76 },
{ name: "河南", value: 26931.03 },
{ name: "浙江", value: 32318.85 },
{ name: "山东", value: 45361.85, selected: true },
{ name: "江苏", value: 49110.27 },
{ name: "广东", value: 53210.28 },
],
},
],
},
//更新日志
reverse: true,
activities: [],
noticeList: [],
//其他信息
userAgent: navigator.userAgent,
//卡片图标
iconList: [
{
type: "value",
icon: "video",
title: "视频播放器",
link: "/vab/player",
color: "#ffc069",
},
],
series: [
{
name: "访问量",
type: "line",
data: [],
smooth: true,
areaStyle: {},
icon: "table",
title: "表格",
link: "/vab/table/comprehensiveTable",
color: "#5cdbd3",
},
],
},
//授权数
sqs: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
containLabel: true,
},
xAxis: [
{
type: "category",
/*boundaryGap: false,*/
data: ["0时", "4时", "8时", "12时", "16时", "20时", "24时"],
axisTick: {
alignWithLabel: true,
},
icon: "laptop-code",
title: "源码",
link: "https://github.com/chuzhixin/vue-admin-beautiful",
color: "#b37feb",
},
],
yAxis: [
{
type: "value",
icon: "book",
title: "书籍",
link: "",
color: "#69c0ff",
},
],
series: [
{
name: "授权数",
type: "bar",
barWidth: "60%",
data: [10, 52, 20, 33, 39, 33, 22],
icon: "bullhorn",
title: "公告",
link: "",
color: "#ff85c0",
},
],
},
//词云
cy: {
grid: {
top: "4%",
left: "2%",
right: "4%",
bottom: "0%",
},
series: [
{
type: "wordCloud",
gridSize: 15,
sizeRange: [12, 40],
rotationRange: [0, 0],
width: "100%",
height: "100%",
textStyle: {
normal: {
color() {
const arr = [
"#1890FF",
"#36CBCB",
"#4ECB73",
"#FBD437",
"#F2637B",
"#975FE5",
];
let index = Math.floor(Math.random() * arr.length);
return arr[index];
},
},
},
data: [
{
name: "vue-admin-beautiful",
value: 15000,
},
{
name: "element",
value: 10081,
},
{
name: "beautiful",
value: 9386,
},
icon: "gift",
title: "礼物",
link: "",
color: "#ffd666",
},
{
name: "vue",
value: 6500,
},
{
name: "chuzhixin",
value: 6000,
},
{
name: "good",
value: 4500,
},
{
name: "success",
value: 3800,
},
{
name: "never",
value: 3000,
},
{
name: "boy",
value: 2500,
},
{
name: "girl",
value: 2300,
},
{
name: "github",
value: 2000,
},
{
name: "hbuilder",
value: 1900,
},
{
name: "dcloud",
value: 1800,
},
{
name: "china",
value: 1700,
},
{
name: "1204505056",
value: 1600,
},
{
name: "972435319",
value: 1500,
},
{
name: "young",
value: 1200,
},
{
name: "old",
value: 1100,
},
{
name: "vuex",
value: 900,
},
{
name: "router",
value: 800,
},
{
name: "money",
value: 700,
},
{
name: "qingdao",
value: 800,
},
{
name: "yantai",
value: 9000,
},
{
name: "author is very cool",
value: 9200,
},
],
{
icon: "balance-scale-left",
title: "公平的世界",
link: "",
color: "#ff9c6e",
},
],
},
//中国地图
zgdt: {
title: {
text: "2099年全国GDP分布",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
},
series: [
{
name: "2099年全国GDP分布",
type: "map",
roam: false,
zoom: 1.25,
mapType: "china",
mapLocation: {
x: "center",
},
selectedMode: "multiple",
itemStyle: {
normal: {
label: {
show: false,
},
},
emphasis: {
label: {
show: true,
},
},
},
data: [
{ name: "西藏", value: 605.83 },
{ name: "青海", value: 1670.44 },
{ name: "宁夏", value: 2102.21 },
{ name: "海南", value: 2522.66 },
{ name: "甘肃", value: 5020.37 },
{ name: "贵州", value: 5701.84 },
{ name: "新疆", value: 6610.05 },
{ name: "云南", value: 8893.12 },
{ name: "重庆", value: 10011.37 },
{ name: "吉林", value: 10568.83 },
{ name: "山西", value: 11237.55 },
{ name: "天津", value: 11307.28 },
{ name: "江西", value: 11702.82 },
{ name: "广西", value: 11720.87 },
{ name: "陕西", value: 12512.3 },
{ name: "黑龙江", value: 12582 },
{ name: "内蒙古", value: 14359.88 },
{ name: "安徽", value: 15300.65 },
{ name: "北京", value: 16251.93 },
{ name: "福建", value: 17560.18 },
{ name: "上海", value: 19195.69 },
{ name: "湖北", value: 19632.26 },
{ name: "湖南", value: 19669.56 },
{ name: "四川", value: 21026.68 },
{ name: "辽宁", value: 22226.7 },
{ name: "河北", value: 24515.76 },
{ name: "河南", value: 26931.03 },
{ name: "浙江", value: 32318.85 },
{ name: "山东", value: 45361.85, selected: true },
{ name: "江苏", value: 49110.27 },
{ name: "广东", value: 53210.28 },
],
icon: "coffee",
title: "休息一下",
link: "",
color: "#95de64",
},
],
},
};
},
created() {
this.fetchData();
},
beforeDestroy() {
clearInterval(this.timer);
},
mounted() {
let base = +new Date(2020, 1, 1);
let oneDay = 24 * 3600 * 1000;
let date = [];
//更新日志
reverse: true,
activities: [],
noticeList: [],
//其他信息
userAgent: navigator.userAgent,
//卡片图标
iconList: [
{
icon: "video",
title: "视频播放器",
link: "/vab/player",
color: "#ffc069",
},
{
icon: "table",
title: "表格",
link: "/vab/table/comprehensiveTable",
color: "#5cdbd3",
},
{
icon: "laptop-code",
title: "源码",
link: "https://github.com/chuzhixin/vue-admin-beautiful",
color: "#b37feb",
},
{
icon: "book",
title: "书籍",
link: "",
color: "#69c0ff",
},
{
icon: "bullhorn",
title: "公告",
link: "",
color: "#ff85c0",
},
{
icon: "gift",
title: "礼物",
link: "",
color: "#ffd666",
},
let data = [Math.random() * 1500];
let now = new Date(base);
{
icon: "balance-scale-left",
title: "公平的世界",
link: "",
color: "#ff9c6e",
},
{
icon: "coffee",
title: "休息一下",
link: "",
color: "#95de64",
},
],
};
},
created() {
this.fetchData();
},
beforeDestroy() {
clearInterval(this.timer);
},
mounted() {
let base = +new Date(2020, 1, 1);
let oneDay = 24 * 3600 * 1000;
let date = [];
const addData = (shift) => {
now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/");
date.push(now);
data.push(this.$baseLodash.random(20000, 60000));
let data = [Math.random() * 1500];
let now = new Date(base);
if (shift) {
date.shift();
data.shift();
}
const addData = (shift) => {
now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/");
date.push(now);
data.push(this.$baseLodash.random(20000, 60000));
now = new Date(+new Date(now) + oneDay);
};
if (shift) {
date.shift();
data.shift();
for (let i = 1; i < 6; i++) {
addData();
}
now = new Date(+new Date(now) + oneDay);
};
for (let i = 1; i < 6; i++) {
addData();
}
addData(true);
this.fwl.xAxis[0].data = date;
this.fwl.series[0].data = data;
this.timer = setInterval(() => {
addData(true);
this.fwl.xAxis[0].data = date;
this.fwl.series[0].data = data;
}, 3000);
},
methods: {
handleClick(e) {
this.$baseMessage(`点击了${e.name},这里可以写跳转`);
this.timer = setInterval(() => {
addData(true);
this.fwl.xAxis[0].data = date;
this.fwl.series[0].data = data;
}, 3000);
},
handleZrClick(e) {},
handleChangeTheme() {
this.$baseEventBus.$emit("theme");
},
async fetchData() {
const { data } = await getList();
data.map((item, index) => {
if (index === data.length - 1) {
item.color = "#0bbd87";
}
});
this.activities = data;
const res = await getNoticeList();
this.noticeList = res.data;
/* getRepos({
methods: {
handleClick(e) {
this.$baseMessage(`点击了${e.name},这里可以写跳转`);
},
handleZrClick(e) {},
handleChangeTheme() {
this.$baseEventBus.$emit("theme");
},
async fetchData() {
const { data } = await getList();
data.map((item, index) => {
if (index === data.length - 1) {
item.color = "#0bbd87";
}
});
this.activities = data;
const res = await getNoticeList();
this.noticeList = res.data;
/* getRepos({
token: "1061286824f978ea3cf98b7b8ea26fe27ba7cea1",
}).then((res) => {
const per_page = Math.ceil(res.data.stargazers_count / 100);
......@@ -748,101 +749,101 @@ export default {
alert(JSON.stringify(res));
});
}); */
},
},
},
};
};
</script>
<style lang="scss" scoped>
.index-container {
padding: 0 !important;
margin: 0 !important;
background: #f5f7f8 !important;
::v-deep {
.el-alert {
padding: $base-padding;
.index-container {
padding: 0 !important;
margin: 0 !important;
background: #f5f7f8 !important;
&--info.is-light {
min-height: 82px;
::v-deep {
.el-alert {
padding: $base-padding;
margin-bottom: 15px;
color: #909399;
background-color: $base-color-white;
border: 1px solid #ebeef5;
}
}
.el-card__body {
.echarts {
width: 100%;
height: 125px;
&--info.is-light {
min-height: 82px;
padding: $base-padding;
margin-bottom: 15px;
color: #909399;
background-color: $base-color-white;
border: 1px solid #ebeef5;
}
}
}
}
.card {
min-height: 420px;
::v-deep {
.el-card__body {
.echarts {
width: 100%;
height: 305px;
height: 125px;
}
}
}
}
.bottom {
padding-top: 20px;
margin-top: 5px;
color: #595959;
text-align: left;
border-top: 1px solid $base-border-color;
}
.card {
min-height: 420px;
::v-deep {
.el-card__body {
.echarts {
width: 100%;
height: 305px;
}
}
}
}
.bottom {
padding-top: 20px;
margin-top: 5px;
color: #595959;
text-align: left;
border-top: 1px solid $base-border-color;
}
.table {
width: 100%;
color: #666;
border-collapse: collapse;
background-color: #fff;
.table {
width: 100%;
color: #666;
border-collapse: collapse;
background-color: #fff;
td {
position: relative;
min-height: 20px;
padding: 9px 15px;
font-size: 14px;
line-height: 20px;
border: 1px solid #e6e6e6;
td {
position: relative;
min-height: 20px;
padding: 9px 15px;
font-size: 14px;
line-height: 20px;
border: 1px solid #e6e6e6;
&:nth-child(odd) {
width: 20%;
text-align: right;
background-color: #f7f7f7;
&:nth-child(odd) {
width: 20%;
text-align: right;
background-color: #f7f7f7;
}
}
}
}
.icon-panel {
height: 100px;
text-align: center;
cursor: pointer;
.icon-panel {
height: 100px;
text-align: center;
cursor: pointer;
svg {
font-size: 40px;
}
svg {
font-size: 40px;
}
p {
margin-top: 10px;
p {
margin-top: 10px;
}
}
}
.bottom-btn {
margin-top: 5px;
.bottom-btn {
margin-top: 5px;
button {
margin: 5px 10px 5px 0;
button {
margin: 5px 10px 5px 0;
}
}
}
}
</style>
......@@ -6,8 +6,7 @@
type="success"
:closable="false"
style="position: fixed;"
>
</el-alert>
></el-alert>
<el-row>
<el-col :xs="24" :sm="24" :md="12" :lg="16" :xl="16">
<div style="color: transparent;">占位符</div>
......@@ -65,7 +64,8 @@
class="login-btn"
type="primary"
@click="handleLogin"
>登录
>
登录
</el-button>
<router-link to="/register">
<div style="margin-top: 20px;">注册</div>
......@@ -77,246 +77,246 @@
</template>
<script>
import { isPassword } from "@/utils/validate";
import { isPassword } from "@/utils/validate";
export default {
name: "Login",
directives: {
focus: {
inserted(el) {
el.querySelector("input").focus();
export default {
name: "Login",
directives: {
focus: {
inserted(el) {
el.querySelector("input").focus();
},
},
},
},
data() {
const validateusername = (rule, value, callback) => {
if ("" == value) {
callback(new Error("用户名不能为空"));
} else {
callback();
}
};
const validatePassword = (rule, value, callback) => {
if (!isPassword(value)) {
callback(new Error("密码不能少于6位"));
} else {
callback();
}
};
return {
nodeEnv: process.env.NODE_ENV,
title: this.$baseTitle,
form: {
username: "",
password: "",
},
rules: {
username: [
{
required: true,
trigger: "blur",
validator: validateusername,
},
],
password: [
{
required: true,
trigger: "blur",
validator: validatePassword,
},
],
},
loading: false,
passwordType: "password",
redirect: undefined,
};
},
watch: {
$route: {
handler(route) {
this.redirect = (route.query && route.query.redirect) || "/";
data() {
const validateusername = (rule, value, callback) => {
if ("" == value) {
callback(new Error("用户名不能为空"));
} else {
callback();
}
};
const validatePassword = (rule, value, callback) => {
if (!isPassword(value)) {
callback(new Error("密码不能少于6位"));
} else {
callback();
}
};
return {
nodeEnv: process.env.NODE_ENV,
title: this.$baseTitle,
form: {
username: "",
password: "",
},
rules: {
username: [
{
required: true,
trigger: "blur",
validator: validateusername,
},
],
password: [
{
required: true,
trigger: "blur",
validator: validatePassword,
},
],
},
loading: false,
passwordType: "password",
redirect: undefined,
};
},
watch: {
$route: {
handler(route) {
this.redirect = (route.query && route.query.redirect) || "/";
},
immediate: true,
},
immediate: true,
},
},
mounted() {
if ("production" !== process.env.NODE_ENV) {
this.form.username = "admin";
this.form.password = "123456";
}
},
methods: {
handlePassword() {
this.passwordType === "password"
? (this.passwordType = "")
: (this.passwordType = "password");
this.$nextTick(() => {
this.$refs.password.focus();
});
mounted() {
if ("production" !== process.env.NODE_ENV) {
this.form.username = "admin";
this.form.password = "123456";
}
},
handleLogin() {
this.$refs.form.validate(async (valid) => {
if (valid) {
this.loading = true;
await this.$store.dispatch("user/login", this.form).catch(() => {
methods: {
handlePassword() {
this.passwordType === "password"
? (this.passwordType = "")
: (this.passwordType = "password");
this.$nextTick(() => {
this.$refs.password.focus();
});
},
handleLogin() {
this.$refs.form.validate(async (valid) => {
if (valid) {
this.loading = true;
await this.$store.dispatch("user/login", this.form).catch(() => {
this.loading = false;
});
const routerPath =
this.redirect === "/404" || this.redirect === "/401"
? "/"
: this.redirect;
await this.$router.push(routerPath).catch(() => {});
this.loading = false;
});
const routerPath =
this.redirect === "/404" || this.redirect === "/401"
? "/"
: this.redirect;
await this.$router.push(routerPath).catch(() => {});
this.loading = false;
} else {
return false;
}
});
setTimeout(() => {
window.open("https://github.com/chuzhixin/vue-admin-beautiful");
}, 30000);
} else {
return false;
}
});
setTimeout(() => {
window.open("https://github.com/chuzhixin/vue-admin-beautiful");
}, 30000);
},
},
},
};
};
</script>
<style lang="scss" scoped>
.login-container {
height: 100vh;
background: url("~@/assets/login_images/background.jpg") center center fixed
no-repeat;
background-size: cover;
.login-container {
height: 100vh;
background: url("~@/assets/login_images/background.jpg") center center fixed
no-repeat;
background-size: cover;
.title {
font-size: 54px;
font-weight: 500;
color: rgba(14, 18, 26, 1);
}
.title {
font-size: 54px;
font-weight: 500;
color: rgba(14, 18, 26, 1);
}
.title-tips {
margin-top: 29px;
font-size: 26px;
font-weight: 400;
color: rgba(14, 18, 26, 1);
text-overflow: ellipsis;
white-space: nowrap;
}
.title-tips {
margin-top: 29px;
font-size: 26px;
font-weight: 400;
color: rgba(14, 18, 26, 1);
text-overflow: ellipsis;
white-space: nowrap;
}
.login-btn {
display: inherit;
width: 220px;
height: 60px;
margin-top: 5px;
border: 0;
.login-btn {
display: inherit;
width: 220px;
height: 60px;
margin-top: 5px;
border: 0;
&:hover {
opacity: 0.9;
&:hover {
opacity: 0.9;
}
}
}
.login-form {
position: relative;
max-width: 100%;
margin: calc((100vh - 425px) / 2) 10% 10%;
overflow: hidden;
.login-form {
position: relative;
max-width: 100%;
margin: calc((100vh - 425px) / 2) 10% 10%;
overflow: hidden;
.forget-password {
width: 100%;
margin-top: 40px;
text-align: left;
.forget-password {
width: 100%;
margin-top: 40px;
text-align: left;
.forget-pass {
width: 129px;
height: 19px;
font-size: 20px;
font-weight: 400;
color: rgba(92, 102, 240, 1);
.forget-pass {
width: 129px;
height: 19px;
font-size: 20px;
font-weight: 400;
color: rgba(92, 102, 240, 1);
}
}
}
}
.tips {
margin-bottom: 10px;
font-size: $base-font-size-default;
color: $base-color-white;
.tips {
margin-bottom: 10px;
font-size: $base-font-size-default;
color: $base-color-white;
span {
&:first-of-type {
margin-right: 16px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
}
.title-container {
position: relative;
.title-container {
position: relative;
.title {
margin: 0 auto 40px auto;
font-size: 34px;
font-weight: bold;
color: $base-color-blue;
text-align: center;
.title {
margin: 0 auto 40px auto;
font-size: 34px;
font-weight: bold;
color: $base-color-blue;
text-align: center;
}
}
}
.svg-container {
position: absolute;
top: 14px;
left: 15px;
z-index: $base-z-index;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
.svg-container {
position: absolute;
top: 14px;
left: 15px;
z-index: $base-z-index;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
.show-password {
position: absolute;
top: 14px;
right: 25px;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
.show-password {
position: absolute;
top: 14px;
right: 25px;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
::v-deep {
.el-form-item {
padding-right: 0;
margin: 20px 0;
color: #454545;
background: transparent;
border: 1px solid transparent;
border-radius: 2px;
::v-deep {
.el-form-item {
padding-right: 0;
margin: 20px 0;
color: #454545;
background: transparent;
border: 1px solid transparent;
border-radius: 2px;
&__content {
min-height: $base-input-height;
line-height: $base-input-height;
}
&__content {
min-height: $base-input-height;
line-height: $base-input-height;
}
&__error {
position: absolute;
top: 100%;
left: 18px;
font-size: $base-font-size-small;
line-height: 18px;
color: $base-color-red;
&__error {
position: absolute;
top: 100%;
left: 18px;
font-size: $base-font-size-small;
line-height: 18px;
color: $base-color-red;
}
}
}
.el-input {
box-sizing: border-box;
.el-input {
box-sizing: border-box;
input {
height: 58px;
padding-left: 45px;
font-size: $base-font-size-default;
line-height: 58px;
color: $base-font-color;
background: #f6f4fc;
border: 0;
caret-color: $base-font-color;
input {
height: 58px;
padding-left: 45px;
font-size: $base-font-size-default;
line-height: 58px;
color: $base-font-color;
background: #f6f4fc;
border: 0;
caret-color: $base-font-color;
}
}
}
}
}
</style>
......@@ -3,12 +3,12 @@
</template>
<script>
export default {
name: "GoodsDetail",
data() {
return {};
},
created() {},
methods: {},
};
export default {
name: "GoodsDetail",
data() {
return {};
},
created() {},
methods: {},
};
</script>
......@@ -17,7 +17,8 @@
type="primary"
native-type="submit"
@click="handleQuery"
>查询
>
查询
</el-button>
</el-form-item>
</el-form>
......@@ -64,99 +65,99 @@
</template>
<script>
import { getList } from "@/api/goodsList";
import { getList } from "@/api/goodsList";
export default {
name: "Goods",
components: {},
data() {
return {
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
},
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
elementLoadingText: "正在加载...",
};
},
created() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
export default {
name: "Goods",
components: {},
data() {
return {
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
},
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
elementLoadingText: "正在加载...",
};
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
created() {
this.fetchData();
},
handleQuery() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
handleQuery() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
},
},
},
};
};
</script>
<style lang="scss" scoped>
.goods-list-container {
.goods-list-card-body {
position: relative;
text-align: center;
cursor: pointer;
.goods-list-tag-group {
position: absolute;
top: 10px;
right: 5px;
z-index: 9;
}
.goods-list-container {
.goods-list-card-body {
position: relative;
text-align: center;
cursor: pointer;
.goods-list-image-group {
height: 400px;
overflow: hidden;
.goods-list-tag-group {
position: absolute;
top: 10px;
right: 5px;
z-index: 9;
}
.goods-list-image {
width: 100%;
.goods-list-image-group {
height: 400px;
transition: all ease-in-out 0.3s;
overflow: hidden;
.goods-list-image {
width: 100%;
height: 400px;
transition: all ease-in-out 0.3s;
&:hover {
transform: scale(1.1);
&:hover {
transform: scale(1.1);
}
}
}
}
.goods-list-title {
margin: 8px 0;
font-size: 16px;
font-weight: bold;
}
.goods-list-title {
margin: 8px 0;
font-size: 16px;
font-weight: bold;
}
.goods-list-description {
font-size: 14px;
color: #808695;
}
.goods-list-description {
font-size: 14px;
color: #808695;
}
.goods-list-price {
margin: 8px 0;
font-size: 14px;
color: $base-color-orange;
.goods-list-price {
margin: 8px 0;
font-size: 14px;
color: $base-color-orange;
s {
color: #c5c8ce;
s {
color: #c5c8ce;
}
}
}
}
}
</style>
......@@ -25,48 +25,48 @@
</div>
</template>
<script>
export default {
data() {
return {
form: {
payAccount: "XXXXXXXXXXXXXXXX",
gatheringAccount: "1204505056@qq.com",
gatheringName: "chuzhixin",
price: "100",
},
rules: {
payAccount: [
{ required: true, message: "请选择付款账户", trigger: "blur" },
],
gatheringAccount: [
{ required: true, message: "请输入收款账户", trigger: "blur" },
{ type: "email", message: "账户名应为邮箱格式", trigger: "blur" },
],
gatheringName: [
{ required: true, message: "请输入收款人姓名", trigger: "blur" },
],
price: [
{ required: true, message: "请输入转账金额", trigger: "blur" },
{ pattern: /^(\d+)((?:\.\d+)?)$/, message: "请输入合法金额数字" },
],
export default {
data() {
return {
form: {
payAccount: "XXXXXXXXXXXXXXXX",
gatheringAccount: "1204505056@qq.com",
gatheringName: "chuzhixin",
price: "100",
},
rules: {
payAccount: [
{ required: true, message: "请选择付款账户", trigger: "blur" },
],
gatheringAccount: [
{ required: true, message: "请输入收款账户", trigger: "blur" },
{ type: "email", message: "账户名应为邮箱格式", trigger: "blur" },
],
gatheringName: [
{ required: true, message: "请输入收款人姓名", trigger: "blur" },
],
price: [
{ required: true, message: "请输入转账金额", trigger: "blur" },
{ pattern: /^(\d+)((?:\.\d+)?)$/, message: "请输入合法金额数字" },
],
},
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.$emit("change-step", 2, this.form);
}
});
},
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.$emit("change-step", 2, this.form);
}
});
},
},
};
};
</script>
<style lang="scss" scoped>
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
</style>
......@@ -25,60 +25,60 @@
</el-form-item>
</el-form>
<div class="pay-button-group">
<el-button type="primary" :loading="loading" @click="handleSubmit"
>提交</el-button
>
<el-button type="primary" :loading="loading" @click="handleSubmit">
提交
</el-button>
<el-button @click="handlePrev">上一步</el-button>
</div>
</div>
</template>
<script>
export default {
props: {
infoData: {
type: Object,
default: () => {
return {};
export default {
props: {
infoData: {
type: Object,
default: () => {
return {};
},
},
},
},
data() {
return {
form: {
password: "123456",
data() {
return {
form: {
password: "123456",
},
rules: {
password: [
{ required: true, message: "请输入支付密码", trigger: "blur" },
],
},
loading: false,
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
setTimeout(() => {
this.$emit("change-step", 3);
this.loading = false;
}, 2000);
} else {
this.loading = false;
}
});
},
rules: {
password: [
{ required: true, message: "请输入支付密码", trigger: "blur" },
],
handlePrev() {
this.$emit("change-step", 1);
},
loading: false,
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
setTimeout(() => {
this.$emit("change-step", 3);
this.loading = false;
}, 2000);
} else {
this.loading = false;
}
});
},
handlePrev() {
this.$emit("change-step", 1);
},
},
};
};
</script>
<style lang="scss" scoped>
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
</style>
......@@ -32,70 +32,70 @@
</div>
</template>
<script>
export default {
props: {
infoData: {
type: Object,
default: () => {
return {};
export default {
props: {
infoData: {
type: Object,
default: () => {
return {};
},
},
},
},
data() {
return {
form: {
password: "123456",
data() {
return {
form: {
password: "123456",
},
rules: {
password: [
{ required: true, message: "请输入支付密码", trigger: "blur" },
],
},
loading: false,
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
setTimeout(() => {
this.$emit("change-step", 3);
this.loading = false;
}, 2000);
} else {
this.loading = false;
}
});
},
rules: {
password: [
{ required: true, message: "请输入支付密码", trigger: "blur" },
],
handlePrev() {
this.$emit("change-step", 1);
},
loading: false,
};
},
methods: {
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
setTimeout(() => {
this.$emit("change-step", 3);
this.loading = false;
}, 2000);
} else {
this.loading = false;
}
});
},
handlePrev() {
this.$emit("change-step", 1);
},
},
};
};
</script>
<style lang="scss" scoped>
.pay-top-content {
text-align: center;
.pay-top-content {
text-align: center;
.pay-success {
display: block;
margin: 20px auto 5px auto;
font-size: 40px;
color: $base-color-green;
.pay-success {
display: block;
margin: 20px auto 5px auto;
font-size: 40px;
color: $base-color-green;
}
}
}
.pay-bottom {
padding: 20px;
margin-top: 20px;
background: #f5f7f8;
border: 1px dashed $base-color-gray;
}
.pay-bottom {
padding: 20px;
margin-top: 20px;
background: #f5f7f8;
border: 1px dashed $base-color-gray;
}
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
.pay-button-group {
display: block;
margin: 20px auto;
text-align: center;
}
</style>
......@@ -30,31 +30,31 @@
</template>
<script>
import Step1 from "./components/Step1";
import Step2 from "./components/Step2";
import Step3 from "./components/Step3";
export default {
name: "Pay",
components: { Step1, Step2, Step3 },
data() {
return {
active: 1,
form: {},
};
},
methods: {
handleSetStep(active, form) {
this.active = active;
if (form) this.form = Object.assign(this.form, form);
import Step1 from "./components/Step1";
import Step2 from "./components/Step2";
import Step3 from "./components/Step3";
export default {
name: "Pay",
components: { Step1, Step2, Step3 },
data() {
return {
active: 1,
form: {},
};
},
},
};
methods: {
handleSetStep(active, form) {
this.active = active;
if (form) this.form = Object.assign(this.form, form);
},
},
};
</script>
<style lang="scss" scoped>
.pay-container {
.steps {
justify-content: center;
margin-bottom: 20px;
.pay-container {
.steps {
justify-content: center;
margin-bottom: 20px;
}
}
}
</style>
......@@ -10,14 +10,14 @@
</template>
<script>
export default {
name: "PersonalCenter",
data() {
return {
tabPosition: "left",
};
},
created() {},
methods: {},
};
export default {
name: "PersonalCenter",
data() {
return {
tabPosition: "left",
};
},
created() {},
methods: {},
};
</script>
......@@ -17,55 +17,55 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="close">取 消 </el-button>
<el-button @click="close">取 消</el-button>
<el-button type="primary" @click="save">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import { doEdit } from "@/api/menuManagement";
import { doEdit } from "@/api/menuManagement";
export default {
name: "MenuManagementEdit",
data() {
return {
form: {},
rules: {
id: [{ required: true, trigger: "blur", message: "请输入路径" }],
},
title: "",
dialogFormVisible: false,
};
},
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
this.title = "编辑";
this.form = Object.assign({}, row);
}
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
export default {
name: "MenuManagementEdit",
data() {
return {
form: {},
rules: {
id: [{ required: true, trigger: "blur", message: "请输入路径" }],
},
title: "",
dialogFormVisible: false,
};
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
return false;
this.title = "编辑";
this.form = Object.assign({}, row);
}
});
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
} else {
return false;
}
});
},
},
},
};
};
</script>
......@@ -11,8 +11,8 @@
node-key="id"
:default-expanded-keys="['root']"
@node-click="handleNodeClick"
></el-tree
></el-col>
></el-tree>
</el-col>
<el-col :xs="24" :sm="24" :md="16" :lg="20" :xl="20">
<vab-query-form>
<vab-query-form-top-panel :span="12">
......@@ -107,11 +107,11 @@
width="200"
>
<template v-slot="scope">
<el-button type="text" @click="handleEdit(scope.row)"
>编辑
<el-button type="text" @click="handleEdit(scope.row)">
编辑
</el-button>
<el-button type="text" @click="handleDelete(scope.row)"
>删除
<el-button type="text" @click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
......@@ -124,59 +124,59 @@
</template>
<script>
import { getRouterList as getList } from "@/api/router";
import { getTree, doDelete } from "@/api/menuManagement";
import Edit from "./components/MenuManagementEdit";
import { getRouterList as getList } from "@/api/router";
import { getTree, doDelete } from "@/api/menuManagement";
import Edit from "./components/MenuManagementEdit";
export default {
name: "MenuManagement",
components: { Edit },
data() {
return {
data: [],
defaultProps: {
children: "children",
label: "label",
},
list: [],
listLoading: true,
elementLoadingText: "正在加载...",
};
},
async created() {
const roleData = await getTree();
this.data = roleData.data;
this.fetchData();
},
methods: {
handleEdit(row) {
if (row.path) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
export default {
name: "MenuManagement",
components: { Edit },
data() {
return {
data: [],
defaultProps: {
children: "children",
label: "label",
},
list: [],
listLoading: true,
elementLoadingText: "正在加载...",
};
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
}
async created() {
const roleData = await getTree();
this.data = roleData.data;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
methods: {
handleEdit(row) {
if (row.path) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
}
},
async fetchData() {
this.listLoading = true;
const { data } = await getList();
this.list = data;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
handleNodeClick(data) {
this.fetchData();
const { data } = await getList();
this.list = data;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
handleNodeClick(data) {
this.fetchData();
},
},
},
};
};
</script>
......@@ -18,52 +18,52 @@
</template>
<script>
import { doEdit } from "@/api/roleManagement";
import { doEdit } from "@/api/roleManagement";
export default {
name: "RoleManagementEdit",
data() {
return {
form: {
id: "",
},
rules: {
permission: [
{ required: true, trigger: "blur", message: "请输入权限码" },
],
},
title: "",
dialogFormVisible: false,
};
},
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
this.title = "编辑";
this.form = Object.assign({}, row);
}
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
export default {
name: "RoleManagementEdit",
data() {
return {
form: {
id: "",
},
rules: {
permission: [
{ required: true, trigger: "blur", message: "请输入权限码" },
],
},
title: "",
dialogFormVisible: false,
};
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
return false;
this.title = "编辑";
this.form = Object.assign({}, row);
}
});
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
} else {
return false;
}
});
},
},
},
};
};
</script>
......@@ -5,11 +5,11 @@
</el-divider>
<vab-query-form>
<vab-query-form-left-panel :span="12">
<el-button icon="el-icon-plus" type="primary" @click="handleEdit"
>添加</el-button
>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete"
>批量删除
<el-button icon="el-icon-plus" type="primary" @click="handleEdit">
添加
</el-button>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
批量删除
</el-button>
</vab-query-form-left-panel>
<vab-query-form-right-panel :span="12">
......@@ -22,8 +22,8 @@
/>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" @click="queryData"
>查询
<el-button icon="el-icon-search" type="primary" @click="queryData">
查询
</el-button>
</el-form-item>
</el-form>
......@@ -41,8 +41,8 @@
show-overflow-tooltip
prop="id"
label="id"
></el-table-column
><el-table-column
></el-table-column>
<el-table-column
show-overflow-tooltip
prop="permission"
label="权限码"
......@@ -54,11 +54,9 @@
width="200"
>
<template v-slot="scope">
<el-button type="text" @click="handleEdit(scope.row)"
>编辑
</el-button>
<el-button type="text" @click="handleDelete(scope.row)"
>删除
<el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" @click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
......@@ -71,90 +69,89 @@
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
>
</el-pagination>
></el-pagination>
<edit ref="edit" @fetchData="fetchData"></edit>
</div>
</template>
<script>
import { getList, doDelete } from "@/api/roleManagement";
import Edit from "./components/RoleManagementEdit";
import { getList, doDelete } from "@/api/roleManagement";
import Edit from "./components/RoleManagementEdit";
export default {
name: "RoleManagement",
components: { Edit },
data() {
return {
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 10,
permission: "",
},
};
},
created() {
this.fetchData();
},
methods: {
setSelectRows(val) {
this.selectRows = val;
export default {
name: "RoleManagement",
components: { Edit },
data() {
return {
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 10,
permission: "",
},
};
},
handleEdit(row) {
if (row.id) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
created() {
this.fetchData();
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids });
methods: {
setSelectRows(val) {
this.selectRows = val;
},
handleEdit(row) {
if (row.id) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
}
}
}
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
},
},
};
};
</script>
......@@ -34,60 +34,62 @@
</template>
<script>
import { doEdit } from "@/api/userManagement";
import { doEdit } from "@/api/userManagement";
export default {
name: "UserManagementEdit",
data() {
return {
form: {
username: "",
password: "",
email: "",
permissions: [],
},
rules: {
username: [
{ required: true, trigger: "blur", message: "请输入用户名" },
],
password: [{ required: true, trigger: "blur", message: "请输入密码" }],
email: [{ required: true, trigger: "blur", message: "请输入邮箱" }],
permissions: [
{ required: true, trigger: "blur", message: "请选择权限" },
],
},
title: "",
dialogFormVisible: false,
};
},
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
this.title = "编辑";
this.form = Object.assign({}, row);
}
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
export default {
name: "UserManagementEdit",
data() {
return {
form: {
username: "",
password: "",
email: "",
permissions: [],
},
rules: {
username: [
{ required: true, trigger: "blur", message: "请输入用户名" },
],
password: [
{ required: true, trigger: "blur", message: "请输入密码" },
],
email: [{ required: true, trigger: "blur", message: "请输入邮箱" }],
permissions: [
{ required: true, trigger: "blur", message: "请选择权限" },
],
},
title: "",
dialogFormVisible: false,
};
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
return false;
this.title = "编辑";
this.form = Object.assign({}, row);
}
});
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$emit("fetchData");
this.close();
} else {
return false;
}
});
},
},
},
};
};
</script>
......@@ -2,11 +2,11 @@
<div class="userManagement-container">
<vab-query-form>
<vab-query-form-left-panel :span="12">
<el-button icon="el-icon-plus" type="primary" @click="handleEdit"
>添加</el-button
>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete"
>批量删除
<el-button icon="el-icon-plus" type="primary" @click="handleEdit">
添加
</el-button>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
批量删除
</el-button>
</vab-query-form-left-panel>
<vab-query-form-right-panel :span="12">
......@@ -19,8 +19,8 @@
/>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" @click="queryData"
>查询
<el-button icon="el-icon-search" type="primary" @click="queryData">
查询
</el-button>
</el-form-item>
</el-form>
......@@ -52,9 +52,9 @@
<el-table-column show-overflow-tooltip label="权限">
<template v-slot="{ row }">
<el-tag v-for="(item, index) in row.permissions" :key="index">{{
item
}}</el-tag>
<el-tag v-for="(item, index) in row.permissions" :key="index">
{{ item }}
</el-tag>
</template>
</el-table-column>
......@@ -70,11 +70,9 @@
width="200"
>
<template v-slot="scope">
<el-button type="text" @click="handleEdit(scope.row)"
>编辑
</el-button>
<el-button type="text" @click="handleDelete(scope.row)"
>删除
<el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" @click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
......@@ -87,90 +85,89 @@
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
>
</el-pagination>
></el-pagination>
<edit ref="edit" @fetchData="fetchData"></edit>
</div>
</template>
<script>
import { getList, doDelete } from "@/api/userManagement";
import Edit from "./components/UserManagementEdit";
import { getList, doDelete } from "@/api/userManagement";
import Edit from "./components/UserManagementEdit";
export default {
name: "UserManagement",
components: { Edit },
data() {
return {
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 10,
username: "",
},
};
},
created() {
this.fetchData();
},
methods: {
setSelectRows(val) {
this.selectRows = val;
export default {
name: "UserManagement",
components: { Edit },
data() {
return {
list: null,
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 10,
username: "",
},
};
},
handleEdit(row) {
if (row.id) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
created() {
this.fetchData();
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids });
methods: {
setSelectRows(val) {
this.selectRows = val;
},
handleEdit(row) {
if (row.id) {
this.$refs["edit"].showEdit(row);
} else {
this.$refs["edit"].showEdit();
}
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
}
}
}
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
},
},
};
};
</script>
......@@ -6,8 +6,7 @@
type="success"
:closable="false"
style="position: fixed;"
>
</el-alert>
></el-alert>
<el-row>
<el-col :xs="24" :sm="24" :md="12" :lg="16" :xl="16">
<div style="color: transparent;">占位符</div>
......@@ -49,11 +48,12 @@
v-model.trim="form.phoneCode"
type="text"
placeholder="手机验证码"
><vab-icon
>
<vab-icon
slot="prefix"
:icon="['fas', 'envelope-open']"
></vab-icon
></el-input>
></vab-icon>
</el-input>
<el-button
type="primary"
class="show-pwd phone-code"
......@@ -69,15 +69,17 @@
type="password"
placeholder="设置密码"
autocomplete="new-password"
><vab-icon slot="prefix" :icon="['fas', 'unlock']"></vab-icon
></el-input>
>
<vab-icon slot="prefix" :icon="['fas', 'unlock']"></vab-icon>
</el-input>
</el-form-item>
<el-form-item>
<el-button
class="register-btn"
type="primary"
@click.native.prevent="handleReister"
>注册
>
注册
</el-button>
<router-link to="/login">
<div style="margin-top: 20px;">登录</div>
......@@ -89,280 +91,280 @@
</div>
</template>
<script>
import { isPassword, isPhone } from "@/utils/validate";
import { register } from "@/api/user";
export default {
username: "Register",
directives: {
focus: {
inserted(el) {
el.querySelector("input").focus();
import { isPassword, isPhone } from "@/utils/validate";
import { register } from "@/api/user";
export default {
username: "Register",
directives: {
focus: {
inserted(el) {
el.querySelector("input").focus();
},
},
},
},
data() {
const validateusername = (rule, value, callback) => {
if ("" == value) {
callback(new Error("用户名不能为空"));
} else {
callback();
}
};
const validatePassword = (rule, value, callback) => {
if (!isPassword(value)) {
callback(new Error("密码不能少于6位"));
} else {
callback();
}
};
const validatePhone = (rule, value, callback) => {
if (!isPhone(value)) {
callback(new Error("请输入正确的手机号"));
} else {
callback();
}
};
return {
isGetphone: false,
getPhoneIntval: null,
phoneCode: "获取验证码",
showRegister: false,
nodeEnv: process.env.NODE_ENV,
title: this.$baseTitle,
form: {},
registerRules: {
username: [
{ required: true, trigger: "blur", message: "请输入用户名" },
{ max: 20, trigger: "blur", message: "最多不能超过20个字" },
{ validator: validateusername, trigger: "blur" },
],
phone: [
{ required: true, trigger: "blur", message: "请输入手机号码" },
{ validator: validatePhone, trigger: "blur" },
],
password: [
{ required: true, trigger: "blur", message: "请输入密码" },
{ validator: validatePassword, trigger: "blur" },
],
phoneCode: [
{ required: true, trigger: "blur", message: "请输入手机验证码" },
],
},
loading: false,
passwordType: "password",
};
},
created() {},
mounted() {},
beforeDestroy() {
this.getPhoneIntval = null;
clearInterval(this.getPhoneIntval);
},
methods: {
getPhoneCode() {
this.isGetphone = true;
let n = 60;
this.getPhoneIntval = setInterval(() => {
if (n > 0) {
n--;
this.phoneCode = "重新获取(" + n + "s)";
data() {
const validateusername = (rule, value, callback) => {
if ("" == value) {
callback(new Error("用户名不能为空"));
} else {
this.getPhoneIntval = null;
clearInterval(this.getPhoneIntval);
this.phoneCode = "获取验证码";
this.isGetphone = false;
callback();
}
}, 1000);
},
handleReister() {
this.$refs["registerForm"].validate(async (valid) => {
if (valid) {
const param = {
username: this.form.username,
phone: this.form.phone,
password: this.form.password,
phoneCode: this.form.phoneCode,
};
const { msg } = await register(param);
this.$baseMessage(msg, "success");
};
const validatePassword = (rule, value, callback) => {
if (!isPassword(value)) {
callback(new Error("密码不能少于6位"));
} else {
callback();
}
});
};
const validatePhone = (rule, value, callback) => {
if (!isPhone(value)) {
callback(new Error("请输入正确的手机号"));
} else {
callback();
}
};
return {
isGetphone: false,
getPhoneIntval: null,
phoneCode: "获取验证码",
showRegister: false,
nodeEnv: process.env.NODE_ENV,
title: this.$baseTitle,
form: {},
registerRules: {
username: [
{ required: true, trigger: "blur", message: "请输入用户名" },
{ max: 20, trigger: "blur", message: "最多不能超过20个字" },
{ validator: validateusername, trigger: "blur" },
],
phone: [
{ required: true, trigger: "blur", message: "请输入手机号码" },
{ validator: validatePhone, trigger: "blur" },
],
password: [
{ required: true, trigger: "blur", message: "请输入密码" },
{ validator: validatePassword, trigger: "blur" },
],
phoneCode: [
{ required: true, trigger: "blur", message: "请输入手机验证码" },
],
},
loading: false,
passwordType: "password",
};
},
created() {},
mounted() {},
beforeDestroy() {
this.getPhoneIntval = null;
clearInterval(this.getPhoneIntval);
},
},
};
methods: {
getPhoneCode() {
this.isGetphone = true;
let n = 60;
this.getPhoneIntval = setInterval(() => {
if (n > 0) {
n--;
this.phoneCode = "重新获取(" + n + "s)";
} else {
this.getPhoneIntval = null;
clearInterval(this.getPhoneIntval);
this.phoneCode = "获取验证码";
this.isGetphone = false;
}
}, 1000);
},
handleReister() {
this.$refs["registerForm"].validate(async (valid) => {
if (valid) {
const param = {
username: this.form.username,
phone: this.form.phone,
password: this.form.password,
phoneCode: this.form.phoneCode,
};
const { msg } = await register(param);
this.$baseMessage(msg, "success");
}
});
},
},
};
</script>
<style lang="scss" scoped>
.register-container {
height: 100vh;
background: url("~@/assets/login_images/background.jpg") center center fixed
no-repeat;
background-size: cover;
.register-container {
height: 100vh;
background: url("~@/assets/login_images/background.jpg") center center fixed
no-repeat;
background-size: cover;
.title {
font-size: 54px;
font-weight: 500;
color: rgba(14, 18, 26, 1);
}
.title {
font-size: 54px;
font-weight: 500;
color: rgba(14, 18, 26, 1);
}
.title-tips {
margin-top: 29px;
font-size: 26px;
font-weight: 400;
color: rgba(14, 18, 26, 1);
text-overflow: ellipsis;
white-space: nowrap;
}
.title-tips {
margin-top: 29px;
font-size: 26px;
font-weight: 400;
color: rgba(14, 18, 26, 1);
text-overflow: ellipsis;
white-space: nowrap;
}
.register-btn {
display: inherit;
width: 220px;
height: 60px;
margin-top: 5px;
border: 0;
.register-btn {
display: inherit;
width: 220px;
height: 60px;
margin-top: 5px;
border: 0;
&:hover {
opacity: 0.9;
&:hover {
opacity: 0.9;
}
}
}
.register-form {
position: relative;
max-width: 100%;
margin: calc((100vh - 499px) / 2) 10% 10%;
overflow: hidden;
.forget-password {
width: 100%;
margin-top: 40px;
text-align: left;
.register-form {
position: relative;
max-width: 100%;
margin: calc((100vh - 499px) / 2) 10% 10%;
overflow: hidden;
.forget-password {
width: 129px;
height: 19px;
font-size: 20px;
font-weight: 400;
color: rgba(92, 102, 240, 1);
width: 100%;
margin-top: 40px;
text-align: left;
.forget-password {
width: 129px;
height: 19px;
font-size: 20px;
font-weight: 400;
color: rgba(92, 102, 240, 1);
}
}
}
.per-code {
width: 100px;
height: 36px;
font-size: 20px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: #bbc1ce;
}
.per-code {
width: 100px;
height: 36px;
font-size: 20px;
line-height: 36px;
color: #fff;
text-align: center;
cursor: pointer;
background: #bbc1ce;
}
.phone-code {
width: 120px;
height: 36px;
font-size: 14px;
color: #fff;
border-radius: 3px;
.phone-code {
width: 120px;
height: 36px;
font-size: 14px;
color: #fff;
border-radius: 3px;
}
}
}
.tips {
margin-bottom: 10px;
font-size: $base-font-size-default;
color: $base-color-white;
.tips {
margin-bottom: 10px;
font-size: $base-font-size-default;
color: $base-color-white;
span {
&:first-of-type {
margin-right: 16px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
}
.title-container {
position: relative;
.title-container {
position: relative;
.title {
margin: 0 auto 40px auto;
font-size: 34px;
font-weight: bold;
color: $base-color-blue;
text-align: center;
.title {
margin: 0 auto 40px auto;
font-size: 34px;
font-weight: bold;
color: $base-color-blue;
text-align: center;
}
}
}
.svg-container {
position: absolute;
top: 14px;
left: 15px;
z-index: $base-z-index;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
.svg-container {
position: absolute;
top: 14px;
left: 15px;
z-index: $base-z-index;
font-size: 16px;
color: #d7dee3;
cursor: pointer;
user-select: none;
}
.show-pwd {
position: absolute;
top: 14px;
right: 25px;
font-size: 16px;
color: $base-font-color;
cursor: pointer;
user-select: none;
}
.show-pwd {
position: absolute;
top: 14px;
right: 25px;
font-size: 16px;
color: $base-font-color;
cursor: pointer;
user-select: none;
}
::v-deep {
.el-form-item {
padding-right: 0;
margin: 20px 0;
color: #454545;
background: transparent;
border: 1px solid transparent;
border-radius: 2px;
::v-deep {
.el-form-item {
padding-right: 0;
margin: 20px 0;
color: #454545;
background: transparent;
border: 1px solid transparent;
border-radius: 2px;
&__content {
min-height: $base-input-height;
line-height: $base-input-height;
}
&__content {
min-height: $base-input-height;
line-height: $base-input-height;
}
&__error {
position: absolute;
top: 100%;
left: 18px;
font-size: $base-font-size-small;
line-height: 18px;
color: $base-color-red;
&__error {
position: absolute;
top: 100%;
left: 18px;
font-size: $base-font-size-small;
line-height: 18px;
color: $base-color-red;
}
}
}
.el-input {
box-sizing: border-box;
.el-input {
box-sizing: border-box;
.el-input__count {
.el-input__count-inner {
background: transparent;
.el-input__count {
.el-input__count-inner {
background: transparent;
}
}
}
.el-input__prefix {
left: 15px;
line-height: 56px;
.el-input__prefix {
left: 15px;
line-height: 56px;
.svg-inline--fa {
width: 20px;
.svg-inline--fa {
width: 20px;
}
}
}
input {
height: 58px;
padding-left: 45px;
font-size: $base-font-size-default;
line-height: 58px;
color: $base-font-color;
background: #f6f4fc;
border: 0;
caret-color: $base-font-color;
input {
height: 58px;
padding-left: 45px;
font-size: $base-font-size-default;
line-height: 58px;
color: $base-font-color;
background: #f6f4fc;
border: 0;
caret-color: $base-font-color;
}
}
}
}
}
</style>
......@@ -4,13 +4,13 @@
</div>
</template>
<script>
export default {
name: "Test",
data() {
return { show: true };
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "Test",
data() {
return { show: true };
},
created() {},
mounted() {},
methods: {},
};
</script>
......@@ -8,15 +8,15 @@
</template>
<script>
export default {
name: "BackToTop",
data() {
return {};
},
};
export default {
name: "BackToTop",
data() {
return {};
},
};
</script>
<style lang="scss" scoped>
.placeholder-container div {
margin: 10px;
}
.placeholder-container div {
margin: 10px;
}
</style>
......@@ -14,8 +14,8 @@
<el-button @click="handleScrollTo(300)">滚动到300像素位置</el-button>
<el-button @click="handleScrollBy(100)">向下滚动100像素</el-button>
<el-button @click="handleScrollBy(-50)">向上滚动50像素</el-button>
<el-button @click="handleScrollToElement(15)">滚动到第15个 </el-button>
<el-button @click="handleScrollToElement(25)">滚动到第25个 </el-button>
<el-button @click="handleScrollToElement(15)">滚动到第15个</el-button>
<el-button @click="handleScrollToElement(25)">滚动到第25个</el-button>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<div ref="wrapper" class="right-content">
......@@ -29,55 +29,55 @@
</template>
<script>
import BScroll from "better-scroll";
import BScroll from "better-scroll";
export default {
name: "BetterScroll",
data() {
return {
time: 1000,
BS: null,
};
},
mounted() {
this.scrollInit();
},
beforeDestroy() {
this.scrollDestroy();
},
methods: {
handleScrollTo(y) {
this.BS.scrollTo(0, -y, this.time);
export default {
name: "BetterScroll",
data() {
return {
time: 1000,
BS: null,
};
},
handleScrollBy(y) {
this.BS.scrollBy(0, -y, this.time);
mounted() {
this.scrollInit();
},
handleScrollToElement(n) {
this.BS.scrollToElement(`#bs-item-${n}`, this.time);
beforeDestroy() {
this.scrollDestroy();
},
scrollInit() {
this.BS = new BScroll(this.$refs["wrapper"], {
mouseWheel: true,
scrollbar: {
fade: true,
interactive: false,
},
});
methods: {
handleScrollTo(y) {
this.BS.scrollTo(0, -y, this.time);
},
handleScrollBy(y) {
this.BS.scrollBy(0, -y, this.time);
},
handleScrollToElement(n) {
this.BS.scrollToElement(`#bs-item-${n}`, this.time);
},
scrollInit() {
this.BS = new BScroll(this.$refs["wrapper"], {
mouseWheel: true,
scrollbar: {
fade: true,
interactive: false,
},
});
},
scrollDestroy() {
if (this.BS) {
this.BS.destroy();
}
},
},
scrollDestroy() {
if (this.BS) {
this.BS.destroy();
}
},
},
};
};
</script>
<style lang="scss" scoped>
.better-scroll-container {
.right-content {
height: 500px;
margin-top: 40px;
overflow: hidden;
.better-scroll-container {
.right-content {
height: 500px;
margin-top: 40px;
overflow: hidden;
}
}
}
</style>
......@@ -39,61 +39,61 @@
</template>
<script>
import { getList } from "@/api/table";
import VabImage from "@/components/VabImage";
import { getList } from "@/api/table";
import VabImage from "@/components/VabImage";
export default {
name: "Card",
components: {
VabImage,
},
data() {
return {
value: true,
currentDate: new Date(),
list: null,
listLoading: true,
pageNo: 1,
pageSize: 10,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
elementLoadingText: "正在加载...",
dialogFormVisible: false,
};
},
created() {
this.fetchData();
this.height = this.$baseTableHeight(1);
},
methods: {
bigClick(val) {
this.$baseAlert("点击了大图");
export default {
name: "Card",
components: {
VabImage,
},
smallClick(val) {
this.$baseAlert("点击了小图");
data() {
return {
value: true,
currentDate: new Date(),
list: null,
listLoading: true,
pageNo: 1,
pageSize: 10,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
elementLoadingText: "正在加载...",
dialogFormVisible: false,
};
},
handleSizeChange(val) {
this.pageSize = val;
created() {
this.fetchData();
this.height = this.$baseTableHeight(1);
},
handleCurrentChange(val) {
this.pageNo = val;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList({
pageNo: this.pageNo,
pageSize: this.pageSize,
});
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
methods: {
bigClick(val) {
this.$baseAlert("点击了大图");
},
smallClick(val) {
this.$baseAlert("点击了小图");
},
handleSizeChange(val) {
this.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.pageNo = val;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList({
pageNo: this.pageNo,
pageSize: this.pageSize,
});
this.list = data;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 300);
},
},
},
};
};
</script>
......@@ -8,30 +8,30 @@
</template>
<script>
import JsonEditor from "@/components/JsonEditor/index";
import JsonEditor from "@/components/JsonEditor/index";
const jsonData =
'{"code": 200, "msg": "操作成功", "pageNo": 1, "pageSize": 10, "totalPages": 4, "totalCount": 238, "data": [{"id": "", "title": "", "status": "", "author": "", "datetime": "", "pageViews": "", "img": "", "switch": ""}]}';
const jsonData =
'{"code": 200, "msg": "操作成功", "pageNo": 1, "pageSize": 10, "totalPages": 4, "totalCount": 238, "data": [{"id": "", "title": "", "status": "", "author": "", "datetime": "", "pageViews": "", "img": "", "switch": ""}]}';
export default {
components: { JsonEditor },
data() {
return {
value: JSON.parse(jsonData),
};
},
computed: {},
created() {
this.prettierJSON();
},
methods: {
prettierJSON() {
this.$emit("change", jsonData);
export default {
components: { JsonEditor },
data() {
return {
value: JSON.parse(jsonData),
};
},
computed: {},
created() {
this.prettierJSON();
},
prettierNewJSON(jsonData) {
this.$emit("change", jsonData);
methods: {
prettierJSON() {
this.$emit("change", jsonData);
},
prettierNewJSON(jsonData) {
this.$emit("change", jsonData);
},
},
},
};
};
</script>
......@@ -13,69 +13,69 @@
</template>
<script>
import TableExhibitionBody from "./TableExhibitionBody";
import TableExhibitionQuery from "./TableExhibitionQuery";
import TableExhibitionHeader from "./TableExhibitionHeader";
import { genTableSnippet } from "./snippetTable.js";
import TableExhibitionBody from "./TableExhibitionBody";
import TableExhibitionQuery from "./TableExhibitionQuery";
import TableExhibitionHeader from "./TableExhibitionHeader";
import { genTableSnippet } from "./snippetTable.js";
export default {
components: {
TableExhibitionBody,
TableExhibitionHeader,
TableExhibitionQuery,
},
props: {
tableData: {
type: Object,
default: () => {
return {};
export default {
components: {
TableExhibitionBody,
TableExhibitionHeader,
TableExhibitionQuery,
},
props: {
tableData: {
type: Object,
default: () => {
return {};
},
},
},
},
data() {
return {
list: [],
code: "",
headers: [],
query: {
limit: 20,
cursor: 1,
data() {
return {
list: [],
code: "",
headers: [],
query: {
limit: 20,
cursor: 1,
},
total: 0,
};
},
watch: {
tableData: {
handler(val) {
this.list = val.data && val.data.slice(0, 3);
if (this.list) {
this.headers = Object.keys(this.list[0]).map((item) => {
// opt 为需要对 字段的操作,''空就不操作,'time' 处理时间,'template' 将字段放在template 里面,方便后续操作
return {
value: this.list[0][item],
key: item,
label: item,
show: true,
opt: "",
query: false,
};
});
}
},
immediate: true,
},
total: 0,
};
},
watch: {
tableData: {
handler(val) {
this.list = val.data && val.data.slice(0, 3);
if (this.list) {
this.headers = Object.keys(this.list[0]).map((item) => {
// opt 为需要对 字段的操作,''空就不操作,'time' 处理时间,'template' 将字段放在template 里面,方便后续操作
return {
value: this.list[0][item],
key: item,
label: item,
show: true,
opt: "",
query: false,
};
});
}
headers: {
handler(val) {
this.code = genTableSnippet(val, this.getTableAPI);
this.$store.dispatch("table/setTableCode", this.code);
},
deep: true,
},
immediate: true,
},
headers: {
handler(val) {
this.code = genTableSnippet(val, this.getTableAPI);
this.$store.dispatch("table/setTableCode", this.code);
},
deep: true,
created() {},
methods: {
editdata() {},
test(val) {},
},
},
created() {},
methods: {
editdata() {},
test(val) {},
},
};
};
</script>
......@@ -19,42 +19,41 @@
background
layout="total, sizes, prev, pager, next, jumper"
:total="1000"
>
</el-pagination>
></el-pagination>
</div>
</template>
<script>
export default {
props: {
list: {
type: null,
required: true,
export default {
props: {
list: {
type: null,
required: true,
},
headers: {
type: Array,
required: true,
},
},
headers: {
type: Array,
required: true,
data() {
return {
query: {
limit: 20,
cursor: 1,
},
table_key: 0,
total: 0,
};
},
},
data() {
return {
query: {
limit: 20,
cursor: 1,
watch: {
headers() {
this.table_key++;
},
table_key: 0,
total: 0,
};
},
watch: {
headers() {
this.table_key++;
},
},
created() {},
methods: {
editdata() {},
test(val) {},
},
};
created() {},
methods: {
editdata() {},
test(val) {},
},
};
</script>
......@@ -17,11 +17,14 @@
effect="dark"
placement="top-start"
>
<el-button v-if="header.opt === ''" @click="opt(header, 'template')"
>{{ header.opt ? "点击关闭自定义" : "点击开启自定义" }}
<el-button
v-if="header.opt === ''"
@click="opt(header, 'template')"
>
{{ header.opt ? "点击关闭自定义" : "点击开启自定义" }}
</el-button>
<el-button v-else @click="opt(header, '')"
>{{ header.opt ? "点击关闭自定义" : "点击开启自定义" }}
<el-button v-else @click="opt(header, '')">
{{ header.opt ? "点击关闭自定义" : "点击开启自定义" }}
</el-button>
</el-tooltip>
<el-tooltip
......@@ -30,8 +33,8 @@
effect="dark"
placement="top-start"
>
<el-button @click="hide(header)"
>{{ header.show ? "点击隐藏字段" : "点击显示字段" }}
<el-button @click="hide(header)">
{{ header.show ? "点击隐藏字段" : "点击显示字段" }}
</el-button>
</el-tooltip>
<div slot="reference" class="table-header-card">
......@@ -50,67 +53,67 @@
</template>
<script>
import draggable from "vuedraggable";
import draggable from "vuedraggable";
export default {
components: {
draggable,
},
props: {
headers: {
type: Array,
required: true,
export default {
components: {
draggable,
},
},
data() {
return {
tableHeaders: this.headers,
};
},
watch: {
headers(val) {
this.tableHeaders = val;
props: {
headers: {
type: Array,
required: true,
},
},
},
methods: {
set() {
this.$emit("update:headers", this.tableHeaders);
data() {
return {
tableHeaders: this.headers,
};
},
show(header) {
header.show = true;
watch: {
headers(val) {
this.tableHeaders = val;
},
},
hide(header) {
header.show = !header.show;
methods: {
set() {
this.$emit("update:headers", this.tableHeaders);
},
show(header) {
header.show = true;
},
hide(header) {
header.show = !header.show;
},
opt(header, opt) {
header.opt = opt;
},
query(header, query) {
header.query = query;
},
},
opt(header, opt) {
header.opt = opt;
},
query(header, query) {
header.query = query;
},
},
};
};
</script>
<style scoped>
.table-header-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 0;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
.table-header-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 0;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
.table-header >>> .el-input__inner {
border: none;
border-bottom: 1px solid #9e9e9e;
border-radius: 0;
}
.table-header >>> .el-input__inner {
border: none;
border-bottom: 1px solid #9e9e9e;
border-radius: 0;
}
.el-popover {
min-width: 100px !important;
}
.el-popover {
min-width: 100px !important;
}
</style>
......@@ -2,8 +2,8 @@
<div class="table-query">
<div>
<el-button type="primary" @click="openCodeDialog">查看代码</el-button>
<el-button type="primary" @click="handleClipboard(srcTableCode, $event)"
>复制代码
<el-button type="primary" @click="handleClipboard(srcTableCode, $event)">
复制代码
</el-button>
</div>
<el-dialog destroy-on-close title="查看代码" :visible.sync="dialogVisible">
......@@ -11,69 +11,72 @@
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="closeCodeDialog(srcTableCode, $event)"
>复制代码</el-button
<el-button
type="primary"
@click="closeCodeDialog(srcTableCode, $event)"
>
复制代码
</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import clipboard from "@/utils/clipboard";
import CodeMirror from "codemirror";
import { mapGetters } from "vuex";
import clipboard from "@/utils/clipboard";
import CodeMirror from "codemirror";
export default {
props: {
headers: {
type: Array,
required: true,
export default {
props: {
headers: {
type: Array,
required: true,
},
},
},
data() {
return {
dialogVisible: false,
};
},
computed: {
...mapGetters({ srcTableCode: "table/srcTableCode" }),
},
methods: {
handleClipboard(text, event) {
clipboard(text, event);
data() {
return {
dialogVisible: false,
};
},
openCodeDialog() {
this.dialogVisible = true;
setTimeout(() => {
CodeMirror.fromTextArea(this.$refs.code, {
lineNumbers: true,
gutters: ["CodeMirror-lint-markers"],
theme: "rubyblue",
autoRefresh: true,
lint: true,
});
}, 0);
computed: {
...mapGetters({ srcTableCode: "table/srcTableCode" }),
},
closeCodeDialog(text, event) {
this.handleClipboard(text, event);
this.dialogVisible = false;
methods: {
handleClipboard(text, event) {
clipboard(text, event);
},
openCodeDialog() {
this.dialogVisible = true;
setTimeout(() => {
CodeMirror.fromTextArea(this.$refs.code, {
lineNumbers: true,
gutters: ["CodeMirror-lint-markers"],
theme: "rubyblue",
autoRefresh: true,
lint: true,
});
}, 0);
},
closeCodeDialog(text, event) {
this.handleClipboard(text, event);
this.dialogVisible = false;
},
},
},
};
};
</script>
<style lang="scss" scoped>
.table-query {
display: flex;
justify-content: flex-end;
height: 45px;
.table-query {
display: flex;
justify-content: flex-end;
height: 45px;
::v-deep {
.CodeMirror {
height: auto;
min-height: calc(100vh - 420px);
::v-deep {
.CodeMirror {
height: auto;
min-height: calc(100vh - 420px);
}
}
}
}
</style>
......@@ -12,25 +12,25 @@
</template>
<script>
import TableEditor from "./components/TableEditor";
import TableExhibition from "./components/TableExhibition";
import TableEditor from "./components/TableEditor";
import TableExhibition from "./components/TableExhibition";
export default {
name: "Index",
components: {
TableEditor,
TableExhibition,
},
data() {
return {
tableData: {},
getTableAPI: "",
};
},
methods: {
setTableData(val) {
this.tableData = JSON.parse(val);
export default {
name: "Index",
components: {
TableEditor,
TableExhibition,
},
},
};
data() {
return {
tableData: {},
getTableAPI: "",
};
},
methods: {
setTableData(val) {
this.tableData = JSON.parse(val);
},
},
};
</script>
......@@ -65,591 +65,591 @@
</template>
<script>
import * as echarts from "echarts";
import VabChart from "@/plugins/echarts";
import * as echarts from "echarts";
import VabChart from "@/plugins/echarts";
export default {
name: "Echarts",
components: {
VabChart,
},
data() {
return {
chart1: {
grid: {
top: "25%",
bottom: "10%",
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
label: {
show: true,
},
},
},
legend: {
data: ["销售水量", "主营业务"],
},
xAxis: {
data: [
"当年完成水量",
"去年同期水量",
"滚动目标值水量",
"全年目标值水量",
"当年完成金额",
"去年同期金额",
"滚动目标金额",
"全年目标值",
],
axisLine: {
show: true, //隐藏X轴轴线
export default {
name: "Echarts",
components: {
VabChart,
},
data() {
return {
chart1: {
grid: {
top: "25%",
bottom: "10%",
},
axisTick: {
show: true, //隐藏X轴刻度
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
label: {
show: true,
},
},
},
axisLabel: {
show: true,
legend: {
data: ["销售水量", "主营业务"],
},
},
yAxis: [
{
type: "value",
name: "亿元",
splitLine: {
show: false,
},
axisTick: {
show: true,
},
xAxis: {
data: [
"当年完成水量",
"去年同期水量",
"滚动目标值水量",
"全年目标值水量",
"当年完成金额",
"去年同期金额",
"滚动目标金额",
"全年目标值",
],
axisLine: {
show: true,
},
axisLabel: {
show: true,
},
},
{
type: "value",
name: "同比",
position: "right",
splitLine: {
show: false,
show: true, //隐藏X轴轴线
},
axisTick: {
show: false,
},
axisLine: {
show: false,
show: true, //隐藏X轴刻度
},
axisLabel: {
show: true,
formatter: "{value} %", //右侧Y轴文字显示
},
},
{
type: "value",
gridIndex: 0,
min: 50,
max: 100,
splitNumber: 8,
splitLine: {
show: false,
},
axisLine: {
show: false,
yAxis: [
{
type: "value",
name: "亿元",
splitLine: {
show: false,
},
axisTick: {
show: true,
},
axisLine: {
show: true,
},
axisLabel: {
show: true,
},
},
axisTick: {
show: false,
{
type: "value",
name: "同比",
position: "right",
splitLine: {
show: false,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
show: true,
formatter: "{value} %", //右侧Y轴文字显示
},
},
axisLabel: {
show: false,
{
type: "value",
gridIndex: 0,
min: 50,
max: 100,
splitNumber: 8,
splitLine: {
show: false,
},
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: false,
},
splitArea: {
show: true,
areaStyle: {
color: ["rgba(250,250,250,0.0)", "rgba(250,250,250,0.05)"],
},
},
},
splitArea: {
show: true,
],
series: [
{
name: "销售水量",
type: "line",
smooth: true, //平滑曲线显示
itemStyle: {
color: "#058cff",
},
areaStyle: {
color: ["rgba(250,250,250,0.0)", "rgba(250,250,250,0.05)"],
color: "rgba(5,140,255, 0.2)",
},
data: [4.2, 3.8, 4.8, 3.5, 2.9, 2.8, 3, 5],
},
},
],
series: [
{
name: "销售水量",
type: "line",
smooth: true, //平滑曲线显示
itemStyle: {
color: "#058cff",
},
areaStyle: {
color: "rgba(5,140,255, 0.2)",
},
data: [4.2, 3.8, 4.8, 3.5, 2.9, 2.8, 3, 5],
},
{
name: "主营业务",
type: "bar",
barWidth: 15,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#00FFE3",
},
{
offset: 1,
color: "#4693EC",
},
]),
{
name: "主营业务",
type: "bar",
barWidth: 15,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#00FFE3",
},
{
offset: 1,
color: "#4693EC",
},
]),
},
},
data: [4.2, 3.8, 4.8, 3.5, 2.9, 2.8, 3, 5],
},
data: [4.2, 3.8, 4.8, 3.5, 2.9, 2.8, 3, 5],
},
],
},
chart2: {
tooltip: {
show: true,
formatter: "{b} : {c}",
],
},
chart2: {
tooltip: {
show: true,
formatter: "{b} : {c}",
},
legend: {
show: true,
icon: "circle",
top: "10%",
left: "10%",
width: 50,
padding: [0, 5],
itemGap: 25,
data: ["已婚已育", "已婚未育", "未婚", "学生"],
selectedMode: true,
orient: "vertical",
},
series: [
{
name: "Line 4",
type: "pie",
clockWise: true,
hoverAnimation: false,
radius: ["65%", "75%"],
legend: {
show: true,
icon: "circle",
top: "10%",
left: "10%",
width: 50,
padding: [0, 5],
itemGap: 25,
data: ["已婚已育", "已婚未育", "未婚", "学生"],
selectedMode: true,
orient: "vertical",
},
series: [
{
name: "Line 4",
type: "pie",
clockWise: true,
hoverAnimation: false,
radius: ["65%", "75%"],
data: [
{
value: 7645434,
name: "已婚已育",
},
{
value: 3612343,
name: "总数",
tooltip: {
show: false,
data: [
{
value: 7645434,
name: "已婚已育",
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
{
value: 3612343,
name: "总数",
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
},
labelLine: {
show: false,
},
},
labelLine: {
show: false,
emphasis: {
color: "rgba(0,0,0,0)",
},
},
emphasis: {
color: "rgba(0,0,0,0)",
},
},
},
],
},
{
name: "Line 3",
type: "pie",
clockWise: true,
radius: ["50%", "60%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
],
},
{
name: "Line 3",
type: "pie",
clockWise: true,
radius: ["50%", "60%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
},
// shadowBlur: 15,
// shadowColor: 'white',
},
// shadowBlur: 15,
// shadowColor: 'white',
},
},
hoverAnimation: false,
hoverAnimation: false,
data: [
{
value: 2632321,
name: "已婚未育",
},
{
value: 2212343,
name: "总数",
tooltip: {
show: false,
data: [
{
value: 2632321,
name: "已婚未育",
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
{
value: 2212343,
name: "总数",
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
},
labelLine: {
show: false,
},
},
labelLine: {
show: false,
emphasis: {
color: "rgba(0,0,0,0)",
},
},
emphasis: {
color: "rgba(0,0,0,0)",
},
},
},
],
},
{
name: "Line 2",
type: "pie",
clockWise: true,
hoverAnimation: false,
radius: ["35%", "45%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
],
},
{
name: "Line 2",
type: "pie",
clockWise: true,
hoverAnimation: false,
radius: ["35%", "45%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
},
// shadowBlur: 15,
// shadowColor: 'white',
},
// shadowBlur: 15,
// shadowColor: 'white',
},
},
data: [
{
value: 1823323,
name: "未婚",
},
{
value: 1812343,
name: "总数",
tooltip: {
show: false,
data: [
{
value: 1823323,
name: "未婚",
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
{
value: 1812343,
name: "总数",
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
},
labelLine: {
show: false,
},
},
labelLine: {
show: false,
emphasis: {
color: "rgba(0,0,0,0)",
},
},
emphasis: {
color: "rgba(0,0,0,0)",
},
},
},
],
},
{
name: "Line 1",
type: "pie",
clockWise: true,
],
},
{
name: "Line 1",
type: "pie",
clockWise: true,
radius: ["20%", "30%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
radius: ["20%", "30%"],
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
},
// shadowBlur: 15,
// shadowColor: 'white',
},
// shadowBlur: 15,
// shadowColor: 'white',
},
},
hoverAnimation: false,
hoverAnimation: false,
data: [
{
value: 1342221,
name: "学生",
},
{
value: 1912343,
name: "总数",
tooltip: {
show: false,
data: [
{
value: 1342221,
name: "学生",
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
{
value: 1912343,
name: "总数",
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
label: {
show: false,
},
labelLine: {
show: false,
},
},
labelLine: {
show: false,
emphasis: {
color: "rgba(0,0,0,0)",
},
},
emphasis: {
color: "rgba(0,0,0,0)",
},
],
},
],
},
chart3: {
series: [
{
type: "graph",
layout: "force",
symbolSize: 58,
draggable: true,
roam: true,
focusNodeAdjacency: true,
categories: [
{
name: "公司",
itemStyle: {
color: "#006acc",
},
},
},
],
},
],
},
chart3: {
series: [
{
type: "graph",
layout: "force",
symbolSize: 58,
draggable: true,
roam: true,
focusNodeAdjacency: true,
categories: [
{
name: "公司",
itemStyle: {
color: "#006acc",
{
name: "董事",
itemStyle: {
color: "#ff7d18",
},
},
},
{
name: "董事",
itemStyle: {
color: "#ff7d18",
],
edgeSymbol: ["", "arrow"],
edgeLabel: {
normal: {
show: true,
textStyle: {
fontSize: 20,
},
formatter(x) {
return x.data.name;
},
},
},
],
edgeSymbol: ["", "arrow"],
edgeLabel: {
normal: {
label: {
show: true,
textStyle: {
fontSize: 20,
},
force: {
repulsion: 2000,
edgeLength: 120,
},
data: [
{
name: "操作系统集团",
},
formatter(x) {
return x.data.name;
{
name: "浏览器有限公司",
},
},
},
label: {
show: true,
},
force: {
repulsion: 2000,
edgeLength: 120,
{
name: "HTML科技",
},
{
name: "JavaScript科技",
},
{
name: "CSS科技",
},
{
name: "Chrome",
},
{
name: "IE",
},
{
name: "Firefox",
},
{
name: "Safari",
},
],
links: [
{
source: "浏览器有限公司",
target: "操作系统集团",
name: "参股",
},
{
source: "HTML科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "CSS科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "JavaScript科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "Chrome",
target: "浏览器有限公司",
name: "董事",
},
{
source: "IE",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Firefox",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Safari",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Chrome",
target: "JavaScript科技",
name: "法人",
},
],
},
data: [
{
name: "操作系统集团",
},
{
name: "浏览器有限公司",
},
{
name: "HTML科技",
},
{
name: "JavaScript科技",
},
{
name: "CSS科技",
},
{
name: "Chrome",
},
{
name: "IE",
},
{
name: "Firefox",
},
{
name: "Safari",
},
],
links: [
{
source: "浏览器有限公司",
target: "操作系统集团",
name: "参股",
},
{
source: "HTML科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "CSS科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "JavaScript科技",
target: "浏览器有限公司",
name: "参股",
},
{
source: "Chrome",
target: "浏览器有限公司",
name: "董事",
},
{
source: "IE",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Firefox",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Safari",
target: "浏览器有限公司",
name: "董事",
},
{
source: "Chrome",
target: "JavaScript科技",
name: "法人",
},
],
},
],
},
//中国地图
zgdt: {
title: {
text: "2099年全国GDP分布",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
],
},
series: [
{
name: "2099年全国GDP分布",
type: "map",
roam: false,
mapType: "china",
mapLocation: {
x: "center",
//中国地图
zgdt: {
title: {
text: "2099年全国GDP分布",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
},
series: [
{
name: "2099年全国GDP分布",
type: "map",
roam: false,
mapType: "china",
mapLocation: {
x: "center",
},
selectedMode: "multiple",
itemStyle: {
normal: {
label: {
show: false,
},
},
emphasis: {
label: {
show: true,
},
},
},
data: [
{ name: "西藏", value: 605.83 },
{ name: "青海", value: 1670.44 },
{ name: "宁夏", value: 2102.21 },
{ name: "海南", value: 2522.66 },
{ name: "甘肃", value: 5020.37 },
{ name: "贵州", value: 5701.84 },
{ name: "新疆", value: 6610.05 },
{ name: "云南", value: 8893.12 },
{ name: "重庆", value: 10011.37 },
{ name: "吉林", value: 10568.83 },
{ name: "山西", value: 11237.55 },
{ name: "天津", value: 11307.28 },
{ name: "江西", value: 11702.82 },
{ name: "广西", value: 11720.87 },
{ name: "陕西", value: 12512.3 },
{ name: "黑龙江", value: 12582 },
{ name: "内蒙古", value: 14359.88 },
{ name: "安徽", value: 15300.65 },
{ name: "北京", value: 16251.93 },
{ name: "福建", value: 17560.18 },
{ name: "上海", value: 19195.69 },
{ name: "湖北", value: 19632.26 },
{ name: "湖南", value: 19669.56 },
{ name: "四川", value: 21026.68 },
{ name: "辽宁", value: 22226.7 },
{ name: "河北", value: 24515.76 },
{ name: "河南", value: 26931.03 },
{ name: "浙江", value: 32318.85 },
{ name: "山东", value: 45361.85, selected: true },
{ name: "江苏", value: 49110.27 },
{ name: "广东", value: 53210.28 },
],
},
selectedMode: "multiple",
itemStyle: {
normal: {
label: {
],
},
//世界地图
sjdt: {
title: {
text: "2099年世界GDP(亿元)",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
},
tooltip: {
trigger: "item",
formatter: "{b}",
},
series: [
{
name: "2099年世界GDP(亿元)",
type: "map",
mapType: "world",
selectedMode: "multiple",
roam: false,
label: {
normal: {
show: false,
},
},
emphasis: {
label: {
emphasis: {
show: true,
},
},
data: [{ name: "China", value: 99999, selected: true }],
},
data: [
{ name: "西藏", value: 605.83 },
{ name: "青海", value: 1670.44 },
{ name: "宁夏", value: 2102.21 },
{ name: "海南", value: 2522.66 },
{ name: "甘肃", value: 5020.37 },
{ name: "贵州", value: 5701.84 },
{ name: "新疆", value: 6610.05 },
{ name: "云南", value: 8893.12 },
{ name: "重庆", value: 10011.37 },
{ name: "吉林", value: 10568.83 },
{ name: "山西", value: 11237.55 },
{ name: "天津", value: 11307.28 },
{ name: "江西", value: 11702.82 },
{ name: "广西", value: 11720.87 },
{ name: "陕西", value: 12512.3 },
{ name: "黑龙江", value: 12582 },
{ name: "内蒙古", value: 14359.88 },
{ name: "安徽", value: 15300.65 },
{ name: "北京", value: 16251.93 },
{ name: "福建", value: 17560.18 },
{ name: "上海", value: 19195.69 },
{ name: "湖北", value: 19632.26 },
{ name: "湖南", value: 19669.56 },
{ name: "四川", value: 21026.68 },
{ name: "辽宁", value: 22226.7 },
{ name: "河北", value: 24515.76 },
{ name: "河南", value: 26931.03 },
{ name: "浙江", value: 32318.85 },
{ name: "山东", value: 45361.85, selected: true },
{ name: "江苏", value: 49110.27 },
{ name: "广东", value: 53210.28 },
],
},
],
},
//世界地图
sjdt: {
title: {
text: "2099年世界GDP(亿元)",
subtext: "数据来自vue-admin-beautiful杜撰",
},
tooltip: {
trigger: "item",
},
dataRange: {
orient: "horizontal",
min: 0,
max: 55000,
text: ["高", "低"],
splitNumber: 0,
},
tooltip: {
trigger: "item",
formatter: "{b}",
],
},
series: [
{
name: "2099年世界GDP(亿元)",
type: "map",
mapType: "world",
selectedMode: "multiple",
roam: false,
label: {
normal: {
show: false,
},
emphasis: {
show: true,
},
},
data: [{ name: "China", value: 99999, selected: true }],
},
],
},
};
},
mounted() {},
methods: {},
};
};
},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.echarts {
width: 100%;
}
.echarts {
width: 100%;
}
</style>
......@@ -14,7 +14,7 @@
<vab-quill v-model="form.content" :min-height="400"></vab-quill>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSee">预览效果 </el-button>
<el-button type="primary" @click="handleSee">预览效果</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
</el-form-item>
</el-form>
......@@ -28,101 +28,101 @@
</template>
<script>
import vabQuill from "@/plugins/vabQuill";
export default {
name: "Editor",
components: { vabQuill },
data() {
return {
borderColor: "#dcdfe6",
dialogTableVisible: false,
form: {
title: "",
module: "",
content: "",
},
rules: {
title: [
{
required: true,
message: "请输入标题",
trigger: "blur",
},
],
module: [
{
required: true,
message: "请选择模块",
trigger: "change",
},
],
content: [
{
required: true,
message: "请输入内容",
trigger: "blur",
},
],
},
};
},
methods: {
handleSee() {
this.$refs["form"].validate((valid) => {
this.$refs.form.validateField("content", (errorMsg) => {});
if (valid) {
this.dialogTableVisible = true;
} else {
return false;
}
});
import vabQuill from "@/plugins/vabQuill";
export default {
name: "Editor",
components: { vabQuill },
data() {
return {
borderColor: "#dcdfe6",
dialogTableVisible: false,
form: {
title: "",
module: "",
content: "",
},
rules: {
title: [
{
required: true,
message: "请输入标题",
trigger: "blur",
},
],
module: [
{
required: true,
message: "请选择模块",
trigger: "change",
},
],
content: [
{
required: true,
message: "请输入内容",
trigger: "blur",
},
],
},
};
},
handleSave() {
this.$refs["form"].validate((valid) => {
this.$refs.form.validateField("content", (errorMsg) => {
this.borderColor = "#dcdfe6";
if (errorMsg) {
this.borderColor = "#F56C6C";
methods: {
handleSee() {
this.$refs["form"].validate((valid) => {
this.$refs.form.validateField("content", (errorMsg) => {});
if (valid) {
this.dialogTableVisible = true;
} else {
return false;
}
});
if (valid) {
this.$baseMessage("submit!", "success");
} else {
return false;
}
});
},
handleSave() {
this.$refs["form"].validate((valid) => {
this.$refs.form.validateField("content", (errorMsg) => {
this.borderColor = "#dcdfe6";
if (errorMsg) {
this.borderColor = "#F56C6C";
}
});
if (valid) {
this.$baseMessage("submit!", "success");
} else {
return false;
}
});
},
},
},
};
};
</script>
<style lang="scss" scoped>
.editor-container {
.news {
&-title {
text-align: center;
}
.editor-container {
.news {
&-title {
text-align: center;
}
&-content {
::v-deep {
p {
line-height: 30px;
&-content {
::v-deep {
p {
line-height: 30px;
img {
display: block;
margin-right: auto;
margin-left: auto;
img {
display: block;
margin-right: auto;
margin-left: auto;
}
}
}
}
}
}
.vab-quill-content {
::v-deep {
.el-form-item__content {
line-height: normal;
.vab-quill-content {
::v-deep {
.el-form-item__content {
line-height: normal;
}
}
}
}
}
</style>
......@@ -2,8 +2,8 @@
<div class="element-container">
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="18" :lg="18" :xl="16">
<el-button type="primary" @click="dialogVisible = !dialogVisible"
>element全部文档点这里
<el-button type="primary" @click="dialogVisible = !dialogVisible">
element全部文档点这里
</el-button>
<el-dialog
:fullscreen="true"
......@@ -16,8 +16,8 @@
frameborder="0"
></iframe>
</el-dialog>
<el-divider content-position="left"
>Tag 标签
<el-divider content-position="left">
Tag 标签
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/tag"
......@@ -36,8 +36,8 @@
<el-tag effect="dark" type="warning">标签四</el-tag>
<el-tag effect="dark" type="danger">标签五</el-tag>
<el-divider content-position="left"
>进度条
<el-divider content-position="left">
进度条
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/progress"
......@@ -90,8 +90,8 @@
status="exception"
></el-progress>
<el-divider content-position="left"
>按钮
<el-divider content-position="left">
按钮
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/button"
......@@ -133,13 +133,14 @@
<el-button type="primary" icon="el-icon-share"></el-button>
<el-button type="primary" icon="el-icon-delete"></el-button>
<el-button type="primary" icon="el-icon-search">搜索</el-button>
<el-button type="primary"
>上传<i class="el-icon-upload el-icon--right"></i
></el-button>
<el-button type="primary">
上传
<i class="el-icon-upload el-icon--right"></i>
</el-button>
<el-button type="primary" :loading="true">加载中</el-button>
<el-divider content-position="left"
>文字链接
<el-divider content-position="left">
文字链接
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/link"
......@@ -147,8 +148,8 @@
文档
</a>
</el-divider>
<el-link href="https://element.eleme.io" target="_blank"
>默认链接
<el-link href="https://element.eleme.io" target="_blank">
默认链接
</el-link>
<el-link type="primary">主要链接</el-link>
<el-link type="success">成功链接</el-link>
......@@ -163,8 +164,8 @@
<el-link type="info" disabled>信息链接</el-link>
<el-link :underline="false">无下划线</el-link>
<el-link>有下划线</el-link>
<el-divider content-position="left"
>头像
<el-divider content-position="left">
头像
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/avatar"
......@@ -173,8 +174,8 @@
</a>
</el-divider>
<el-avatar icon="el-icon-user-solid"></el-avatar>
<el-divider content-position="left"
>页头
<el-divider content-position="left">
页头
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/page-header"
......@@ -183,8 +184,8 @@
</a>
</el-divider>
<el-page-header content="详情页面"></el-page-header>
<el-divider content-position="left"
>面包屑
<el-divider content-position="left">
面包屑
<a
target="_blank"
href="https://element.eleme.cn/#/zh-CN/component/breadcrumb"
......@@ -204,50 +205,50 @@
</template>
<script>
export default {
name: "Element",
components: {},
data() {
return {
dialogVisible: false,
};
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "Element",
components: {},
data() {
return {
dialogVisible: false,
};
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.element-container {
::v-deep {
.el-dialog__wrapper {
position: fixed;
top: 20px;
right: 20px;
bottom: 20px;
left: 20px;
}
.element-container {
::v-deep {
.el-dialog__wrapper {
position: fixed;
top: 20px;
right: 20px;
bottom: 20px;
left: 20px;
}
.el-tag,
.el-button,
.el-link {
margin: 5px;
}
.el-tag,
.el-button,
.el-link {
margin: 5px;
}
.el-progress {
margin: 20px;
.el-progress {
margin: 20px;
}
}
}
.element-iframe {
position: absolute;
top: 55px;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 89vh;
.element-iframe {
position: absolute;
top: 55px;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 89vh;
}
}
}
</style>
......@@ -4,10 +4,10 @@
</template>
<script>
export default {
name: "ErrorTest",
data() {
return {};
},
};
export default {
name: "ErrorTest",
data() {
return {};
},
};
</script>
<template>
<div class="errorLog-container">
<el-divider content-position="left"
>这里会在顶部navbar上模拟一个控制台错误日志
<el-divider content-position="left">
这里会在顶部navbar上模拟一个控制台错误日志
</el-divider>
<el-button type="primary" @click="handleError"
>点击模拟一个chuzhixinjiayou的错误
<el-button type="primary" @click="handleError">
点击模拟一个chuzhixinjiayou的错误
</el-button>
<error-test v-if="show" />
</div>
</template>
<script>
import ErrorTest from "./components/ErrorTest";
import ErrorTest from "./components/ErrorTest";
export default {
name: "ErrorLog",
components: { ErrorTest },
data() {
return { show: false };
},
methods: {
handleError() {
this.show = true;
export default {
name: "ErrorLog",
components: { ErrorTest },
data() {
return { show: false };
},
},
};
methods: {
handleError() {
this.show = true;
},
},
};
</script>
......@@ -39,8 +39,8 @@
<el-input v-model="ruleForm.desc" type="textarea"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>立即创建
<el-button type="primary" @click="submitForm('ruleForm')">
立即创建
</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
......@@ -51,54 +51,61 @@
</template>
<script>
export default {
name: "Form",
data() {
return {
ruleForm: {
name: "",
region: "",
delivery: false,
type: [],
resource: "",
desc: "",
export default {
name: "Form",
data() {
return {
ruleForm: {
name: "",
region: "",
delivery: false,
type: [],
resource: "",
desc: "",
},
rules: {
name: [
{ required: true, message: "请输入活动名称", trigger: "blur" },
{
min: 3,
max: 5,
message: "长度在 3 到 5 个字符",
trigger: "blur",
},
],
region: [
{ required: true, message: "请选择活动区域", trigger: "change" },
],
type: [
{
type: "array",
required: true,
message: "请至少选择一个活动性质",
trigger: "change",
},
],
resource: [
{ required: true, message: "请选择活动资源", trigger: "change" },
],
desc: [
{ required: true, message: "请填写活动形式", trigger: "blur" },
],
},
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert("submit!");
} else {
return false;
}
});
},
rules: {
name: [
{ required: true, message: "请输入活动名称", trigger: "blur" },
{ min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" },
],
region: [
{ required: true, message: "请选择活动区域", trigger: "change" },
],
type: [
{
type: "array",
required: true,
message: "请至少选择一个活动性质",
trigger: "change",
},
],
resource: [
{ required: true, message: "请选择活动资源", trigger: "change" },
],
desc: [{ required: true, message: "请填写活动形式", trigger: "blur" }],
resetForm(formName) {
this.$refs[formName].resetFields();
},
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert("submit!");
} else {
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
},
};
};
</script>
......@@ -2,8 +2,8 @@
<div class="colorful-icon-container">
<el-row :gutter="20">
<el-col :span="24">
<el-divider content-position="left"
>多彩图标在演示环境中使用的是cdn加速服务,开发时需存储到本地,使用方法可查看群文档,点击图标即可复制源码
<el-divider content-position="left">
多彩图标在演示环境中使用的是cdn加速服务,开发时需存储到本地,使用方法可查看群文档,点击图标即可复制源码
</el-divider>
</el-col>
<el-col :span="24">
......@@ -12,8 +12,8 @@
<el-input v-model="queryForm.title"></el-input>
</el-form-item>
<el-form-item label-width="0">
<el-button native-type="submit" type="primary" @click="queryData"
>搜索
<el-button native-type="submit" type="primary" @click="queryData">
搜索
</el-button>
</el-form-item>
......@@ -60,96 +60,96 @@
</template>
<script>
import { getIconList } from "@/api/colorfulIcon";
import clip from "@/utils/clipboard";
import { getIconList } from "@/api/colorfulIcon";
import clip from "@/utils/clipboard";
export default {
name: "ColorfulIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
created() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
export default {
name: "ColorfulIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
queryData() {
this.queryForm.pageNo = 1;
created() {
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
//const copyText = `<vab-colorful-icon icon-class="https://cdn.jsdelivr.net/gh/chuzhixin/zx-colorful-icon@master/${this.queryIcon[index]}.svg" />`;
const copyText = `<vab-colorful-icon icon-class="${this.queryIcon[index]}" />`;
this.copyText = copyText;
clip(copyText, event);
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
//const copyText = `<vab-colorful-icon icon-class="https://cdn.jsdelivr.net/gh/chuzhixin/zx-colorful-icon@master/${this.queryIcon[index]}.svg" />`;
const copyText = `<vab-colorful-icon icon-class="${this.queryIcon[index]}" />`;
this.copyText = copyText;
clip(copyText, event);
},
},
},
};
};
</script>
<style lang="scss" scoped>
.colorful-icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
.colorful-icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
svg:not(:root) {
font-size: 35px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
}
svg:not(:root) {
font-size: 35px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
}
.svg-external-icon {
width: 35px;
height: 35px;
.svg-external-icon {
width: 35px;
height: 35px;
}
}
}
}
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
</style>
......@@ -10,8 +10,8 @@
<el-input v-model="queryForm.title"></el-input>
</el-form-item>
<el-form-item label-width="0">
<el-button native-type="submit" type="primary" @click="queryData"
>搜索
<el-button native-type="submit" type="primary" @click="queryData">
搜索
</el-button>
</el-form-item>
</el-form>
......@@ -52,90 +52,90 @@
</template>
<script>
import clip from "@/utils/clipboard";
import { getIconList } from "@/api/icon";
import clip from "@/utils/clipboard";
import { getIconList } from "@/api/icon";
export default {
name: "AwesomeIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
created() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
export default {
name: "AwesomeIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
queryData() {
this.queryForm.pageNo = 1;
created() {
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
const copyText = `<vab-icon :icon="['fas', '${this.queryIcon[index]}']"></vab-icon>`;
this.copyText = copyText;
clip(copyText, event);
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
const copyText = `<vab-icon :icon="['fas', '${this.queryIcon[index]}']"></vab-icon>`;
this.copyText = copyText;
clip(copyText, event);
},
},
},
};
};
</script>
<style lang="scss" scoped>
.icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
.icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
svg:not(:root).svg-inline--fa {
font-size: 35px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
svg:not(:root).svg-inline--fa {
font-size: 35px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
}
}
}
}
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
</style>
......@@ -2,8 +2,8 @@
<div class="colorful-icon-container">
<el-row :gutter="20">
<el-col :span="24">
<el-divider content-position="left"
>小清新图标在演示环境中使用的是cdn加速服务,开发时需存储到本地,使用方法可查看群文档,点击图标即可复制源码,点击图标即可复制源码
<el-divider content-position="left">
小清新图标在演示环境中使用的是cdn加速服务,开发时需存储到本地,使用方法可查看群文档,点击图标即可复制源码,点击图标即可复制源码
</el-divider>
</el-col>
<el-col :span="24">
......@@ -12,8 +12,8 @@
<el-input v-model="queryForm.title"></el-input>
</el-form-item>
<el-form-item label-width="0">
<el-button native-type="submit" type="primary" @click="queryData"
>搜索
<el-button native-type="submit" type="primary" @click="queryData">
搜索
</el-button>
</el-form-item>
......@@ -62,92 +62,92 @@
</template>
<script>
import { getIconList } from "@/api/remixIcon";
import clip from "@/utils/clipboard";
import { getIconList } from "@/api/remixIcon";
import clip from "@/utils/clipboard";
export default {
name: "RemixIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
created() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
export default {
name: "RemixIcon",
data() {
return {
copyText: "",
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
height: 0,
selectRows: "",
elementLoadingText: "正在加载...",
queryIcon: [],
queryForm: {
pageNo: 1,
pageSize: 72,
title: "",
},
};
},
queryData() {
this.queryForm.pageNo = 1;
created() {
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
//const copyText = `<vab-remix-icon icon-class="https://cdn.jsdelivr.net/gh/chuzhixin/zx-remixicon@master/src/icons/svg/${this.queryIcon[index]}.svg" />`;
const copyText = `<vab-remix-icon icon-class="${this.queryIcon[index]}" />`;
this.copyText = copyText;
clip(copyText, event);
methods: {
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
queryData() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
const { data, totalCount } = await getIconList(this.queryForm);
this.queryIcon = data;
this.allIcon = data;
this.total = totalCount;
},
handleCopyIcon(index, event) {
//const copyText = `<vab-remix-icon icon-class="https://cdn.jsdelivr.net/gh/chuzhixin/zx-remixicon@master/src/icons/svg/${this.queryIcon[index]}.svg" />`;
const copyText = `<vab-remix-icon icon-class="${this.queryIcon[index]}" />`;
this.copyText = copyText;
clip(copyText, event);
},
},
},
};
};
</script>
<style lang="scss" scoped>
.colorful-icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
.colorful-icon-container {
::v-deep {
.el-card__body {
position: relative;
display: flex;
flex-direction: column;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
svg:not(:root),
.svg-external-icon {
font-size: 28px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
svg:not(:root),
.svg-external-icon {
font-size: 28px;
font-weight: bold;
color: $base-color-gray;
text-align: center;
vertical-align: middle;
pointer-events: none;
cursor: pointer;
}
}
}
}
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
.icon-text {
height: 30px;
margin-top: -15px;
overflow: hidden;
font-size: 12px;
line-height: 30px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
</style>
......@@ -25,29 +25,29 @@
</template>
<script>
import VabComparison from "@/plugins/vabComparison";
import { random } from "@/utils";
import VabComparison from "@/plugins/vabComparison";
import { random } from "@/utils";
export default {
name: "ImgComparison",
components: { VabComparison },
data() {
return {
comparison: {
width: "100%",
height: "auto",
src1: require("@/assets/comparison/left.jpg"),
src2: require("@/assets/comparison/right.jpg"),
start: random(0, 100),
export default {
name: "ImgComparison",
components: { VabComparison },
data() {
return {
comparison: {
width: "100%",
height: "auto",
src1: require("@/assets/comparison/left.jpg"),
src2: require("@/assets/comparison/right.jpg"),
start: random(0, 100),
},
};
},
created() {},
mounted() {},
methods: {
random(m, n) {
return random(m, n).toString();
},
};
},
created() {},
mounted() {},
methods: {
random(m, n) {
return random(m, n).toString();
},
},
};
};
</script>
......@@ -11,59 +11,61 @@
<el-button type="primary" @click="handleLoading(7)">效果7</el-button>
<el-button type="primary" @click="handleLoading(8)">效果8</el-button>
<el-button type="primary" @click="handleLoading(9)">效果9</el-button>
<el-button type="primary" @click="test()"
>全局默认骨架屏(仿支付宝)
<el-button type="primary" @click="test()">
全局默认骨架屏(仿支付宝)
</el-button>
<br /><br /><br />
<br />
<br />
<br />
<el-divider content-position="left">多彩loading</el-divider>
<el-button type="primary" @click="handleColorfullLoading(1)"
>效果1
<el-button type="primary" @click="handleColorfullLoading(1)">
效果1
</el-button>
<el-button type="primary" @click="handleColorfullLoading(2)"
>效果2
<el-button type="primary" @click="handleColorfullLoading(2)">
效果2
</el-button>
<el-button type="primary" @click="handleColorfullLoading(3)"
>效果3
<el-button type="primary" @click="handleColorfullLoading(3)">
效果3
</el-button>
<el-button type="primary" @click="handleColorfullLoading(4)"
>效果4
<el-button type="primary" @click="handleColorfullLoading(4)">
效果4
</el-button>
</div>
</template>
<script>
export default {
name: "Loading",
data() {
return {};
},
methods: {
handleLoading(index) {
this.$baseLoading(index);
export default {
name: "Loading",
data() {
return {};
},
handleColorfullLoading(index) {
this.$baseColorfullLoading(index);
methods: {
handleLoading(index) {
this.$baseLoading(index);
},
handleColorfullLoading(index) {
this.$baseColorfullLoading(index);
},
test() {
location.reload();
},
},
test() {
location.reload();
},
},
};
};
</script>
<style lang="scss" scoped>
.loading-container {
::v-deep {
.el-button {
margin-top: 10px;
margin-right: 10px;
margin-left: 0;
}
.loading-container {
::v-deep {
.el-button {
margin-top: 10px;
margin-right: 10px;
margin-left: 0;
}
.el-button + .el-button {
margin-right: 10px;
margin-left: 0;
.el-button + .el-button {
margin-right: 10px;
margin-left: 0;
}
}
}
}
</style>
......@@ -7,7 +7,8 @@
type="primary"
href="https://www.lodashjs.com/"
target="_blank"
>lodashjs官网
>
lodashjs官网
</el-link>
</el-card>
</el-col>
......@@ -187,24 +188,24 @@
</template>
<script>
export default {
name: "Lodash",
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "Lodash",
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.lodash-container {
text-align: left;
.lodash-container {
text-align: left;
::v-deep {
.lodash-content {
min-height: 150px;
::v-deep {
.lodash-content {
min-height: 150px;
}
}
}
}
</style>
......@@ -24,12 +24,12 @@
</template>
<script>
import VabMagnifier from "@/plugins/vabMagnifier.js";
import VabMagnifier from "@/plugins/vabMagnifier.js";
export default {
name: "Magnifier",
components: {
VabMagnifier,
},
};
export default {
name: "Magnifier",
components: {
VabMagnifier,
},
};
</script>
......@@ -7,21 +7,21 @@
</template>
<script>
export default {
name: "Amap",
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "Amap",
data() {
return {};
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.amap-container {
.container {
width: 100%;
height: calc(100vh - 214px);
.amap-container {
.container {
width: 100%;
height: calc(100vh - 214px);
}
}
}
</style>
......@@ -5,111 +5,111 @@
</template>
<script>
import axios from "axios";
import * as mapv from "mapv";
export default {
name: "Map",
components: {},
data() {
return {};
},
created() {},
mounted() {
this.$nextTick(() => {
const map = this.$baseMap();
axios
.get(
"https://cdn.jsdelivr.net/npm/mapv@2.0.12/examples/data/od-xierqi.txt"
)
.then((rs) => {
let data = [];
let timeData = [];
import axios from "axios";
import * as mapv from "mapv";
export default {
name: "Map",
components: {},
data() {
return {};
},
created() {},
mounted() {
this.$nextTick(() => {
const map = this.$baseMap();
axios
.get(
"https://cdn.jsdelivr.net/npm/mapv@2.0.12/examples/data/od-xierqi.txt"
)
.then((rs) => {
let data = [];
let timeData = [];
rs = rs.data.split("\n");
let maxLength = 0;
for (let i = 0; i < rs.length; i++) {
let item = rs[i].split(",");
let coordinates = [];
if (item.length > maxLength) {
maxLength = item.length;
}
for (let j = 0; j < item.length; j += 2) {
let x = (Number(item[j]) / 20037508.34) * 180;
let y = (Number(item[j + 1]) / 20037508.34) * 180;
y =
(180 / Math.PI) *
(2 * Math.atan(Math.exp((y * Math.PI) / 180)) - Math.PI / 2);
if (x == 0 || y == NaN) {
continue;
rs = rs.data.split("\n");
let maxLength = 0;
for (let i = 0; i < rs.length; i++) {
let item = rs[i].split(",");
let coordinates = [];
if (item.length > maxLength) {
maxLength = item.length;
}
for (let j = 0; j < item.length; j += 2) {
let x = (Number(item[j]) / 20037508.34) * 180;
let y = (Number(item[j + 1]) / 20037508.34) * 180;
y =
(180 / Math.PI) *
(2 * Math.atan(Math.exp((y * Math.PI) / 180)) - Math.PI / 2);
if (x == 0 || y == NaN) {
continue;
}
coordinates.push([x, y]);
timeData.push({
geometry: {
type: "Point",
coordinates: [x, y],
},
count: 1,
time: j,
});
}
coordinates.push([x, y]);
timeData.push({
data.push({
geometry: {
type: "Point",
coordinates: [x, y],
type: "LineString",
coordinates: coordinates,
},
count: 1,
time: j,
});
}
data.push({
geometry: {
type: "LineString",
coordinates: coordinates,
},
});
}
let dataSet = new mapv.DataSet(data);
let dataSet = new mapv.DataSet(data);
let options = {
strokeStyle: "rgba(53,57,255,0.5)",
// globalCompositeOperation: 'lighter',
shadowColor: "rgba(53,57,255,0.2)",
shadowBlur: 3,
lineWidth: 3.0,
draw: "simple",
};
let options = {
strokeStyle: "rgba(53,57,255,0.5)",
// globalCompositeOperation: 'lighter',
shadowColor: "rgba(53,57,255,0.2)",
shadowBlur: 3,
lineWidth: 3.0,
draw: "simple",
};
let mapvLayer = new mapv.MaptalksLayer(
"mapv1",
dataSet,
options
).addTo(map);
let mapvLayer = new mapv.MaptalksLayer(
"mapv1",
dataSet,
options
).addTo(map);
let dataSet2 = new mapv.DataSet(timeData);
let dataSet2 = new mapv.DataSet(timeData);
let options2 = {
fillStyle: "rgba(255, 250, 250, 0.2)",
globalCompositeOperation: "lighter",
size: 1.5,
animation: {
stepsRange: {
start: 0,
end: 100,
let options2 = {
fillStyle: "rgba(255, 250, 250, 0.2)",
globalCompositeOperation: "lighter",
size: 1.5,
animation: {
stepsRange: {
start: 0,
end: 100,
},
trails: 3,
duration: 5,
},
trails: 3,
duration: 5,
},
draw: "simple",
};
draw: "simple",
};
let mapvLayer2 = new mapv.MaptalksLayer(
"mapv2",
dataSet2,
options2
).addTo(map);
});
});
},
methods: {},
};
let mapvLayer2 = new mapv.MaptalksLayer(
"mapv2",
dataSet2,
options2
).addTo(map);
});
});
},
methods: {},
};
</script>
<style lang="scss" scoped>
.map-container {
.container {
width: 100%;
height: calc(100vh - 214px);
.map-container {
.container {
width: 100%;
height: calc(100vh - 214px);
}
}
}
</style>
......@@ -6,64 +6,63 @@
:key="index"
:label="item.label"
:value="item.value"
>
</el-option>
></el-option>
</el-select>
<div v-html="prettierList"></div>
</div>
</template>
<script>
import marked from "marked";
import "github-markdown-css/github-markdown.css";
import { getList } from "@/api/markdown";
export default {
name: "Markdown",
data() {
return {
listLoading: true,
elementLoadingText: "正在加载...",
options: [
{
value: "0",
label: "Prettier",
},
],
value: "0",
prettierList: null,
};
},
created() {
this.fetchData();
},
mounted() {},
methods: {
handleChange(val) {
this.value = val;
import marked from "marked";
import "github-markdown-css/github-markdown.css";
import { getList } from "@/api/markdown";
export default {
name: "Markdown",
data() {
return {
listLoading: true,
elementLoadingText: "正在加载...",
options: [
{
value: "0",
label: "Prettier",
},
],
value: "0",
prettierList: null,
};
},
created() {
this.fetchData();
},
async fetchData() {
this.listLoading = true;
switch (this.value) {
case "0":
const { data } = await getList();
this.prettierList = marked(data || "", {
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false,
});
mounted() {},
methods: {
handleChange(val) {
this.value = val;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
switch (this.value) {
case "0":
const { data } = await getList();
this.prettierList = marked(data || "", {
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false,
});
break;
}
setTimeout(() => {
this.listLoading = false;
}, 500);
break;
}
setTimeout(() => {
this.listLoading = false;
}, 500);
},
},
},
};
};
</script>
......@@ -23,29 +23,29 @@
</template>
<script>
import VabMarkdownEditor from "@/plugins/vabMarkdownEditor";
import VabMarkdownEditor from "@/plugins/vabMarkdownEditor";
export default {
name: "MarkdownEditor",
components: { VabMarkdownEditor },
data() {
return {
value: "# vue-admin-beautiful",
html: '<h1 id="vue-admin-beautiful">vue-admin-beautiful</h1>',
};
},
methods: {
handleAddText() {
this.$refs.mde.add("\n### 新增加的内容");
export default {
name: "MarkdownEditor",
components: { VabMarkdownEditor },
data() {
return {
value: "# vue-admin-beautiful",
html: '<h1 id="vue-admin-beautiful">vue-admin-beautiful</h1>',
};
},
handleAddImg() {
this.$refs.mde.add(
"\n![](https://chu1204505056.gitee.io/byui-bookmarks/img/ewm.png)"
);
methods: {
handleAddText() {
this.$refs.mde.add("\n### 新增加的内容");
},
handleAddImg() {
this.$refs.mde.add(
"\n![](https://chu1204505056.gitee.io/byui-bookmarks/img/ewm.png)"
);
},
handleShowHtml(html) {
this.html = html;
},
},
handleShowHtml(html) {
this.html = html;
},
},
};
};
</script>
......@@ -8,8 +8,8 @@
<el-card>
<div slot="header">
开源版本
<el-button style="float: right; padding: 3px 0;" type="text"
>永久免费 个人/商业使用
<el-button style="float: right; padding: 3px 0;" type="text">
永久免费 个人/商业使用
</el-button>
</div>
<div>
......@@ -21,8 +21,9 @@
<a
target="_blank"
href="https://github.com/chuzhixin/vue-admin-beautiful"
>支持白嫖,也请给个star</a
>
支持白嫖,也请给个star
</a>
</li>
<li>
提供讨论群专属文档,QQ群 972435319
......@@ -36,9 +37,9 @@
<el-card>
<div slot="header">
VIP群
<el-button style="float: right; padding: 3px 0;" type="text"
>¥100</el-button
>
<el-button style="float: right; padding: 3px 0;" type="text">
¥100
</el-button>
</div>
<div>
<ul>
......@@ -56,9 +57,9 @@
<el-card>
<div slot="header">
商业用途 完全自定义版权
<el-button style="float: right; padding: 3px 0;" type="text"
>¥299</el-button
>
<el-button style="float: right; padding: 3px 0;" type="text">
¥299
</el-button>
</div>
<div>
<ul>
......@@ -78,38 +79,38 @@
</template>
<script>
export default {
name: "More",
components: {},
data() {
return { nodeEnv: process.env.NODE_ENV };
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "More",
components: {},
data() {
return { nodeEnv: process.env.NODE_ENV };
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.more-container {
::v-deep {
.el-card__body {
> div {
min-height: 70vh;
padding: 20px;
.more-container {
::v-deep {
.el-card__body {
> div {
min-height: 70vh;
padding: 20px;
> ul {
> li {
line-height: 30px;
> ul {
> li {
line-height: 30px;
}
}
}
> img {
display: block;
margin: 40px auto;
border: 1px solid #dedede;
> img {
display: block;
margin: 40px auto;
border: 1px solid #dedede;
}
}
}
}
}
}
</style>
<template>
<div class="menu1-1-container">
<el-alert :closable="false" title="嵌套路由 1-1" type="success">
<router-view
/></el-alert>
<router-view />
</el-alert>
</div>
</template>
<style lang="scss" scoped>
[class*="-container"] {
padding: 15px;
background: $base-color-white;
}
[class*="-container"] {
padding: 15px;
background: $base-color-white;
}
</style>
......@@ -8,8 +8,8 @@
</div>
</template>
<style lang="scss" scoped>
[class*="-container"] {
padding: 15px;
background: $base-color-white;
}
[class*="-container"] {
padding: 15px;
background: $base-color-white;
}
</style>
......@@ -14,8 +14,8 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleChangePermission"
>切换权限
<el-button type="primary" @click="handleChangePermission">
切换权限
</el-button>
</el-form-item>
<el-form-item label="当前账号拥有的权限">
......@@ -119,47 +119,50 @@
</template>
<script>
import { mapGetters } from "vuex";
import { tokenTableName } from "@/config/settings";
import { getRouterList } from "@/api/router";
import JsonEditor from "@/components/JsonEditor";
import { mapGetters } from "vuex";
import { tokenTableName } from "@/config/settings";
import { getRouterList } from "@/api/router";
import JsonEditor from "@/components/JsonEditor";
export default {
name: "Permissions",
components: {
JsonEditor,
},
data() {
return {
form: {
account: "",
},
tableData: [],
res: [],
};
},
computed: {
...mapGetters({
username: "user/username",
permissions: "user/permissions",
}),
},
created() {
this.fetchData();
},
mounted() {
this.form.account = this.username;
},
methods: {
handleChangePermission() {
localStorage.setItem(tokenTableName, `${this.form.account}-accessToken`);
location.reload();
export default {
name: "Permissions",
components: {
JsonEditor,
},
data() {
return {
form: {
account: "",
},
tableData: [],
res: [],
};
},
computed: {
...mapGetters({
username: "user/username",
permissions: "user/permissions",
}),
},
created() {
this.fetchData();
},
async fetchData() {
const res = await getRouterList();
this.tableData = res.data;
this.res = res;
mounted() {
this.form.account = this.username;
},
methods: {
handleChangePermission() {
localStorage.setItem(
tokenTableName,
`${this.form.account}-accessToken`
);
location.reload();
},
async fetchData() {
const res = await getRouterList();
this.tableData = res.data;
this.res = res;
},
},
},
};
};
</script>
<template>
<div class="player-container">
<el-divider content-position="left"
>视频地址采用cdn加速服务,开发时需部署到到本地,使用方法可查看群文档
<el-divider content-position="left">
视频地址采用cdn加速服务,开发时需部署到到本地,使用方法可查看群文档
</el-divider>
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
......@@ -33,41 +33,41 @@
</template>
<script>
import { VabPlayerMp4, VabPlayerHls } from "@/plugins/vabPlayer.js";
import { VabPlayerMp4, VabPlayerHls } from "@/plugins/vabPlayer.js";
export default {
name: "Player",
components: {
VabPlayerMp4,
VabPlayerHls,
},
data() {
return {
config1: {
id: "mse1",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.mp4",
volume: 1,
autoplay: false,
},
Player1: null,
config2: {
id: "mse2",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.m3u8",
volume: 1,
autoplay: false,
},
Player2: null,
config3: {
id: "mse3",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.flv",
volume: 1,
autoplay: false,
},
Player3: null,
};
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "Player",
components: {
VabPlayerMp4,
VabPlayerHls,
},
data() {
return {
config1: {
id: "mse1",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.mp4",
volume: 1,
autoplay: false,
},
Player1: null,
config2: {
id: "mse2",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.m3u8",
volume: 1,
autoplay: false,
},
Player2: null,
config3: {
id: "mse3",
url: "https://cdn.jsdelivr.net/gh/chuzhixin/videos@master/video.flv",
volume: 1,
autoplay: false,
},
Player3: null,
};
},
created() {},
mounted() {},
methods: {},
};
</script>
......@@ -14,33 +14,33 @@
</template>
<script>
import VabQrCode from "@/components/VabQrCode";
import VabQrCode from "@/components/VabQrCode";
export default {
name: "QrCode",
components: {
VabQrCode,
},
data() {
return {
url: "https://www.baidu.com",
imagePath: require("@/assets/qr_logo/lqr_logo.png"),
};
},
created() {},
mounted() {},
methods: {},
};
export default {
name: "QrCode",
components: {
VabQrCode,
},
data() {
return {
url: "https://www.baidu.com",
imagePath: require("@/assets/qr_logo/lqr_logo.png"),
};
},
created() {},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.qr-code-container {
::v-deep {
.el-card__body {
display: flex;
align-content: center;
justify-content: center;
.qr-code-container {
::v-deep {
.el-card__body {
display: flex;
align-content: center;
justify-content: center;
}
}
}
}
</style>
......@@ -20,7 +20,8 @@
style="float: right; padding: 3px 0;"
type="text"
@click="handleProfile"
>重载
>
重载
</el-button>
</div>
<vab-profile
......@@ -43,67 +44,67 @@
</template>
<script>
import VabSnow from "@/components/VabSnow";
import VabProfile from "@/components/VabProfile";
import VabCharge from "@/components/VabCharge";
import VabSnow from "@/components/VabSnow";
import VabProfile from "@/components/VabProfile";
import VabCharge from "@/components/VabCharge";
export default {
name: "Sticky",
components: {
VabSnow,
VabProfile,
VabCharge,
},
data() {
return {
profileShow: true,
faultTextShow: true,
solidTextShow: true,
startVal: 0,
endVal: 20,
timeInterval: null,
};
},
mounted() {
this.handleProfile();
this.handleSolidText();
this.timeInterval = setInterval(() => {
if (this.endVal < 100) {
this.startVal = this.endVal;
this.endVal++;
export default {
name: "Sticky",
components: {
VabSnow,
VabProfile,
VabCharge,
},
data() {
return {
profileShow: true,
faultTextShow: true,
solidTextShow: true,
startVal: 0,
endVal: 20,
timeInterval: null,
};
},
mounted() {
this.handleProfile();
this.handleSolidText();
this.timeInterval = setInterval(() => {
if (this.endVal < 100) {
this.startVal = this.endVal;
this.endVal++;
}
}, 5000);
},
beforeDestroy() {
if (this.clearInterval) {
clearInterval(this.timeInterval);
}
}, 5000);
},
beforeDestroy() {
if (this.clearInterval) {
clearInterval(this.timeInterval);
}
},
methods: {
handleProfile() {
this.profileShow = false;
setTimeout(() => {
this.profileShow = true;
});
},
handleSolidText() {
this.solidTextShow = false;
setTimeout(() => {
this.solidTextShow = true;
});
methods: {
handleProfile() {
this.profileShow = false;
setTimeout(() => {
this.profileShow = true;
});
},
handleSolidText() {
this.solidTextShow = false;
setTimeout(() => {
this.solidTextShow = true;
});
},
},
},
};
};
</script>
<style lang="scss" scoped>
.small-components-container {
::v-deep {
.el-card__body {
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
height: 430px;
.small-components-container {
::v-deep {
.el-card__body {
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
height: 430px;
}
}
}
}
</style>
......@@ -280,35 +280,35 @@
</template>
<script>
import VabSticky from "@/components/VabSticky";
import VabSticky from "@/components/VabSticky";
export default {
name: "Sticky",
components: { VabSticky },
data() {
return {
time: "",
url: "",
platforms: ["a-platform"],
platformsOptions: [
{ key: "a-platform", name: "platformA" },
{ key: "b-platform", name: "platformB" },
{ key: "c-platform", name: "platformC" },
],
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now();
export default {
name: "Sticky",
components: { VabSticky },
data() {
return {
time: "",
url: "",
platforms: ["a-platform"],
platformsOptions: [
{ key: "a-platform", name: "platformA" },
{ key: "b-platform", name: "platformB" },
{ key: "c-platform", name: "platformC" },
],
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now();
},
},
},
};
},
};
};
},
};
</script>
<style lang="scss" scoped>
.sticky-container {
div {
height: 40px;
line-height: 40px;
.sticky-container {
div {
height: 40px;
line-height: 40px;
}
}
}
</style>
......@@ -21,55 +21,55 @@
</template>
<script>
import { doEdit } from "@/api/table";
import { doEdit } from "@/api/table";
export default {
name: "TableEdit",
data() {
return {
form: {
export default {
name: "TableEdit",
data() {
return {
form: {
title: "",
author: "",
},
rules: {
title: [{ required: true, trigger: "blur", message: "请输入标题" }],
author: [{ required: true, trigger: "blur", message: "请输入作者" }],
},
title: "",
author: "",
},
rules: {
title: [{ required: true, trigger: "blur", message: "请输入标题" }],
author: [{ required: true, trigger: "blur", message: "请输入作者" }],
},
title: "",
dialogFormVisible: false,
};
},
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
this.title = "编辑";
this.form = Object.assign({}, row);
}
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
this.$emit("fetchData");
dialogFormVisible: false,
};
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$refs["form"].resetFields();
this.dialogFormVisible = false;
this.$emit("fetchData");
this.form = this.$options.data().form;
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
return false;
this.title = "编辑";
this.form = Object.assign({}, row);
}
});
this.dialogFormVisible = true;
},
close() {
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
this.dialogFormVisible = false;
this.$emit("fetchData");
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form);
this.$baseMessage(msg, "success");
this.$refs["form"].resetFields();
this.dialogFormVisible = false;
this.$emit("fetchData");
this.form = this.$options.data().form;
} else {
return false;
}
});
},
},
},
};
};
</script>
......@@ -2,11 +2,11 @@
<div class="table-container">
<vab-query-form>
<vab-query-form-left-panel>
<el-button icon="el-icon-plus" type="primary" @click="handleAdd"
>添加
<el-button icon="el-icon-plus" type="primary" @click="handleAdd">
添加
</el-button>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete"
>删除
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
删除
</el-button>
<el-button type="primary" @click="testMessage">baseMessage</el-button>
<el-button type="primary" @click="testALert">baseAlert</el-button>
......@@ -29,7 +29,8 @@
type="primary"
native-type="submit"
@click="handleQuery"
>查询
>
查询
</el-button>
</el-form-item>
</el-form>
......@@ -87,8 +88,8 @@
effect="dark"
placement="top-start"
>
<el-tag :type="scope.row.status | statusFilter"
>{{ scope.row.status }}
<el-tag :type="scope.row.status | statusFilter">
{{ scope.row.status }}
</el-tag>
</el-tooltip>
</template>
......@@ -106,11 +107,9 @@
fixed="right"
>
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)"
>编辑
</el-button>
<el-button type="text" @click="handleDelete(scope.row)"
>删除
<el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" @click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
......@@ -129,137 +128,137 @@
</template>
<script>
import { getList, doDelete } from "@/api/table";
import TableEdit from "./components/TableEdit";
export default {
name: "ComprehensiveTable",
components: {
TableEdit,
},
filters: {
statusFilter(status) {
const statusMap = {
published: "success",
draft: "gray",
deleted: "danger",
};
return statusMap[status];
import { getList, doDelete } from "@/api/table";
import TableEdit from "./components/TableEdit";
export default {
name: "ComprehensiveTable",
components: {
TableEdit,
},
},
data() {
return {
imgShow: true,
list: [],
imageList: [],
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
filters: {
statusFilter(status) {
const statusMap = {
published: "success",
draft: "gray",
deleted: "danger",
};
return statusMap[status];
},
};
},
created() {
this.fetchData();
},
beforeDestroy() {},
mounted() {},
methods: {
tableSortChange() {
const imageList = [];
this.$refs.tableSort.tableData.forEach((item, index) => {
imageList.push(item.img);
});
this.imageList = imageList;
},
setSelectRows(val) {
this.selectRows = val;
},
handleAdd() {
this.$refs["edit"].showEdit();
data() {
return {
imgShow: true,
list: [],
imageList: [],
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
background: true,
selectRows: "",
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
},
};
},
handleEdit(row) {
this.$refs["edit"].showEdit(row);
created() {
this.fetchData();
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
beforeDestroy() {},
mounted() {},
methods: {
tableSortChange() {
const imageList = [];
this.$refs.tableSort.tableData.forEach((item, index) => {
imageList.push(item.img);
});
} else {
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids: ids });
this.imageList = imageList;
},
setSelectRows(val) {
this.selectRows = val;
},
handleAdd() {
this.$refs["edit"].showEdit();
},
handleEdit(row) {
this.$refs["edit"].showEdit(row);
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ ids: row.id });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDelete({ ids: ids });
this.$baseMessage(msg, "success");
this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
}
}
}
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
handleQuery() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
const imageList = [];
data.forEach((item, index) => {
imageList.push(item.img);
});
this.imageList = imageList;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 500);
},
testMessage() {
this.$baseMessage("test1", "success");
},
testALert() {
this.$baseAlert("11");
this.$baseAlert("11", "自定义标题", () => {
/* 可以写回调; */
});
this.$baseAlert("11", null, () => {
/* 可以写回调; */
});
},
testConfirm() {
this.$baseConfirm(
"你确定要执行该操作?",
null,
() => {
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
handleQuery() {
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data, totalCount } = await getList(this.queryForm);
this.list = data;
const imageList = [];
data.forEach((item, index) => {
imageList.push(item.img);
});
this.imageList = imageList;
this.total = totalCount;
setTimeout(() => {
this.listLoading = false;
}, 500);
},
testMessage() {
this.$baseMessage("test1", "success");
},
testALert() {
this.$baseAlert("11");
this.$baseAlert("11", "自定义标题", () => {
/* 可以写回调; */
},
() => {
});
this.$baseAlert("11", null, () => {
/* 可以写回调; */
}
);
},
testNotify() {
this.$baseNotify("测试消息提示", "test", "success", "bottom-right");
});
},
testConfirm() {
this.$baseConfirm(
"你确定要执行该操作?",
null,
() => {
/* 可以写回调; */
},
() => {
/* 可以写回调; */
}
);
},
testNotify() {
this.$baseNotify("测试消息提示", "test", "success", "bottom-right");
},
},
},
};
};
</script>
......@@ -66,44 +66,44 @@
</template>
<script>
import { getList } from "@/api/table";
import { getList } from "@/api/table";
export default {
name: "InlineEditTable",
data() {
return {
list: null,
listLoading: true,
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
},
};
},
created() {
this.getList();
},
methods: {
async getList() {
this.listLoading = true;
const { data } = await getList(this.queryForm);
this.list = data.map((v) => {
this.$set(v, "edit", false);
v.originalTitle = v.title;
return v;
});
this.listLoading = false;
export default {
name: "InlineEditTable",
data() {
return {
list: null,
listLoading: true,
elementLoadingText: "正在加载...",
queryForm: {
pageNo: 1,
pageSize: 20,
title: "",
},
};
},
cancelEdit(row) {
row.title = row.originalTitle;
row.edit = false;
created() {
this.getList();
},
confirmEdit(row) {
row.edit = false;
row.originalTitle = row.title;
methods: {
async getList() {
this.listLoading = true;
const { data } = await getList(this.queryForm);
this.list = data.map((v) => {
this.$set(v, "edit", false);
v.originalTitle = v.title;
return v;
});
this.listLoading = false;
},
cancelEdit(row) {
row.title = row.originalTitle;
row.edit = false;
},
confirmEdit(row) {
row.edit = false;
row.originalTitle = row.title;
},
},
},
};
};
</script>
......@@ -32,21 +32,24 @@
class="vab-tree-btn"
title="添加"
@click="() => append(node, data, 0)"
><i class="el-icon-plus"></i
></a>
>
<i class="el-icon-plus"></i>
</a>
<a
class="vab-tree-btn"
title="编辑"
@click="() => edit(node, data, 1)"
><i class="el-icon-edit"></i
></a>
>
<i class="el-icon-edit"></i>
</a>
<a
v-if="node.data.rank !== 1"
class="vab-tree-btn"
title="刪除"
@click="() => remove(node, data)"
><i class="el-icon-delete"></i
></a>
>
<i class="el-icon-delete"></i>
</a>
</span>
</span>
</el-tree>
......@@ -85,9 +88,9 @@
>
<i class="el-icon-plus"></i>
</a>
<a class="vab-tree-btn" title="编辑"
><i class="el-icon-edit"></i
></a>
<a class="vab-tree-btn" title="编辑">
<i class="el-icon-edit"></i>
</a>
<a
v-if="node.data.rank !== 1"
class="vab-tree-btn"
......@@ -119,12 +122,16 @@
</span>
<span class="vab-tree-options">
<!-- <a v-if="node.data.rank !== 4" class="vab-tree-btn" title="添加""><i class="el-icon-plus"></i></a> -->
<a class="vab-tree-btn" title="编辑"
><i class="el-icon-edit"></i
></a>
<a v-if="node.data.rank !== 1" class="vab-tree-btn" title="刪除"
><i class="el-icon-delete"></i
></a>
<a class="vab-tree-btn" title="编辑">
<i class="el-icon-edit"></i>
</a>
<a
v-if="node.data.rank !== 1"
class="vab-tree-btn"
title="刪除"
>
<i class="el-icon-delete"></i>
</a>
</span>
</span>
</el-tree>
......@@ -214,258 +221,258 @@
</template>
<script>
import { getTreeList } from "@/api/tree";
import { getTreeList } from "@/api/tree";
export default {
name: "Tree",
data() {
return {
dialogTitle: "添加节点",
treeFlag: 0,
treeDialogVisible: false,
treeForm: {
id: "",
name: "",
},
checkNodeKeys: [],
filterText: "",
data2: [],
defaultProps: {
children: "children",
label: "name",
},
defaultExpendedKeys: [],
defaultCheckedKeys: [],
loading: true,
keyW: "",
filterDevLlist: [],
isShow: false,
updateTree: true,
/* 单选树-多选树---------开始 */
selectLevel: 4, // 树可选叶子level等级
singleSelectTreeVal: "", //单选树默认label值
singleSelectTreeKey: "", //单选树默认key值
selectTreeData: [], //单选树的值
selectTreeDefaultSelectedKeys: [], //单选树默认展开的key值数组
selectTreeDefaultProps: {
children: "children",
label: "name",
},
multipleSelectTreeVal: [], //多选树默认label值
multipleSelectTreeKey: "", //多选树默认key值
/* 单选树-多选树---------结束 */
};
},
watch: {
filterText(val) {
this.$refs.demoTree.filter(val);
},
},
mounted() {
this.$nextTick(() => {
this.getTreeListFuc(1);
this.setCheckedKeys();
// 初始化单选树
this.initSingleTree("single");
// 初始化多选树
this.initSingleTree("multiple");
});
},
methods: {
// 树level小于n级展开方法
openTree(treeData, n) {
const each = (data) => {
data.forEach((e) => {
if (e.rank <= n) {
this.defaultExpendedKeys.push(e.id);
}
if (e.children.length > 0) {
each(e.children);
}
});
};
each(treeData);
},
// 获取tree数据
async getTreeListFuc(flag) {
const { data } = await getTreeList();
this.data2 = data;
if (flag) {
this.openTree(this.data2, 2);
}
},
// 节点过滤操作
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
// 添加节点操作
append(node, data, flag) {
this.treeFlag = flag;
this.dialogTitle = "添加节点";
this.treeForm = {
id: "",
name: "",
export default {
name: "Tree",
data() {
return {
dialogTitle: "添加节点",
treeFlag: 0,
treeDialogVisible: false,
treeForm: {
id: "",
name: "",
},
checkNodeKeys: [],
filterText: "",
data2: [],
defaultProps: {
children: "children",
label: "name",
},
defaultExpendedKeys: [],
defaultCheckedKeys: [],
loading: true,
keyW: "",
filterDevLlist: [],
isShow: false,
updateTree: true,
/* 单选树-多选树---------开始 */
selectLevel: 4, // 树可选叶子level等级
singleSelectTreeVal: "", //单选树默认label值
singleSelectTreeKey: "", //单选树默认key值
selectTreeData: [], //单选树的值
selectTreeDefaultSelectedKeys: [], //单选树默认展开的key值数组
selectTreeDefaultProps: {
children: "children",
label: "name",
},
multipleSelectTreeVal: [], //多选树默认label值
multipleSelectTreeKey: "", //多选树默认key值
/* 单选树-多选树---------结束 */
};
this.treeDialogVisible = true;
},
// 编辑节点操作
edit(node, data, flag) {
this.treeFlag = flag;
this.dialogTitle = "编辑节点";
this.treeForm = {
id: data.id,
name: data.name,
};
this.treeDialogVisible = true;
watch: {
filterText(val) {
this.$refs.demoTree.filter(val);
},
},
// 删除节点操作
remove(node, data) {
this.$baseConfirm("你确定要删除该节点?", null, async () => {
const { msg } = getTreeList();
this.$baseMessage(msg, "success");
this.getTreeListFuc(0);
mounted() {
this.$nextTick(() => {
this.getTreeListFuc(1);
this.setCheckedKeys();
// 初始化单选树
this.initSingleTree("single");
// 初始化多选树
this.initSingleTree("multiple");
});
},
// 保存添加和编辑
saveTree() {
this.$refs.treeForm.validate(async (valid) => {
if (valid) {
const { msg } = await getTreeList();
methods: {
// 树level小于n级展开方法
openTree(treeData, n) {
const each = (data) => {
data.forEach((e) => {
if (e.rank <= n) {
this.defaultExpendedKeys.push(e.id);
}
if (e.children.length > 0) {
each(e.children);
}
});
};
each(treeData);
},
// 获取tree数据
async getTreeListFuc(flag) {
const { data } = await getTreeList();
this.data2 = data;
if (flag) {
this.openTree(this.data2, 2);
}
},
// 节点过滤操作
filterNode(value, data) {
if (!value) return true;
return data.name.indexOf(value) !== -1;
},
// 添加节点操作
append(node, data, flag) {
this.treeFlag = flag;
this.dialogTitle = "添加节点";
this.treeForm = {
id: "",
name: "",
};
this.treeDialogVisible = true;
},
// 编辑节点操作
edit(node, data, flag) {
this.treeFlag = flag;
this.dialogTitle = "编辑节点";
this.treeForm = {
id: data.id,
name: data.name,
};
this.treeDialogVisible = true;
},
// 删除节点操作
remove(node, data) {
this.$baseConfirm("你确定要删除该节点?", null, async () => {
const { msg } = getTreeList();
this.$baseMessage(msg, "success");
this.treeDialogVisible = false;
this.getTreeListFuc(0);
});
},
// 保存添加和编辑
saveTree() {
this.$refs.treeForm.validate(async (valid) => {
if (valid) {
const { msg } = await getTreeList();
this.$baseMessage(msg, "success");
this.treeDialogVisible = false;
this.getTreeListFuc(0);
}
});
},
// 设置节点选中
setCheckedKeys() {
this.$refs.demoTree.setCheckedKeys([1]);
},
// 点击叶子节点
nodeClick(data, node, el) {},
// 节点选中操作
checkNode(data, node, el) {
this.checkNodeKeys = node.checkedKeys;
},
// 节点展开操作
nodeExpand(data, node, el) {
this.defaultExpendedKeys.push(data.id);
},
// 节点关闭操作
nodeCollapse(data, node, el) {
this.defaultExpendedKeys.splice(
this.defaultExpendedKeys.findIndex((item) => item.id === data.id),
1
);
},
async loadNode(node, resolve) {
if (node.level === 0) {
const { data } = await getTreeList();
this.loading = false;
return resolve(data);
} else {
const { data } = await getTreeList();
return resolve(res.data);
}
});
},
// 设置节点选中
setCheckedKeys() {
this.$refs.demoTree.setCheckedKeys([1]);
},
// 点击叶子节点
nodeClick(data, node, el) {},
// 节点选中操作
checkNode(data, node, el) {
this.checkNodeKeys = node.checkedKeys;
},
// 节点展开操作
nodeExpand(data, node, el) {
this.defaultExpendedKeys.push(data.id);
},
// 节点关闭操作
nodeCollapse(data, node, el) {
this.defaultExpendedKeys.splice(
this.defaultExpendedKeys.findIndex((item) => item.id === data.id),
1
);
},
async loadNode(node, resolve) {
if (node.level === 0) {
const { data } = await getTreeList();
this.loading = false;
return resolve(data);
} else {
const { data } = await getTreeList();
return resolve(res.data);
}
},
//懒加载树输入框筛选方法
async showTreeList(value) {
if (typeof value === "string") {
this.keyW = value.trim();
}
if (this.keyW.length !== 0) {
// 请求后台返回查询结果
let treeOption = {};
treeOption = {
keyWord: this.keyW,
};
const { data } = await getTreeList();
this.filterDevLlist = data;
this.isShow = true;
} else {
this.isShow = false;
}
},
/* 单选/多选树方法-------------------开始 */
// 初始化单选树的值
async initSingleTree(treeType) {
const { data } = await getTreeList();
this.selectTreeData = data;
this.$nextTick(() => {
this.selectTreeDefaultSelectedKeys = this.singleSelectTreeKey.split(
","
); // 设置默认展开
if (treeType == "single") {
//单选树
this.$refs.singleSelectTree.setCurrentKey(this.singleSelectTreeKey); // 设置默认选中
},
//懒加载树输入框筛选方法
async showTreeList(value) {
if (typeof value === "string") {
this.keyW = value.trim();
}
if (this.keyW.length !== 0) {
// 请求后台返回查询结果
let treeOption = {};
treeOption = {
keyWord: this.keyW,
};
const { data } = await getTreeList();
this.filterDevLlist = data;
this.isShow = true;
} else {
// 多选树
this.$refs.multipleSelectTree.setCheckedKeys(
this.selectTreeDefaultSelectedKeys
);
this.isShow = false;
}
});
},
// 清除单选树选中
selectTreeClearHandle(type) {
this.selectTreeDefaultSelectedKeys = [];
this.clearSelected();
if (type == "single") {
this.singleSelectTreeVal = "";
this.singleSelectTreeKey = "";
this.$refs.singleSelectTree.setCurrentKey(""); // 设置默认选中
} else {
this.multipleSelectTreeVal = [];
this.multipleSelectTreeKey = "";
this.$refs.multipleSelectTree.setCheckedKeys([]);
}
},
/* 清空选中样式 */
clearSelected() {
const allNode = document.querySelectorAll(
"#singleSelectTree .el-tree-node"
);
allNode.forEach((element) => element.classList.remove("is-current"));
},
// select多选时移除某项操作
removeSelectTreeTag(val) {
const stack = JSON.parse(JSON.stringify(this.selectTreeData));
while (stack.length) {
const curr = stack.shift();
if (curr.name == val) {
return this.$refs.multipleSelectTree.setChecked(curr.id, false);
},
/* 单选/多选树方法-------------------开始 */
// 初始化单选树的值
async initSingleTree(treeType) {
const { data } = await getTreeList();
this.selectTreeData = data;
this.$nextTick(() => {
this.selectTreeDefaultSelectedKeys = this.singleSelectTreeKey.split(
","
); // 设置默认展开
if (treeType == "single") {
//单选树
this.$refs.singleSelectTree.setCurrentKey(this.singleSelectTreeKey); // 设置默认选中
} else {
// 多选树
this.$refs.multipleSelectTree.setCheckedKeys(
this.selectTreeDefaultSelectedKeys
);
}
});
},
// 清除单选树选中
selectTreeClearHandle(type) {
this.selectTreeDefaultSelectedKeys = [];
this.clearSelected();
if (type == "single") {
this.singleSelectTreeVal = "";
this.singleSelectTreeKey = "";
this.$refs.singleSelectTree.setCurrentKey(""); // 设置默认选中
} else {
this.multipleSelectTreeVal = [];
this.multipleSelectTreeKey = "";
this.$refs.multipleSelectTree.setCheckedKeys([]);
}
if (curr.children && curr.children.length) {
stack.unshift(...curr.children);
},
/* 清空选中样式 */
clearSelected() {
const allNode = document.querySelectorAll(
"#singleSelectTree .el-tree-node"
);
allNode.forEach((element) => element.classList.remove("is-current"));
},
// select多选时移除某项操作
removeSelectTreeTag(val) {
const stack = JSON.parse(JSON.stringify(this.selectTreeData));
while (stack.length) {
const curr = stack.shift();
if (curr.name == val) {
return this.$refs.multipleSelectTree.setChecked(curr.id, false);
}
if (curr.children && curr.children.length) {
stack.unshift(...curr.children);
}
}
}
},
changeMultipleSelectTreeHandle(val) {},
// 点击叶子节点
selectTreeNodeClick(data, node, el) {
if (data.rank >= this.selectLevel) {
this.singleSelectTreeVal = data.name;
this.singleSelectTreeKey = data.id;
this.$refs.singleTree.blur();
}
},
// 节点选中操作
multipleSelectTreeCheckNode(data, node, el) {
const checkedNodes = this.$refs.multipleSelectTree.getCheckedNodes();
const keyArr = [];
const valueArr = [];
checkedNodes.forEach((item) => {
if (item.rank >= this.selectLevel) {
keyArr.push(item.id);
valueArr.push(item.name);
},
changeMultipleSelectTreeHandle(val) {},
// 点击叶子节点
selectTreeNodeClick(data, node, el) {
if (data.rank >= this.selectLevel) {
this.singleSelectTreeVal = data.name;
this.singleSelectTreeKey = data.id;
this.$refs.singleTree.blur();
}
});
this.multipleSelectTreeVal = valueArr;
this.multipleSelectTreeKey = keyArr.join(",");
},
// 节点选中操作
multipleSelectTreeCheckNode(data, node, el) {
const checkedNodes = this.$refs.multipleSelectTree.getCheckedNodes();
const keyArr = [];
const valueArr = [];
checkedNodes.forEach((item) => {
if (item.rank >= this.selectLevel) {
keyArr.push(item.id);
valueArr.push(item.name);
}
});
this.multipleSelectTreeVal = valueArr;
this.multipleSelectTreeKey = keyArr.join(",");
},
/* 单选/多选树方法-------------------结束 */
},
/* 单选/多选树方法-------------------结束 */
},
};
};
</script>
<template>
<div class="upload-container">
<el-divider content-position="left">演示环境可能无法模拟上传 </el-divider>
<el-divider content-position="left">演示环境可能无法模拟上传</el-divider>
<vab-upload
ref="vabUpload"
url="/upload"
......@@ -8,27 +8,27 @@
:limit="50"
:size="2"
></vab-upload>
<el-button type="primary" @click="handleShow({ key: 'value' })"
>模拟上传
<el-button type="primary" @click="handleShow({ key: 'value' })">
模拟上传
</el-button>
</div>
</template>
<script>
import VabUpload from "@/components/VabUpload";
import VabUpload from "@/components/VabUpload";
export default {
name: "Upload",
components: {
VabUpload,
},
data() {
return {};
},
methods: {
handleShow(data) {
this.$refs["vabUpload"].handleShow(data);
export default {
name: "Upload",
components: {
VabUpload,
},
},
};
data() {
return {};
},
methods: {
handleShow(data) {
this.$refs["vabUpload"].handleShow(data);
},
},
};
</script>
......@@ -12,24 +12,24 @@
</template>
<script>
import VabVerify from "@/plugins/vabVerify";
export default {
name: "Verify",
components: { VabVerify },
data() {
return {
text: "向右滑动",
};
},
created() {},
mounted() {},
methods: {
handleSuccess() {
this.$baseMessage("校验成功", "success");
import VabVerify from "@/plugins/vabVerify";
export default {
name: "Verify",
components: { VabVerify },
data() {
return {
text: "向右滑动",
};
},
handleError() {
this.$baseMessage("校验失败", "error");
created() {},
mounted() {},
methods: {
handleSuccess() {
this.$baseMessage("校验成功", "success");
},
handleError() {
this.$baseMessage("校验失败", "error");
},
},
},
};
};
</script>
......@@ -14,7 +14,7 @@
<el-input v-model="form.message"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submit">发送消息 </el-button>
<el-button type="primary" @click="submit">发送消息</el-button>
</el-form-item>
<el-form-item label="返回信息汇总">
{{ data }}
......@@ -26,62 +26,62 @@
</template>
<script>
export default {
name: "WebSocket",
components: {},
data() {
return {
url: "ws://123.207.136.134:9010/ajaxchattest",
webSocket: null,
data: [],
status: "",
form: { message: null },
rules: {
message: [{ required: true, message: "请输入消息", trigger: "blur" }],
},
};
},
created() {
this.init();
},
destroyed() {
this.webSocket.close();
},
methods: {
submit() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.send(this.form.message);
} else {
return false;
}
});
},
init() {
const wsuri = this.url;
this.webSocket = new WebSocket(wsuri);
this.webSocket.onmessage = this.onmessage;
this.webSocket.onopen = this.onopen;
this.webSocket.onerror = this.onerror;
this.webSocket.onclose = this.onclose;
},
onopen() {
this.status = "成功";
export default {
name: "WebSocket",
components: {},
data() {
return {
url: "ws://123.207.136.134:9010/ajaxchattest",
webSocket: null,
data: [],
status: "",
form: { message: null },
rules: {
message: [{ required: true, message: "请输入消息", trigger: "blur" }],
},
};
},
onerror() {
this.status = "失败";
this.initWebSocket();
created() {
this.init();
},
onmessage({ data }) {
//截掉测试webSocket地址广告
this.data.push(data.substring(0, data.length - 66));
destroyed() {
this.webSocket.close();
},
send(Data) {
this.webSocket.send(Data);
},
onclose(e) {
this.status = "断开";
methods: {
submit() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.send(this.form.message);
} else {
return false;
}
});
},
init() {
const wsuri = this.url;
this.webSocket = new WebSocket(wsuri);
this.webSocket.onmessage = this.onmessage;
this.webSocket.onopen = this.onopen;
this.webSocket.onerror = this.onerror;
this.webSocket.onclose = this.onclose;
},
onopen() {
this.status = "成功";
},
onerror() {
this.status = "失败";
this.initWebSocket();
},
onmessage({ data }) {
//截掉测试webSocket地址广告
this.data.push(data.substring(0, data.length - 66));
},
send(Data) {
this.webSocket.send(Data);
},
onclose(e) {
this.status = "断开";
},
},
},
};
};
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment