mod vue2 to vue3
This commit is contained in:
Generated
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="JAVA_MODULE" version="4">
|
<module type="JAVA_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="true">
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
|
|||||||
@@ -2,28 +2,44 @@ package com.bc.exam;
|
|||||||
|
|
||||||
import com.bc.exam.core.api.utils.JsonConverter;
|
import com.bc.exam.core.api.utils.JsonConverter;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description 描述:springboot 系统启动
|
* 启动类
|
||||||
* @Author A贾宇婷034244310
|
|
||||||
* @Date 20260615
|
|
||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
public class ExamApplication implements WebMvcConfigurer {
|
public class ExamApplication implements WebMvcConfigurer {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws UnknownHostException {
|
||||||
|
ConfigurableApplicationContext application = SpringApplication.run(ExamApplication.class, args);
|
||||||
|
Environment env = application.getEnvironment();
|
||||||
|
String ip = InetAddress.getLocalHost().getHostAddress();
|
||||||
|
String port = env.getProperty("server.port");
|
||||||
|
String path = env.getProperty("server.servlet.context-path");
|
||||||
|
|
||||||
|
// 未配置默认空白
|
||||||
|
if(path == null){
|
||||||
|
path = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
log.info("\n----------------------------------------------------------\n\t" +
|
log.info("\n----------------------------------------------------------\n\t" +
|
||||||
"系统启动成功,访问路径如下:\n\t" +
|
"系统启动成功,访问路径如下:\n\t" +
|
||||||
"本地路径: \t\thttp://127.0.0.1:8101/\n\t"+
|
"本地路径: \t\thttp://127.0.0.1:" + port + path + "/\n\t" +
|
||||||
"API文档: \t\thttp://127.0.0.1:8101/doc.html\n\t" +
|
"网络地址: \thttp://" + ip + ":" + port + path + "/\n\t" +
|
||||||
|
"API文档: \t\thttp://" + ip + ":" + port + path + "/doc.html\n" +
|
||||||
"----------------------------------------------------------");
|
"----------------------------------------------------------");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ public class ShiroConfig {
|
|||||||
map.put("/**/*.pdf", "anon");
|
map.put("/**/*.pdf", "anon");
|
||||||
map.put("/**/*.jpg", "anon");
|
map.put("/**/*.jpg", "anon");
|
||||||
map.put("/**/*.png", "anon");
|
map.put("/**/*.png", "anon");
|
||||||
|
map.put("/**/*.gif", "anon");
|
||||||
map.put("/**/*.ico", "anon");
|
map.put("/**/*.ico", "anon");
|
||||||
|
|
||||||
// 字体
|
// 字体
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 9.0 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.wscn-http404-container[data-v-26fcd89f]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-26fcd89f]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-26fcd89f]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-26fcd89f]{width:100%}.wscn-http404 .pic-404__child[data-v-26fcd89f]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-26fcd89f]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-data-v-26fcd89f;animation-name:cloudLeft-data-v-26fcd89f;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-26fcd89f]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-data-v-26fcd89f;animation-name:cloudMid-data-v-26fcd89f;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-26fcd89f]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-data-v-26fcd89f;animation-name:cloudRight-data-v-26fcd89f;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-data-v-26fcd89f{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-data-v-26fcd89f{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-data-v-26fcd89f{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-data-v-26fcd89f{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-data-v-26fcd89f{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-data-v-26fcd89f{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-26fcd89f]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-26fcd89f]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-26fcd89f],.wscn-http404 .bullshit__oops[data-v-26fcd89f]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-data-v-26fcd89f;animation-name:slideUp-data-v-26fcd89f;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-26fcd89f]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-26fcd89f]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-26fcd89f],.wscn-http404 .bullshit__return-home[data-v-26fcd89f]{opacity:0;-webkit-animation-name:slideUp-data-v-26fcd89f;animation-name:slideUp-data-v-26fcd89f;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-26fcd89f]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-data-v-26fcd89f{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-data-v-26fcd89f{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.box[data-v-1a09886c]{height:calc(100vh - 120px);font-size:14px;line-height:28px}.title[data-v-1a09886c]{font-size:18px;font-weight:700;padding-bottom:10px;padding-top:20px;margin-bottom:10px;border-bottom:1px dotted #eee}.tags span[data-v-1a09886c]{margin-right:10px}.box a[data-v-1a09886c]{color:#20a0ff}.box a[data-v-1a09886c]:hover{color:red}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pan-item[data-v-799537af]{width:200px;height:200px;border-radius:50%;display:inline-block;position:relative;cursor:default;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}.pan-info-roles-container[data-v-799537af]{padding:20px;text-align:center}.pan-thumb[data-v-799537af]{width:100%;height:100%;background-position:50%;background-size:cover;border-radius:50%;overflow:hidden;position:absolute;-webkit-transform-origin:95% 40%;transform-origin:95% 40%;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.pan-info[data-v-799537af]{position:absolute;width:inherit;height:inherit;border-radius:50%;overflow:hidden;-webkit-box-shadow:inset 0 0 0 5px rgba(0,0,0,.05);box-shadow:inset 0 0 0 5px rgba(0,0,0,.05)}.pan-info h3[data-v-799537af]{color:#fff;text-transform:uppercase;position:relative;letter-spacing:2px;font-size:18px;margin:0 60px;padding:22px 0 0 0;height:85px;font-family:Open Sans,Arial,sans-serif;text-shadow:0 0 1px #fff,0 1px 2px rgba(0,0,0,.3)}.pan-info p[data-v-799537af]{color:#fff;padding:10px 5px;font-style:italic;margin:0 30px;font-size:12px;border-top:1px solid hsla(0,0%,100%,.5)}.pan-info p a[data-v-799537af]{display:block;color:#333;width:80px;height:80px;background:hsla(0,0%,100%,.3);border-radius:50%;color:#fff;font-style:normal;font-weight:700;text-transform:uppercase;font-size:9px;letter-spacing:1px;padding-top:24px;margin:7px auto 0;font-family:Open Sans,Arial,sans-serif;opacity:0;-webkit-transition:opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;transition:opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;transition:transform .3s ease-in-out .2s,opacity .3s ease-in-out .2s,background .2s linear 0s;transition:transform .3s ease-in-out .2s,opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;-webkit-transform:translateX(60px) rotate(90deg);transform:translateX(60px) rotate(90deg)}.pan-info p a[data-v-799537af]:hover{background:hsla(0,0%,100%,.5)}.pan-item:hover .pan-thumb[data-v-799537af]{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.pan-item:hover .pan-info p a[data-v-799537af]{opacity:1;-webkit-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)}.box-center[data-v-e538f184]{margin:0 auto;display:table}.text-muted[data-v-e538f184]{color:#777}.user-profile .user-name[data-v-e538f184]{font-weight:700}.user-profile .box-center[data-v-e538f184]{padding-top:10px}.user-profile .user-role[data-v-e538f184]{padding-top:10px;font-weight:400;font-size:14px}.user-profile .box-social[data-v-e538f184]{padding-top:30px}.user-profile .box-social .el-table[data-v-e538f184]{border-top:1px solid #dfe6ec}.user-profile .user-follow[data-v-e538f184]{padding-top:20px}.user-bio[data-v-e538f184]{margin-top:20px;color:#606266}.user-bio span[data-v-e538f184]{padding-left:4px}.user-bio .user-bio-section[data-v-e538f184]{font-size:14px;padding:15px 0}.user-bio .user-bio-section .user-bio-section-header[data-v-e538f184]{border-bottom:1px solid #dfe6ec;padding-bottom:10px;margin-bottom:10px;font-weight:700}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.errPage-container[data-v-35ca77fc]{width:800px;max-width:100%;margin:100px auto}.errPage-container .pan-back-btn[data-v-35ca77fc]{background:#008489;color:#fff;border:none!important}.errPage-container .pan-gif[data-v-35ca77fc]{margin:0 auto;display:block}.errPage-container .pan-img[data-v-35ca77fc]{display:block;margin:0 auto;width:100%}.errPage-container .text-jumbo[data-v-35ca77fc]{font-size:60px;font-weight:700;color:#484848}.errPage-container .list-unstyled[data-v-35ca77fc]{font-size:14px}.errPage-container .list-unstyled li[data-v-35ca77fc]{padding-bottom:5px}.errPage-container .list-unstyled a[data-v-35ca77fc]{color:#008489;text-decoration:none}.errPage-container .list-unstyled a[data-v-35ca77fc]:hover{text-decoration:underline}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.filter-container .filter-item{margin-left:5px}.filter-container .filter-item:first-child{margin-left:0}.el-input.el-input--suffix{cursor:pointer;overflow:hidden}.el-input.el-input--suffix.rotate .el-input__suffix{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.select-tree{max-height:350px;overflow-y:scroll}.select-tree::-webkit-scrollbar{z-index:11;width:6px}.select-tree::-webkit-scrollbar-corner,.select-tree::-webkit-scrollbar-track{background:#fff}.select-tree::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.select-tree::-webkit-scrollbar-track-piece{background:#fff;width:6px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;-webkit-box-shadow:0 0 10px #29d,0 0 5px #29d;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 160 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
|
||||||
<title>Group 21</title>
|
|
||||||
<desc>Created with Sketch.</desc>
|
|
||||||
<defs></defs>
|
|
||||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
|
|
||||||
<g id="Group-21" transform="translate(77.000000, 73.000000)">
|
|
||||||
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
|
|
||||||
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
|
|
||||||
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
|
|
||||||
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
|
|
||||||
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
|
|
||||||
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
|
||||||
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
|
||||||
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
|
|
||||||
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
|
|
||||||
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
|
|
||||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
|
|
||||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
|
|
||||||
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
|
|
||||||
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
|
|
||||||
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
|
|
||||||
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
|
|
||||||
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
|
|
||||||
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
|
|
||||||
</g>
|
|
||||||
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
|
|
||||||
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
|
|
||||||
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
|
|
||||||
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
|
|
||||||
</g>
|
|
||||||
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
|
|
||||||
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
|
|
||||||
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
|
|
||||||
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
|
|
||||||
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
|
|
||||||
</g>
|
|
||||||
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
|
||||||
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
|
|
||||||
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
|
|
||||||
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
|
||||||
</g>
|
|
||||||
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
|
|
||||||
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
|
|
||||||
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
|
|
||||||
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
|
|
||||||
</g>
|
|
||||||
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
|
|
||||||
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
|
||||||
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
|
||||||
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
|
|
||||||
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
|
|
||||||
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
|
||||||
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
|
|
||||||
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
|
|
||||||
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
|
|
||||||
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
|
|
||||||
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
|
|
||||||
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 8.7 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-11cf6270"],{"6ab0":function(t,e,a){"use strict";a.d(e,"a",(function(){return i}));var l=a("b775");function i(t){return Object(l["a"])("/tjhxxb/controller/guihuan",t)}},"6cb9":function(t,e,a){"use strict";a.d(e,"a",(function(){return i}));var l=a("b775");function i(t){return Object(l["a"])("/tjhxxb/controller/jiechu",t)}},dce5:function(t,e,a){"use strict";a.r(e);var l=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[a("data-table",{ref:"pagingTable",attrs:{options:t.options,"list-query":t.listQuery},on:{"multi-actions":t.handleMultiAction}},[a("template",{slot:"filter-content"},[a("el-input",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{placeholder:"搜索书名"},model:{value:t.listQuery.params.bookname,callback:function(e){t.$set(t.listQuery.params,"bookname",e)},expression:"listQuery.params.bookname"}}),a("el-select",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{placeholder:"搜索借还类型"},model:{value:t.listQuery.params.state,callback:function(e){t.$set(t.listQuery.params,"state",e)},expression:"listQuery.params.state"}},t._l(t.stateDicData,(function(t){return a("el-option",{key:t.value,attrs:{label:t.text,value:t.value}})})),1),a("el-date-picker",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{type:"datetime",format:"yyyy-MM-dd",placeholder:"选择开始时间","value-format":"yyyy-MM-dd"},model:{value:t.listQuery.params.createTime,callback:function(e){t.$set(t.listQuery.params,"createTime",e)},expression:"listQuery.params.createTime"}}),a("el-date-picker",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{type:"datetime",format:"yyyy-MM-dd",placeholder:"选择结束时间","value-format":"yyyy-MM-dd"},model:{value:t.listQuery.params.updateTime,callback:function(e){t.$set(t.listQuery.params,"updateTime",e)},expression:"listQuery.params.updateTime"}})],1),a("template",{slot:"data-columns"},[a("el-table-column",{attrs:{align:"center",label:"书名",prop:"bookname"}}),a("el-table-column",{attrs:{formatter:t.dataFormatter,align:"center",label:"借还类型",prop:"state","class-name":"DIC_JHTYPE"}}),a("el-table-column",{attrs:{align:"center",label:"发生时间"},scopedSlots:t._u([{key:"default",fn:function(e){return[t._v(" "+t._s(t._f("xmDateFormat")(e.row.createTime))+" ")]}}])})],1)],2)],1)},i=[],s=a("7845"),r=a("4237"),n=a("5ba1"),o=(a("9b73"),a("940b")),c=a("ed08"),u=(a("d21e"),a("1bd4"),a("6cb9"),a("6ab0")),d={name:"BysxxglList",components:{DepartTreeSelect:n["a"],DataTable:s["a"],MeetRole:r["a"]},data:function(){return{defaultProps:{value:"value",text:"text",label:"deptName",children:"children"},qcglData:{},dialogVisible:!1,listQuery:{current:0,size:10,total:0,params:{}},formData:{avatar:""},stateDicData:[],tszlDicData:[],options:{listUrl:"/tlog/logcontrol/paging",stateUrl:"/tsjxxb/controller/state",deleteUrl:"/tsjxxb/controller/delete",multiActions:[{value:"enable",label:"启用"},{value:"disable",label:"禁用"},{value:"delete",label:"删除"}]}}},created:function(){var t=this;Object(o["a"])("DIC_TSZL").then((function(e){t.tszlDicData=e.data})),Object(o["a"])("DIC_JHTYPE").then((function(e){t.stateDicData=e.data}))},methods:{dataFormatter:c["b"],handleAdd:function(){this.formData={},this.dialogVisible=!0,console.log("新增")},handleUpdate:function(t){this.dialogVisible=!0,this.formData=t},handleUpCancel:function(){this.dialogVisible=!1},departSelected:function(t){this.formData.id=t.id,console.log(t+"----depart")},handleSave:function(){var t=this;Object(u["a"])(this.formData).then((function(e){t.$message({type:"success",message:"成功!"},{type:"error",message:e.msg}),t.dialogVisible=!1,t.$refs.pagingTable.getList()}))},handleMultiAction:function(t){"cancel"===t.opt&&this.handleCancelOrder(t.ids)}}},m=d,p=a("e607"),b=Object(p["a"])(m,l,i,!1,null,null,null);e["default"]=b.exports}}]);
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1ec2b688"],{"1db4":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._m(1),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("89a2"),a("e607")),r=Object(n["a"])(l,e,c,!1,null,"26fcd89f",null);s["default"]=r.exports},"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},"600e":function(t,s,a){},"89a2":function(t,s,a){"use strict";a("600e")},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"}}]);
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0cf932"],{"63fe":function(e,t,i){"use strict";i.r(t);var l=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"app-container"},[i("el-form",{ref:"postForm",attrs:{model:e.postForm,rules:e.rules,"label-position":"left","label-width":"100px"}},[i("el-card",[i("el-form-item",{attrs:{label:"系统名称"}},[i("el-input",{attrs:{placeholder:"系统显示名称"},model:{value:e.postForm.siteName,callback:function(t){e.$set(e.postForm,"siteName",t)},expression:"postForm.siteName"}})],1),i("el-form-item",{attrs:{label:"版权信息"}},[i("el-input",{attrs:{placeholder:"登录页底部版权信息"},model:{value:e.postForm.copyRight,callback:function(t){e.$set(e.postForm,"copyRight",t)},expression:"postForm.copyRight"}})],1),i("el-row",[i("el-button",{attrs:{type:"primary"},on:{click:e.submitForm}},[e._v("保存")])],1)],1)],1)],1)},s=[],a=i("83ef"),o=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",[i("file-upload-local",{attrs:{accept:e.accept,tips:e.tips,"list-type":e.listType},model:{value:e.fileUrl,callback:function(t){e.fileUrl=t},expression:"fileUrl"}})],1)},n=[],r=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[i("el-upload",{attrs:{action:e.server,accept:e.accept,"before-remove":e.beforeRemove,"on-remove":e.handleRemove,"on-success":e.handleSuccess,"on-exceed":e.handleExceed,drag:"picture"!==e.listType,limit:e.limit,headers:e.header,"file-list":e.fileList,"list-type":e.listType},model:{value:e.fileUrl,callback:function(t){e.fileUrl=t},expression:"fileUrl"}},["picture"===e.listType?i("el-button",{attrs:{size:"small",type:"primary"}},[e._v("点击上传")]):e._e(),"picture"!==e.listType?i("i",{staticClass:"el-icon-upload"}):e._e(),"picture"!==e.listType?i("div",{staticClass:"el-upload__text"},[e._v(" 将文件拖到此处,或 "),i("em",[e._v("点击上传")])]):e._e(),e.tips?i("div",{staticClass:"el-upload__tip",attrs:{slot:"tip"},slot:"tip"},[e._v(e._s(e.tips))]):e._e()],1)],1)},c=[],u=(i("e680"),i("5f87")),p={name:"FileUploadLocal",props:{value:String,accept:String,tips:String,listType:String,limit:{type:Number,default:1}},data:function(){return{server:"".concat("","/common/api/file/upload"),fileList:[],fileUrl:"",header:{}}},watch:{value:{handler:function(){this.fillValue()}}},created:function(){this.fillValue(),this.header={token:Object(u["a"])()}},methods:{fillValue:function(){this.fileList=[],this.fileUrl=this.value,this.fileUrl&&(this.fileList=[{name:this.fileUrl,url:this.fileUrl}])},handleExceed:function(){this.$message.warning("每次只能上传 ".concat(this.limit," 个文件"))},beforeRemove:function(){return this.$confirm("确定移除文件吗?")},handleRemove:function(){this.$emit("input",""),this.fileList=[]},handleSuccess:function(e){if(1===e.code)return this.$message({type:"error",message:e.msg}),void(this.fileList=[]);this.$emit("input",e.data.url)}}},f=p,m=i("e607"),d=Object(m["a"])(f,r,c,!1,null,null,null),h=d.exports,v={name:"FileUpload",components:{FileUploadLocal:h},props:{value:String,accept:{type:String,default:"*"},tips:String,listType:{type:String,default:"picture"}},data:function(){return{fileUrl:""}},watch:{value:{handler:function(){this.fillValue()}},fileUrl:{handler:function(){this.$emit("input",this.fileUrl)}}},mounted:function(){},created:function(){this.fillValue()},methods:{fillValue:function(){this.fileUrl=this.value}}},b=v,g=Object(m["a"])(b,o,n,!1,null,null,null),y=g.exports,F={name:"Config",components:{FileUpload:y},data:function(){return{postForm:{id:"1"},loading:!1,rules:{}}},created:function(){this.fetchData()},methods:{fetchData:function(){var e=this;Object(a["a"])().then((function(t){e.postForm=t.data}))},submitForm:function(){var e=this;console.log(JSON.stringify(this.postForm)),this.$refs.postForm.validate((function(t){t&&(e.loading=!0,e.postForm.id="1",Object(a["b"])(e.postForm).then((function(){e.$notify({title:"成功",message:"配置保存成功!",type:"success",duration:2e3})})),e.loading=!1)}))}}},_=F,U=Object(m["a"])(_,l,s,!1,null,"3b759aaf",null);t["default"]=U.exports}}]);
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0f1194"],{"9ed6":function(e,t,r){"use strict";r.r(t);var o=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[e._m(0),r("el-form",{ref:"postForm",attrs:{model:e.postForm,rules:e.loginRules}},[r("el-form-item",{attrs:{prop:"username"}},[r("el-input",{staticStyle:{width:"100%"},attrs:{placeholder:"用户名","prefix-icon":"el-icon-user"},model:{value:e.postForm.username,callback:function(t){e.$set(e.postForm,"username",t)},expression:"postForm.username"}})],1),r("el-form-item",{attrs:{prop:"password"}},[r("el-input",{staticStyle:{width:"100%"},attrs:{"show-password":"",placeholder:"密码",type:"password","prefix-icon":"el-icon-lock"},model:{value:e.postForm.password,callback:function(t){e.$set(e.postForm,"password",t)},expression:"postForm.password"}})],1),r("el-form-item",[r("el-button",{staticStyle:{width:"100%"},attrs:{loading:e.loading,type:"primary"},nativeOn:{click:function(t){return t.preventDefault(),e.accountLogin(t)}}},[e._v("登录")])],1)],1),r("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"flex-end"}},[r("el-link",{attrs:{type:"primary",href:"/#/register"}},[e._v("立即注册")])],1)],1)},n=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"title-box"},[r("div",[e._v("用户登录")])])}],s=(r("ac67"),r("1bc7"),r("32ea"),r("559a")),i=r("52c1");function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){Object(s["a"])(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var l={data:function(){return{loading:!1,postForm:{username:"",password:""},loginRules:{username:[{required:!0,trigger:"blur",message:"用户名不能为空"}],password:[{required:!0,trigger:"blur",message:"密码不能为空"}]}}},computed:c({},Object(i["b"])(["siteData"])),methods:{loginBack:function(){this.$router.push({path:"/admin/dashboard"}),setTimeout((function(){this.loading=!1}),1800)},accountLogin:function(){var e=this;this.$refs.postForm.validate((function(t){t&&(e.loading=!0,e.$store.dispatch("user/login",e.postForm).then((function(){e.loginBack()})).catch((function(){e.loading=!1})))}))}}},p=l,u=r("e607"),d=Object(u["a"])(p,o,n,!1,null,null,null);t["default"]=d.exports}}]);
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d2109eb"],{b953:function(e,t,r){"use strict";r.r(t);var o=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",[e._m(0),r("el-form",{ref:"postForm",attrs:{model:e.postForm,rules:e.loginRules}},[r("el-form-item",{attrs:{prop:"userName"}},[r("el-input",{staticStyle:{width:"100%"},attrs:{placeholder:"用户名","prefix-icon":"el-icon-mobile"},model:{value:e.postForm.userName,callback:function(t){e.$set(e.postForm,"userName",t)},expression:"postForm.userName"}})],1),r("el-form-item",{attrs:{prop:"realName"}},[r("el-input",{staticStyle:{width:"100%"},attrs:{placeholder:"姓名","prefix-icon":"el-icon-user"},model:{value:e.postForm.realName,callback:function(t){e.$set(e.postForm,"realName",t)},expression:"postForm.realName"}})],1),r("el-form-item",{attrs:{prop:"password"}},[r("el-input",{staticStyle:{width:"100%"},attrs:{"show-password":"",placeholder:"密码",type:"password","prefix-icon":"el-icon-lock"},model:{value:e.postForm.password,callback:function(t){e.$set(e.postForm,"password",t)},expression:"postForm.password"}})],1),r("el-form-item",[r("el-button",{staticStyle:{width:"100%"},attrs:{loading:e.loading,type:"primary"},nativeOn:{click:function(t){return t.preventDefault(),e.handleReg(t)}}},[e._v("注册")])],1)],1),r("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"flex-end"}},[r("el-link",{attrs:{type:"primary",href:"/#/login"}},[e._v("已有账号")])],1)],1)},s=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"title-box"},[r("div",[e._v("用户注册")])])}],a=(r("ac67"),r("1bc7"),r("32ea"),r("559a")),i=r("52c1");function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){Object(a["a"])(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var c={data:function(){return{postForm:{mobile:"",password:""},loginRules:{password:[{required:!0,trigger:"blur",message:"登录密码不能为空!"}],userName:[{required:!0,trigger:"blur",message:"用户名不能为空!"}],realName:[{required:!0,trigger:"blur",message:"姓名不能为空!"}],captchaValue:[{required:!0,trigger:"blur",message:"验证码不能为空"}]},loading:!1}},computed:l({},Object(i["b"])(["siteData"])),methods:{handleReg:function(){var e=this;this.$refs.postForm.validate((function(t){t&&(e.loading=!0,e.$store.dispatch("user/reg",e.postForm).then((function(){e.$router.push({path:e.redirect||"/admin/dashboard"}),e.loading=!1})).catch((function(){e.loading=!1})))}))}}},p=c,u=r("e607"),m=Object(u["a"])(p,o,s,!1,null,null,null);t["default"]=m.exports}}]);
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d230fe7"],{ef3c:function(e,r,n){"use strict";n.r(r);n("8dee");var t,u,a={created:function(){var e=this.$route,r=e.params,n=e.query,t=r.path;this.$router.replace({path:"/"+t,query:n})},render:function(e){return e()}},c=a,o=n("e607"),p=Object(o["a"])(c,t,u,!1,null,null,null);r["default"]=p.exports}}]);
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-6cb6a4de"],{"8ccf":function(t,e,a){},"934a":function(t,e,a){"use strict";a("8ccf")},9406:function(t,e,a){"use strict";a.r(e);var i=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container"},[a("el-row",{attrs:{gutter:20}},[a("el-col",{attrs:{span:16}},[a("el-card",{staticClass:"box"},[a("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[a("span",[t._v("项目信息")]),a("el-button",{staticStyle:{float:"right",padding:"3px 0","font-size":"12px"},attrs:{type:"text"}},[t._v("系统版本:1.0.0")])],1),a("div",{staticStyle:{"line-height":"32px"}},[a("div",{staticClass:"title",staticStyle:{"padding-top":"0px"}},[t._v("系统介绍")]),t._v(" 本毕设图书管理系统是一款基于SpringBoot+Vue开发的管理系统。包含用户体系、权限管理、图书信息管理、借还流程等业务闭环功能,流程通畅。 "),a("div",{staticClass:"title"},[t._v("技术栈")]),a("div",{staticClass:"tags"},[a("el-tag",[t._v("SpringBoot")]),a("el-tag",[t._v("Shiro")]),a("el-tag",[t._v("MyBatis Plus")]),a("el-tag",[t._v("Redis")]),a("el-tag",[t._v("JWT")]),a("el-tag",[t._v("Vue")]),a("el-tag",[t._v("Vue2")]),a("el-tag",[t._v("ElementUI")])],1),a("div",{staticClass:"title"},[t._v("产品功能")]),a("div",[a("div",[t._v("系统完善:完善的前后端分离架构、规范的接口文档")]),a("div",[t._v("权限控制:基于Shiro和JWT开发的权限控制功能。")]),a("div",[t._v("基础功能:系统配置、用户管理、部门管理、角色管理等。")]),a("div",[t._v("图书管理:图书的信息管理,借还流程的完善")]),a("div",[t._v("人员权限:暂时设置管理员与教师和学生三个角色")])])])])],1),a("el-col",{attrs:{span:8}},[a("el-card",{staticClass:"box"},[a("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[a("span",[t._v("支持信息")])]),a("div",[a("div",{staticClass:"title",staticStyle:{"padding-top":"0px"}},[t._v("商业咨询")]),a("div",{staticStyle:{display:"flex"}},[a("div",{staticStyle:{"flex-grow":"1"}},[a("div",[t._v("微信:yx755141(微信号)或搜索手机 17640541176")]),a("div",[t._v("手机:"),a("a",{attrs:{href:"tel:17640541176"}},[t._v("陈昊东")])]),a("div",[t._v("邮箱:"),a("a",{attrs:{href:"mailto:haodongchen@aliyun.com"}},[t._v("haodongchen@aliyun.com")])])])])])])],1)],1)],1)},r=[],s=(a("ac67"),a("1bc7"),a("32ea"),a("559a")),c=a("52c1");function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,i)}return a}function n(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){Object(s["a"])(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}var o={name:"Dashboard",data:function(){return{currentRole:"adminDashboard"}},computed:n({},Object(c["b"])(["roles","siteData"])),created:function(){}},v=o,d=(a("934a"),a("e607")),p=Object(d["a"])(v,i,r,!1,null,"1a09886c",null);e["default"]=p.exports}}]);
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-b926fa4a"],{"24e2":function(t,a,i){"use strict";i.r(a);var e=function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("div",{staticClass:"errPage-container"},[i("el-button",{staticClass:"pan-back-btn",attrs:{icon:"el-icon-arrow-left"},on:{click:t.back}},[t._v(" 返回 ")]),i("el-row",[i("el-col",{attrs:{span:12}},[i("h1",{staticClass:"text-jumbo text-ginormous"},[t._v(" Oops! ")]),t._v(" gif来源"),i("a",{attrs:{href:"https://zh.airbnb.com/",target:"_blank"}},[t._v("airbnb")]),t._v(" 页面 "),i("h2",[t._v("你没有权限去该页面")]),i("h6",[t._v("如有不满请联系你领导")]),i("ul",{staticClass:"list-unstyled"},[i("li",[t._v("或者你可以去:")]),i("li",{staticClass:"link-type"},[i("router-link",{attrs:{to:"/dashboard"}},[t._v(" 回首页 ")])],1),i("li",{staticClass:"link-type"},[i("a",{attrs:{href:"https://www.taobao.com/"}},[t._v("随便看看")])]),i("li",[i("a",{attrs:{href:"#"},on:{click:function(a){a.preventDefault(),t.dialogVisible=!0}}},[t._v("点我看图")])])])]),i("el-col",{attrs:{span:12}},[i("img",{attrs:{src:t.errGif,width:"313",height:"428",alt:"Girl has dropped her ice cream."}})])],1),i("el-dialog",{attrs:{visible:t.dialogVisible,title:"随便看"},on:{"update:visible":function(a){t.dialogVisible=a}}},[i("img",{staticClass:"pan-img",attrs:{src:t.ewizardClap}})])],1)},s=[],r=i("cc6c"),c=i.n(r),l={name:"Page401",data:function(){return{errGif:c.a+"?"+ +new Date,ewizardClap:"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",dialogVisible:!1}},methods:{back:function(){this.$route.query.noGoBack?this.$router.push({path:"/dashboard"}):this.$router.go(-1)}}},n=l,o=(i("acdd"),i("e607")),u=Object(o["a"])(n,e,s,!1,null,"35ca77fc",null);a["default"]=u.exports},3518:function(t,a,i){},acdd:function(t,a,i){"use strict";i("3518")},cc6c:function(t,a,i){t.exports=i.p+"static/img/401.089007e7.gif"}}]);
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -2,4 +2,4 @@
|
|||||||
ENV = 'development'
|
ENV = 'development'
|
||||||
|
|
||||||
# 开发环境,一般就设置为本地后端端口,如:http://localhost:8101
|
# 开发环境,一般就设置为本地后端端口,如:http://localhost:8101
|
||||||
VUE_APP_BASE_API = 'http://127.0.0.1:8101'
|
VITE_BASE_API = 'http://127.0.0.1:8101'
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
ENV = 'production'
|
ENV = 'production'
|
||||||
|
|
||||||
# 接口地址,如果要放到后端的static目录下,此处不用填任何内容
|
# 接口地址,如果要放到后端的static目录下,此处不用填任何内容
|
||||||
VUE_APP_BASE_API = ''
|
VITE_BASE_API = ''
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/app'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
+14
-46
@@ -4,68 +4,36 @@
|
|||||||
"description": "陈昊东毕设",
|
"description": "陈昊东毕设",
|
||||||
"author": "haodongchen@aliyun.com",
|
"author": "haodongchen@aliyun.com",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vue-cli-service serve",
|
"dev": "vite",
|
||||||
"build:prod": "vue-cli-service build",
|
"build": "vite build",
|
||||||
"build:demo": "vue-cli-service build --mode demo",
|
"preview": "vite preview"
|
||||||
"lint": "eslint --ext .js,.vue src",
|
|
||||||
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@element-plus/icons-vue": "^2.3.1",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
"cos-js-sdk-v5": "^1.2.16",
|
"cos-js-sdk-v5": "^1.2.16",
|
||||||
"dropzone": "5.5.1",
|
"element-plus": "^2.9.1",
|
||||||
"element-ui": "^2.15.7",
|
"fast-glob": "^3.3.3",
|
||||||
"eslint": "^8.34.0",
|
|
||||||
"fuse.js": "3.4.4",
|
"fuse.js": "3.4.4",
|
||||||
"js-cookie": "2.2.0",
|
"js-cookie": "2.2.0",
|
||||||
"jsonlint": "1.6.3",
|
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"normalize.css": "7.0.0",
|
"normalize.css": "7.0.0",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"path-to-regexp": "2.4.0",
|
"path-to-regexp": "2.4.0",
|
||||||
"querystring": "^0.2.0",
|
|
||||||
"screenfull": "^4.2.0",
|
"screenfull": "^4.2.0",
|
||||||
"showdown": "^1.9.1",
|
|
||||||
"sortablejs": "^1.8.4",
|
"sortablejs": "^1.8.4",
|
||||||
"tracking": "^1.1.3",
|
"vue": "^3.4.21",
|
||||||
"vue": "2.6.10",
|
"vue-router": "^4.3.0",
|
||||||
"vue-count-to": "1.0.13",
|
"vuex": "^4.1.0"
|
||||||
"vue-fullscreen": "^2.1.6",
|
|
||||||
"vue-loader": "^15.10.1",
|
|
||||||
"vue-router": "3.0.2",
|
|
||||||
"vue-splitpane": "1.0.4",
|
|
||||||
"vue-uuid": "^2.0.2",
|
|
||||||
"vue-visibility-change": "^1.2.1",
|
|
||||||
"vuedraggable": "2.20.0",
|
|
||||||
"vuex": "3.1.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.0.0",
|
"@vitejs/plugin-vue": "^5.0.4",
|
||||||
"@babel/register": "7.0.0",
|
|
||||||
"@vue/cli-plugin-babel": "3.5.3",
|
|
||||||
"@vue/cli-plugin-eslint": "^3.9.1",
|
|
||||||
"@vue/cli-service": "^4.2.2",
|
|
||||||
"autoprefixer": "^9.5.1",
|
|
||||||
"babel-eslint": "10.0.1",
|
|
||||||
"babel-jest": "^25.1.0",
|
|
||||||
"chalk": "2.4.2",
|
|
||||||
"connect": "3.6.6",
|
|
||||||
"sass": "^1.49.9",
|
"sass": "^1.49.9",
|
||||||
"sass-loader": "^10.2.0",
|
"vite": "^5.2.0",
|
||||||
"script-ext-html-webpack-plugin": "^2.1.5",
|
"vite-plugin-svg-icons": "^2.0.1"
|
||||||
"svg-sprite-loader": "4.1.3",
|
|
||||||
"svgo": "1.2.0",
|
|
||||||
"vue-template-compiler": "2.6.10",
|
|
||||||
"webpack": "^4.46.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.9",
|
"node": ">=16.0.0"
|
||||||
"npm": ">= 3.0.0"
|
}
|
||||||
},
|
|
||||||
"browserslist": [
|
|
||||||
"> 1%",
|
|
||||||
"last 2 versions"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
@Description 描述:
|
@Description 描述:
|
||||||
@Author D吕贺034244311
|
@Author D吕荷034244311
|
||||||
@Date 20260615
|
@Date 20260615
|
||||||
-->
|
-->
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ export function userReg(data) {
|
|||||||
export function userList(){
|
export function userList(){
|
||||||
return post('/exam/api/sys/user/queryAll', null)
|
return post('/exam/api/sys/user/queryAll', null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export default {
|
|||||||
mounted() {
|
mounted() {
|
||||||
window.addEventListener('scroll', this.handleScroll)
|
window.addEventListener('scroll', this.handleScroll)
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeUnmount() {
|
||||||
window.removeEventListener('scroll', this.handleScroll)
|
window.removeEventListener('scroll', this.handleScroll)
|
||||||
if (this.interval) {
|
if (this.interval) {
|
||||||
clearInterval(this.interval)
|
clearInterval(this.interval)
|
||||||
@@ -99,7 +99,7 @@ export default {
|
|||||||
transition: opacity .5s;
|
transition: opacity .5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fade-enter,
|
.fade-enter-from,
|
||||||
.fade-leave-to {
|
.fade-leave-to {
|
||||||
opacity: 0
|
opacity: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col>
|
<el-col>
|
||||||
<el-button v-if="options.addRoute" type="primary" icon="el-icon-plus" @click="handleAdd">添加</el-button>
|
<el-button v-if="options.addRoute" type="primary" @click="handleAdd"><el-icon><Plus /></el-icon> 添加</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
@@ -47,13 +47,13 @@
|
|||||||
|
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination v-show="dataList.total>0" :total="dataList.total" :page.sync="listQuery.current" :limit.sync="listQuery.size" @pagination="getList" />
|
<pagination v-show="dataList.total>0" :total="dataList.total" v-model:page="listQuery.current" v-model:limit="listQuery.size" @pagination="getList" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { fetchList, deleteData, changeState } from '@/api/common'
|
import { fetchList, deleteData, changeState } from '@/api/common.js'
|
||||||
import Pagination from '@/components/Pagination'
|
import Pagination from '@/components/Pagination/index.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'PagingTable',
|
name: 'PagingTable',
|
||||||
|
|||||||
@@ -21,30 +21,27 @@
|
|||||||
default-expand-all
|
default-expand-all
|
||||||
@node-click="onClickNode"
|
@node-click="onClickNode"
|
||||||
/>
|
/>
|
||||||
<el-input
|
<template #reference>
|
||||||
slot="reference"
|
<el-input
|
||||||
ref="input"
|
ref="input"
|
||||||
v-model="labelModel"
|
v-model="labelModel"
|
||||||
:style="`width: ${width}px`"
|
:style="`width: ${width}px`"
|
||||||
:class="{ 'rotate': showStatus }"
|
:class="{ 'rotate': showStatus }"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
clearable
|
clearable
|
||||||
suffix-icon="el-icon-arrow-down"
|
>
|
||||||
/>
|
<template #suffix><el-icon><ArrowDown /></el-icon></template>
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'DepartTree',
|
name: 'DepartTree',
|
||||||
// 设置绑定参数
|
|
||||||
model: {
|
|
||||||
prop: 'value',
|
|
||||||
event: 'selected'
|
|
||||||
},
|
|
||||||
props: {
|
props: {
|
||||||
// 接收绑定参数
|
// 接收绑定参数
|
||||||
value: String,
|
modelValue: String,
|
||||||
// 输入框宽度
|
// 输入框宽度
|
||||||
width: String,
|
width: String,
|
||||||
// 选项数据
|
// 选项数据
|
||||||
@@ -100,14 +97,14 @@ export default {
|
|||||||
}
|
}
|
||||||
this.$refs.tree.filter(val)
|
this.$refs.tree.filter(val)
|
||||||
},
|
},
|
||||||
value(val) {
|
modelValue(val) {
|
||||||
this.labelModel = this.queryTree(this.data, val)
|
this.labelModel = this.queryTree(this.data, val)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
// 检测输入框原有值并显示对应 label
|
// 检测输入框原有值并显示对应 label
|
||||||
if (this.value) {
|
if (this.modelValue) {
|
||||||
this.labelModel = this.queryTree(this.data, this.value)
|
this.labelModel = this.queryTree(this.data, this.modelValue)
|
||||||
}
|
}
|
||||||
// 获取输入框宽度同步至树状菜单宽度
|
// 获取输入框宽度同步至树状菜单宽度
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
@@ -137,7 +134,7 @@ export default {
|
|||||||
// 隐藏时触发
|
// 隐藏时触发
|
||||||
onHidePopover() {
|
onHidePopover() {
|
||||||
this.showStatus = false
|
this.showStatus = false
|
||||||
this.$emit('selected', this.valueModel)
|
this.$emit('update:modelValue', this.valueModel)
|
||||||
},
|
},
|
||||||
// 树节点过滤方法
|
// 树节点过滤方法
|
||||||
filterNode(query, data) {
|
filterNode(query, data) {
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="errorLogs.length>0">
|
<div v-if="errorLogs.length>0">
|
||||||
<el-badge :is-dot="true" style="line-height: 25px;margin-top: -5px;" @click.native="dialogTableVisible=true">
|
<el-badge :is-dot="true" style="line-height: 25px;margin-top: -5px;" @click="dialogTableVisible=true">
|
||||||
<el-button style="padding: 8px 10px;" size="small" type="danger">
|
<el-button style="padding: 8px 10px;" size="small" type="danger">
|
||||||
<svg-icon icon-class="bug" />
|
<svg-icon icon-class="bug" />
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-badge>
|
</el-badge>
|
||||||
|
|
||||||
<el-dialog :visible.sync="dialogTableVisible" width="80%" append-to-body>
|
<el-dialog v-model="dialogTableVisible" width="80%" append-to="body">
|
||||||
<div slot="title">
|
<template #header>
|
||||||
<span style="padding-right: 10px;">Error Log</span>
|
<span style="padding-right: 10px;">Error Log</span>
|
||||||
<el-button size="mini" type="primary" icon="el-icon-delete" @click="clearAll">Clear All</el-button>
|
<el-button size="small" type="primary" @click="clearAll">
|
||||||
</div>
|
<el-icon><Delete /></el-icon> Clear All
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
<el-table :data="errorLogs" border>
|
<el-table :data="errorLogs" border>
|
||||||
<el-table-column label="Message">
|
<el-table-column label="Message">
|
||||||
<template slot-scope="{row}">
|
<template #default="{row}">
|
||||||
<div>
|
<div>
|
||||||
<span class="message-title">Msg:</span>
|
<span class="message-title">Msg:</span>
|
||||||
<el-tag type="danger">
|
<el-tag type="danger">
|
||||||
@@ -24,7 +26,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<span class="message-title" style="padding-right: 10px;">Info: </span>
|
<span class="message-title" style="padding-right: 10px;">Info: </span>
|
||||||
<el-tag type="warning">
|
<el-tag type="warning">
|
||||||
{{ row.vm.$vnode.tag }} error in {{ row.info }}
|
error in {{ row.info }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
@@ -37,7 +39,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="Stack">
|
<el-table-column label="Stack">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.err.stack }}
|
{{ scope.row.err.stack }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export default {
|
|||||||
name: 'ExamSelect',
|
name: 'ExamSelect',
|
||||||
props: {
|
props: {
|
||||||
multi: Boolean,
|
multi: Boolean,
|
||||||
value: Array,
|
modelValue: Array,
|
||||||
default: String
|
default: String
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -42,14 +42,14 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
value: {
|
modelValue: {
|
||||||
handler() {
|
handler() {
|
||||||
this.currentValue = this.value
|
this.currentValue = this.modelValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.currentValue = this.value
|
this.currentValue = this.modelValue
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -63,7 +63,7 @@ export default {
|
|||||||
console.log(e)
|
console.log(e)
|
||||||
|
|
||||||
this.$emit('change', e)
|
this.$emit('change', e)
|
||||||
this.$emit('input', e)
|
this.$emit('update:modelValue', e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import FileUploadLocal from './local'
|
import FileUploadLocal from './local.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'FileUpload',
|
name: 'FileUpload',
|
||||||
components: { FileUploadLocal },
|
components: { FileUploadLocal },
|
||||||
props: {
|
props: {
|
||||||
value: String,
|
modelValue: String,
|
||||||
accept: {
|
accept: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '*'
|
default: '*'
|
||||||
@@ -31,7 +31,7 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
value: {
|
modelValue: {
|
||||||
handler() {
|
handler() {
|
||||||
this.fillValue()
|
this.fillValue()
|
||||||
}
|
}
|
||||||
@@ -40,7 +40,7 @@ export default {
|
|||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
fileUrl: {
|
fileUrl: {
|
||||||
handler() {
|
handler() {
|
||||||
this.$emit('input', this.fileUrl)
|
this.$emit('update:modelValue', this.fileUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -55,7 +55,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
fillValue() {
|
fillValue() {
|
||||||
this.fileUrl = this.value
|
this.fileUrl = this.modelValue
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,12 @@
|
|||||||
|
|
||||||
<el-button v-if="listType==='picture'" size="small" type="primary">点击上传</el-button>
|
<el-button v-if="listType==='picture'" size="small" type="primary">点击上传</el-button>
|
||||||
|
|
||||||
<i v-if="listType!=='picture'" class="el-icon-upload" />
|
<el-icon v-if="listType!=='picture'"><UploadFilled /></el-icon>
|
||||||
<div v-if="listType!=='picture'" class="el-upload__text">
|
<div v-if="listType!=='picture'" class="el-upload__text">
|
||||||
将文件拖到此处,或
|
将文件拖到此处,或
|
||||||
<em>点击上传</em>
|
<em>点击上传</em>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="tips" slot="tip" class="el-upload__tip">{{ tips }}</div>
|
<template v-if="tips" #tip><div class="el-upload__tip">{{ tips }}</div></template>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -37,7 +37,7 @@ import { getToken } from '@/utils/auth'
|
|||||||
export default {
|
export default {
|
||||||
name: 'FileUploadLocal',
|
name: 'FileUploadLocal',
|
||||||
props: {
|
props: {
|
||||||
value: String,
|
modelValue: String,
|
||||||
accept: String,
|
accept: String,
|
||||||
tips: String,
|
tips: String,
|
||||||
listType: String,
|
listType: String,
|
||||||
@@ -48,7 +48,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
server: `${process.env.VUE_APP_BASE_API}/common/api/file/upload`,
|
server: `${import.meta.env.VITE_BASE_API}/common/api/file/upload`,
|
||||||
fileList: [],
|
fileList: [],
|
||||||
fileUrl: '',
|
fileUrl: '',
|
||||||
header: {}
|
header: {}
|
||||||
@@ -57,7 +57,7 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
value: {
|
modelValue: {
|
||||||
handler() {
|
handler() {
|
||||||
this.fillValue()
|
this.fillValue()
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ export default {
|
|||||||
|
|
||||||
fillValue() {
|
fillValue() {
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
this.fileUrl = this.value
|
this.fileUrl = this.modelValue
|
||||||
if (this.fileUrl) {
|
if (this.fileUrl) {
|
||||||
this.fileList = [{ name: this.fileUrl, url: this.fileUrl }]
|
this.fileList = [{ name: this.fileUrl, url: this.fileUrl }]
|
||||||
}
|
}
|
||||||
@@ -90,7 +90,7 @@ export default {
|
|||||||
|
|
||||||
// 文件列表移除文件时的钩子
|
// 文件列表移除文件时的钩子
|
||||||
handleRemove() {
|
handleRemove() {
|
||||||
this.$emit('input', '')
|
this.$emit('update:modelValue', '')
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ export default {
|
|||||||
this.fileList = []
|
this.fileList = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.$emit('input', response.data.url)
|
this.$emit('update:modelValue', response.data.url)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
// fuse is a lightweight fuzzy-search module
|
// fuse is a lightweight fuzzy-search module
|
||||||
// make search results more in line with expectations
|
// make search results more in line with expectations
|
||||||
import Fuse from 'fuse.js'
|
import Fuse from 'fuse.js'
|
||||||
import path from 'path'
|
import { resolve } from '@/utils/path'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'HeaderSearch',
|
name: 'HeaderSearch',
|
||||||
@@ -83,7 +83,6 @@ export default {
|
|||||||
threshold: 0.4,
|
threshold: 0.4,
|
||||||
location: 0,
|
location: 0,
|
||||||
distance: 100,
|
distance: 100,
|
||||||
maxPatternLength: 32,
|
|
||||||
minMatchCharLength: 1,
|
minMatchCharLength: 1,
|
||||||
keys: [{
|
keys: [{
|
||||||
name: 'title',
|
name: 'title',
|
||||||
@@ -104,7 +103,7 @@ export default {
|
|||||||
if (router.hidden) { continue }
|
if (router.hidden) { continue }
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
path: path.resolve(basePath, router.path),
|
path: resolve(basePath, router.path),
|
||||||
title: [...prefixTitle]
|
title: [...prefixTitle]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +158,7 @@ export default {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
||||||
::v-deep .el-input__inner {
|
:deep(.el-input__inner) {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
border: 0;
|
border: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
|
|||||||
@@ -25,12 +25,12 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import { fetchList } from '@/api/sys/role/role'
|
import { fetchList } from '@/api/sys/role/role.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MeetRole',
|
name: 'MeetRole',
|
||||||
props: {
|
props: {
|
||||||
value: Array,
|
modelValue: Array,
|
||||||
default: Array
|
default: Array
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -43,15 +43,15 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
value: {
|
modelValue: {
|
||||||
handler() {
|
handler() {
|
||||||
this.values = this.value
|
this.values = this.modelValue
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.values = this.value
|
this.values = this.modelValue
|
||||||
this.fetchList()
|
this.fetchList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -63,7 +63,7 @@ export default {
|
|||||||
},
|
},
|
||||||
handlerChange(e) {
|
handlerChange(e) {
|
||||||
this.$emit('change', e)
|
this.$emit('change', e)
|
||||||
this.$emit('input', e)
|
this.$emit('update:modelValue', e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
<div :class="{'hidden':hidden}" class="pagination-container">
|
<div :class="{'hidden':hidden}" class="pagination-container">
|
||||||
<el-pagination
|
<el-pagination
|
||||||
:background="background"
|
:background="background"
|
||||||
:current-page.sync="currentPage"
|
v-model:current-page="currentPage"
|
||||||
:page-size.sync="pageSize"
|
v-model:page-size="pageSize"
|
||||||
:layout="layout"
|
:layout="layout"
|
||||||
:page-sizes="pageSizes"
|
:page-sizes="pageSizes"
|
||||||
:total="total"
|
:total="total"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
value: String
|
modelValue: String
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -46,14 +46,14 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
// 检测查询变化
|
// 检测查询变化
|
||||||
value: {
|
modelValue: {
|
||||||
handler() {
|
handler() {
|
||||||
this.currentValue = this.value
|
this.currentValue = this.modelValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.currentValue = this.value
|
this.currentValue = this.modelValue
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -69,7 +69,7 @@ export default {
|
|||||||
})
|
})
|
||||||
|
|
||||||
this.$emit('change', obj)
|
this.$emit('change', obj)
|
||||||
this.$emit('input', e)
|
this.$emit('update:modelValue', e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="rightPanel-background" />
|
<div class="rightPanel-background" />
|
||||||
<div class="rightPanel">
|
<div class="rightPanel">
|
||||||
<div :style="{'top':buttonTop+'px','background-color':theme}" class="handle-button" @click="show=!show">
|
<div :style="{'top':buttonTop+'px','background-color':theme}" class="handle-button" @click="show=!show">
|
||||||
<i :class="show?'el-icon-close':'el-icon-setting'" />
|
<el-icon><Close v-if="show" /><Setting v-else /></el-icon>
|
||||||
</div>
|
</div>
|
||||||
<div class="rightPanel-items">
|
<div class="rightPanel-items">
|
||||||
<slot />
|
<slot />
|
||||||
@@ -52,7 +52,7 @@ export default {
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.insertToBody()
|
this.insertToBody()
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeUnmount() {
|
||||||
const elx = this.$refs.rightPanel
|
const elx = this.$refs.rightPanel
|
||||||
elx.remove()
|
elx.remove()
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.init()
|
this.init()
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeUnmount() {
|
||||||
this.destroy()
|
this.destroy()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<svg-icon class-name="size-icon" icon-class="size" />
|
<svg-icon class-name="size-icon" icon-class="size" />
|
||||||
</div>
|
</div>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu #dropdown>
|
||||||
<el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">
|
<el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">
|
||||||
{{
|
{{
|
||||||
item.label }}
|
item.label }}
|
||||||
@@ -31,7 +31,6 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleSetSize(size) {
|
handleSetSize(size) {
|
||||||
this.$ELEMENT.size = size
|
|
||||||
this.$store.dispatch('app/setSize', size)
|
this.$store.dispatch('app/setSize', size)
|
||||||
this.refreshView()
|
this.refreshView()
|
||||||
this.$message({
|
this.$message({
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
|
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-bind="$attrs" />
|
||||||
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
|
<svg v-else :class="svgClass" aria-hidden="true" v-bind="$attrs">
|
||||||
<use :href="iconName" />
|
<use :href="iconName" />
|
||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const version = require('element-ui/package.json').version // element-ui version from node_modules
|
|
||||||
const ORIGINAL_THEME = '#409EFF' // default color
|
const ORIGINAL_THEME = '#409EFF' // default color
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -41,8 +40,7 @@ export default {
|
|||||||
message: ' Compiling the theme',
|
message: ' Compiling the theme',
|
||||||
customClass: 'theme-message',
|
customClass: 'theme-message',
|
||||||
type: 'success',
|
type: 'success',
|
||||||
duration: 0,
|
duration: 0
|
||||||
iconClass: 'el-icon-loading'
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const getHandler = (variable, id) => {
|
const getHandler = (variable, id) => {
|
||||||
@@ -61,7 +59,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this.chalk) {
|
if (!this.chalk) {
|
||||||
const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
|
const url = `https://unpkg.com/element-plus/dist/index.css`
|
||||||
await this.getCSSString(url, 'chalk')
|
await this.getCSSString(url, 'chalk')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ if (!Clipboard) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
bind(el, binding) {
|
created(el, binding) {
|
||||||
if (binding.arg === 'success') {
|
if (binding.arg === 'success') {
|
||||||
el._v_clipboard_success = binding.value
|
el._v_clipboard_success = binding.value
|
||||||
} else if (binding.arg === 'error') {
|
} else if (binding.arg === 'error') {
|
||||||
@@ -26,7 +26,7 @@ export default {
|
|||||||
el._v_clipboard = clipboard
|
el._v_clipboard = clipboard
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
update(el, binding) {
|
updated(el, binding) {
|
||||||
if (binding.arg === 'success') {
|
if (binding.arg === 'success') {
|
||||||
el._v_clipboard_success = binding.value
|
el._v_clipboard_success = binding.value
|
||||||
} else if (binding.arg === 'error') {
|
} else if (binding.arg === 'error') {
|
||||||
@@ -36,7 +36,7 @@ export default {
|
|||||||
el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
|
el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
unbind(el, binding) {
|
unmounted(el, binding) {
|
||||||
if (binding.arg === 'success') {
|
if (binding.arg === 'success') {
|
||||||
delete el._v_clipboard_success
|
delete el._v_clipboard_success
|
||||||
} else if (binding.arg === 'error') {
|
} else if (binding.arg === 'error') {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
inserted(el, binding, vnode) {
|
mounted(el, binding, vnode) {
|
||||||
const { value } = binding
|
const { value } = binding
|
||||||
const roles = store.getters && store.getters.roles
|
const roles = store.getters && store.getters.roles
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
const vueSticky = {}
|
const vueSticky = {}
|
||||||
let listenAction
|
let listenAction
|
||||||
vueSticky.install = Vue => {
|
vueSticky.install = app => {
|
||||||
Vue.directive('sticky', {
|
app.directive('sticky', {
|
||||||
inserted(el, binding) {
|
mounted(el, binding) {
|
||||||
const params = binding.value || {}
|
const params = binding.value || {}
|
||||||
const stickyTop = params.stickyTop || 0
|
const stickyTop = params.stickyTop || 0
|
||||||
const zIndex = params.zIndex || 1000
|
const zIndex = params.zIndex || 1000
|
||||||
@@ -10,12 +10,6 @@ vueSticky.install = Vue => {
|
|||||||
|
|
||||||
elStyle.position = '-webkit-sticky'
|
elStyle.position = '-webkit-sticky'
|
||||||
elStyle.position = 'sticky'
|
elStyle.position = 'sticky'
|
||||||
// if the browser support css sticky(Currently Safari, Firefox and Chrome Canary)
|
|
||||||
// if (~elStyle.position.indexOf('sticky')) {
|
|
||||||
// elStyle.top = `${stickyTop}px`;
|
|
||||||
// elStyle.zIndex = zIndex;
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
const elHeight = el.getBoundingClientRect().height
|
const elHeight = el.getBoundingClientRect().height
|
||||||
const elWidth = el.getBoundingClientRect().width
|
const elWidth = el.getBoundingClientRect().width
|
||||||
elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
|
elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
|
||||||
@@ -81,7 +75,7 @@ vueSticky.install = Vue => {
|
|||||||
window.addEventListener('scroll', listenAction)
|
window.addEventListener('scroll', listenAction)
|
||||||
},
|
},
|
||||||
|
|
||||||
unbind() {
|
unmounted() {
|
||||||
window.removeEventListener('scroll', listenAction)
|
window.removeEventListener('scroll', listenAction)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ function handleClick(el, binding) {
|
|||||||
function handle(e) {
|
function handle(e) {
|
||||||
const customOpts = Object.assign({}, binding.value)
|
const customOpts = Object.assign({}, binding.value)
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
ele: el, // 波纹作用元素
|
ele: el,
|
||||||
type: 'hit', // hit 点击位置扩散 center中心点扩展
|
type: 'hit',
|
||||||
color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
|
color: 'rgba(0, 0, 0, 0.15)'
|
||||||
},
|
},
|
||||||
customOpts
|
customOpts
|
||||||
)
|
)
|
||||||
@@ -57,14 +57,14 @@ function handleClick(el, binding) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
bind(el, binding) {
|
created(el, binding) {
|
||||||
el.addEventListener('click', handleClick(el, binding), false)
|
el.addEventListener('click', handleClick(el, binding), false)
|
||||||
},
|
},
|
||||||
update(el, binding) {
|
updated(el, binding) {
|
||||||
el.removeEventListener('click', el[context].removeHandle, false)
|
el.removeEventListener('click', el[context].removeHandle, false)
|
||||||
el.addEventListener('click', handleClick(el, binding), false)
|
el.addEventListener('click', handleClick(el, binding), false)
|
||||||
},
|
},
|
||||||
unbind(el) {
|
unmounted(el) {
|
||||||
el.removeEventListener('click', el[context].removeHandle, false)
|
el.removeEventListener('click', el[context].removeHandle, false)
|
||||||
el[context] = null
|
el[context] = null
|
||||||
delete el[context]
|
delete el[context]
|
||||||
|
|||||||
@@ -1,9 +1 @@
|
|||||||
import Vue from 'vue'
|
import 'virtual:svg-icons-register'
|
||||||
import SvgIcon from '@/components/SvgIcon'// svg component
|
|
||||||
|
|
||||||
// register globally
|
|
||||||
Vue.component('svg-icon', SvgIcon)
|
|
||||||
|
|
||||||
const req = require.context('./svg', false, /\.svg$/)
|
|
||||||
const requireAll = requireContext => requireContext.keys().map(requireContext)
|
|
||||||
requireAll(req)
|
|
||||||
|
|||||||
@@ -21,9 +21,9 @@
|
|||||||
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
|
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
|
||||||
<div class="avatar-wrapper">
|
<div class="avatar-wrapper">
|
||||||
{{ realName }}
|
{{ realName }}
|
||||||
<i class="el-icon-caret-bottom" />
|
<el-icon class="el-icon-caret-bottom"><ArrowDown /></el-icon>
|
||||||
</div>
|
</div>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu #dropdown>
|
||||||
<router-link to="/profile/index">
|
<router-link to="/profile/index">
|
||||||
<el-dropdown-item>个人资料</el-dropdown-item>
|
<el-dropdown-item>个人资料</el-dropdown-item>
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -38,12 +38,13 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import Breadcrumb from '@/components/Breadcrumb'
|
import { ArrowDown } from '@element-plus/icons-vue'
|
||||||
import Hamburger from '@/components/Hamburger'
|
import Breadcrumb from '@/components/Breadcrumb/index.vue'
|
||||||
import ErrorLog from '@/components/ErrorLog'
|
import Hamburger from '@/components/Hamburger/index.vue'
|
||||||
import Screenfull from '@/components/Screenfull'
|
import ErrorLog from '@/components/ErrorLog/index.vue'
|
||||||
import SizeSelect from '@/components/SizeSelect'
|
import Screenfull from '@/components/Screenfull/index.vue'
|
||||||
import Search from '@/components/HeaderSearch'
|
import SizeSelect from '@/components/SizeSelect/index.vue'
|
||||||
|
import Search from '@/components/HeaderSearch/index.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -52,7 +53,8 @@ export default {
|
|||||||
ErrorLog,
|
ErrorLog,
|
||||||
Screenfull,
|
Screenfull,
|
||||||
SizeSelect,
|
SizeSelect,
|
||||||
Search
|
Search,
|
||||||
|
ArrowDown
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
...mapGetters([
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ThemePicker from '@/components/ThemePicker'
|
import ThemePicker from '@/components/ThemePicker/index.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { ThemePicker },
|
components: { ThemePicker },
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
<template>
|
||||||
|
<svg-icon v-if="icon" :icon-class="icon" />
|
||||||
|
<span v-if="title">{{ title }}</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'MenuItem',
|
name: 'MenuItem',
|
||||||
functional: true,
|
|
||||||
props: {
|
props: {
|
||||||
icon: {
|
icon: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -11,19 +15,6 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
|
||||||
render(h, context) {
|
|
||||||
const { icon, title } = context.props
|
|
||||||
const vnodes = []
|
|
||||||
|
|
||||||
if (icon) {
|
|
||||||
vnodes.push(<svg-icon icon-class={icon}/>)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (title) {
|
|
||||||
vnodes.push(<span slot='title'>{(title)}</span>)
|
|
||||||
}
|
|
||||||
return vnodes
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<!-- eslint-disable vue/require-component-is -->
|
<a v-if="isExternal" :href="to" target="_blank" rel="noopener">
|
||||||
<component v-bind="linkProps(to)">
|
|
||||||
<slot />
|
<slot />
|
||||||
</component>
|
</a>
|
||||||
|
<router-link v-else :to="to">
|
||||||
|
<slot />
|
||||||
|
</router-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -16,20 +18,9 @@ export default {
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
computed: {
|
||||||
linkProps(url) {
|
isExternal() {
|
||||||
if (isExternal(url)) {
|
return isExternal(this.to)
|
||||||
return {
|
|
||||||
is: 'a',
|
|
||||||
href: url,
|
|
||||||
target: '_blank',
|
|
||||||
rel: 'noopener'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
is: 'router-link',
|
|
||||||
to: url
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export default {
|
|||||||
transition: opacity 1.5s;
|
transition: opacity 1.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebarLogoFade-enter,
|
.sidebarLogoFade-enter-from,
|
||||||
.sidebarLogoFade-leave-to {
|
.sidebarLogoFade-leave-to {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
</app-link>
|
</app-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
|
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
|
||||||
<template slot="title">
|
<template #title>
|
||||||
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
|
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
|
||||||
</template>
|
</template>
|
||||||
<sidebar-item
|
<sidebar-item
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import path from 'path'
|
import { resolve } from '@/utils/path'
|
||||||
import { isExternal } from '@/utils/validate'
|
import { isExternal } from '@/utils/validate'
|
||||||
import Item from './Item'
|
import Item from './Item.vue'
|
||||||
import AppLink from './Link'
|
import AppLink from './Link.vue'
|
||||||
import FixiOSBug from './FixiOSBug'
|
import FixiOSBug from './FixiOSBug.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'SidebarItem',
|
name: 'SidebarItem',
|
||||||
@@ -88,7 +88,7 @@ export default {
|
|||||||
if (isExternal(this.basePath)) {
|
if (isExternal(this.basePath)) {
|
||||||
return this.basePath
|
return this.basePath
|
||||||
}
|
}
|
||||||
return path.resolve(this.basePath, routePath)
|
return resolve(this.basePath, routePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import Logo from './Logo'
|
import Logo from './Logo.vue'
|
||||||
import SidebarItem from './SidebarItem'
|
import SidebarItem from './SidebarItem.vue'
|
||||||
import variables from '@/styles/variables.scss'
|
import variables from '@/styles/variables-js.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { SidebarItem, Logo },
|
components: { SidebarItem, Logo },
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
|
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.prevent="handleScroll">
|
||||||
<slot />
|
<slot />
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
</template>
|
</template>
|
||||||
@@ -73,13 +73,11 @@ export default {
|
|||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
::v-deep {
|
:deep(.el-scrollbar__bar) {
|
||||||
.el-scrollbar__bar {
|
bottom: 0px;
|
||||||
bottom: 0px;
|
}
|
||||||
}
|
:deep(.el-scrollbar__wrap) {
|
||||||
.el-scrollbar__wrap {
|
height: 49px;
|
||||||
height: 49px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="tags-view-container" class="tags-view-container">
|
<div id="tags-view-container" class="tags-view-container">
|
||||||
<scroll-pane ref="scrollPane" class="tags-view-wrapper">
|
<scroll-pane ref="scrollPane" class="tags-view-wrapper">
|
||||||
<router-link
|
<span
|
||||||
v-for="tag in visitedViews"
|
v-for="tag in visitedViews"
|
||||||
ref="tag"
|
ref="tag"
|
||||||
:key="tag.path"
|
:key="tag.path"
|
||||||
:class="isActive(tag)?'active':''"
|
:class="isActive(tag)?'active':''"
|
||||||
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
|
|
||||||
tag="span"
|
|
||||||
class="tags-view-item"
|
class="tags-view-item"
|
||||||
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
|
@click="navigateTo(tag)"
|
||||||
@contextmenu.prevent.native="openMenu(tag,$event)"
|
@click.middle="!isAffix(tag)?closeSelectedTag(tag):''"
|
||||||
|
@contextmenu.prevent="openMenu(tag,$event)"
|
||||||
>
|
>
|
||||||
{{ tag.title }}
|
{{ tag.title }}
|
||||||
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
|
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
|
||||||
</router-link>
|
</span>
|
||||||
</scroll-pane>
|
</scroll-pane>
|
||||||
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
|
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
|
||||||
<li @click="refreshSelectedTag(selectedTag)">Refresh</li>
|
<li @click="refreshSelectedTag(selectedTag)">Refresh</li>
|
||||||
@@ -26,8 +25,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ScrollPane from './ScrollPane'
|
import ScrollPane from './ScrollPane.vue'
|
||||||
import path from 'path'
|
import { resolve } from '@/utils/path'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { ScrollPane },
|
components: { ScrollPane },
|
||||||
@@ -76,7 +75,7 @@ export default {
|
|||||||
let tags = []
|
let tags = []
|
||||||
routes.forEach(route => {
|
routes.forEach(route => {
|
||||||
if (route.meta && route.meta.affix) {
|
if (route.meta && route.meta.affix) {
|
||||||
const tagPath = path.resolve(basePath, route.path)
|
const tagPath = resolve(basePath, route.path)
|
||||||
tags.push({
|
tags.push({
|
||||||
fullPath: tagPath,
|
fullPath: tagPath,
|
||||||
path: tagPath,
|
path: tagPath,
|
||||||
@@ -110,20 +109,19 @@ export default {
|
|||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
moveToCurrentTag() {
|
moveToCurrentTag() {
|
||||||
const tags = this.$refs.tag
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
for (const tag of tags) {
|
const tags = this.$refs.tag
|
||||||
if (tag.to.path === this.$route.path) {
|
if (!tags) return
|
||||||
this.$refs.scrollPane.moveToTarget(tag)
|
// In Vue 3, $refs with v-for gives DOM elements in same order
|
||||||
// when query is different then update
|
const index = this.visitedViews.findIndex(v => v.path === this.$route.path)
|
||||||
if (tag.to.fullPath !== this.$route.fullPath) {
|
if (index >= 0 && tags[index]) {
|
||||||
this.$store.dispatch('tagsView/updateVisitedView', this.$route)
|
this.$refs.scrollPane.moveToTarget(tags[index])
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
navigateTo(tag) {
|
||||||
|
this.$router.push({ path: tag.path, query: tag.query })
|
||||||
|
},
|
||||||
refreshSelectedTag(view) {
|
refreshSelectedTag(view) {
|
||||||
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
|
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
|
||||||
const { fullPath } = view
|
const { fullPath } = view
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export { default as AppMain } from './AppMain'
|
export { default as AppMain } from './AppMain.vue'
|
||||||
export { default as Navbar } from './Navbar'
|
export { default as Navbar } from './Navbar.vue'
|
||||||
export { default as Settings } from './Settings'
|
export { default as Settings } from './Settings/index.vue'
|
||||||
export { default as Sidebar } from './Sidebar/index.vue'
|
export { default as Sidebar } from './Sidebar/index.vue'
|
||||||
export { default as TagsView } from './TagsView/index.vue'
|
export { default as TagsView } from './TagsView/index.vue'
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import RightPanel from '@/components/RightPanel'
|
import RightPanel from '@/components/RightPanel/index.vue'
|
||||||
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
|
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
|
||||||
import ResizeMixin from './mixin/ResizeHandler'
|
import ResizeMixin from './mixin/ResizeHandler'
|
||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
@@ -58,8 +58,8 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "~@/styles/mixin.scss";
|
@import "@/styles/mixin.scss";
|
||||||
@import "~@/styles/variables.scss";
|
@import "@/styles/variables.scss";
|
||||||
|
|
||||||
.app-wrapper {
|
.app-wrapper {
|
||||||
@include clearfix;
|
@include clearfix;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export default {
|
|||||||
beforeMount() {
|
beforeMount() {
|
||||||
window.addEventListener('resize', this.$_resizeHandler)
|
window.addEventListener('resize', this.$_resizeHandler)
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeUnmount() {
|
||||||
window.removeEventListener('resize', this.$_resizeHandler)
|
window.removeEventListener('resize', this.$_resizeHandler)
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|||||||
+34
-21
@@ -1,37 +1,50 @@
|
|||||||
import Vue from 'vue'
|
import { createApp } from 'vue'
|
||||||
|
|
||||||
import Cookies from 'js-cookie'
|
import Cookies from 'js-cookie'
|
||||||
|
|
||||||
import 'normalize.css/normalize.css' // a modern alternative to CSS resets
|
import 'normalize.css/normalize.css'
|
||||||
|
|
||||||
import Element from 'element-ui'
|
import ElementPlus from 'element-plus'
|
||||||
|
import 'element-plus/dist/index.css'
|
||||||
|
import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
||||||
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
||||||
import './styles/element-variables.scss'
|
import './styles/element-variables.scss'
|
||||||
import '@/styles/index.scss'
|
import '@/styles/index.scss'
|
||||||
|
|
||||||
import App from './App'
|
import App from './App.vue'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
|
|
||||||
import './icons' // icon
|
import SvgIcon from '@/components/SvgIcon/index.vue'
|
||||||
import './permission' // permission control
|
import './icons'
|
||||||
import './utils/error-log' // error log
|
import './permission'
|
||||||
|
import './utils/error-log'
|
||||||
|
|
||||||
import * as filters from './filters'
|
import * as filters from './filters'
|
||||||
// Element UI
|
|
||||||
Vue.use(Element, {
|
const app = createApp(App)
|
||||||
size: Cookies.get('size') || 'medium' // set element-ui default size
|
|
||||||
|
app.use(ElementPlus, {
|
||||||
|
locale: zhCn,
|
||||||
|
size: Cookies.get('size') || 'default'
|
||||||
})
|
})
|
||||||
|
|
||||||
// 注册全局过滤器
|
// 全局注册 Element Plus 图标组件
|
||||||
Object.keys(filters).forEach(key => {
|
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
|
||||||
Vue.filter(key, filters[key])
|
app.component(key, component)
|
||||||
})
|
}
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
app.use(store)
|
||||||
|
app.use(router)
|
||||||
|
|
||||||
new Vue({
|
// 注册全局过滤器(Vue3 过滤器为普通函数,通过 globalProperties 提供)
|
||||||
el: '#app',
|
app.component('svg-icon', SvgIcon)
|
||||||
router,
|
|
||||||
store,
|
app.config.globalProperties.$filters = filters
|
||||||
render: h => h(App)
|
|
||||||
})
|
// 设置错误处理器
|
||||||
|
if (window.__setErrorhandler__) {
|
||||||
|
window.__setErrorhandler__(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
app.mount('#app')
|
||||||
|
|||||||
+10
-17
@@ -1,29 +1,25 @@
|
|||||||
import router from './router'
|
import router from './router'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
import { Message } from 'element-ui'
|
import { ElMessage } from 'element-plus'
|
||||||
import NProgress from 'nprogress' // progress bar
|
import NProgress from 'nprogress'
|
||||||
import 'nprogress/nprogress.css' // progress bar style
|
import 'nprogress/nprogress.css'
|
||||||
import { getToken } from '@/utils/auth' // get token from cookie
|
import { getToken } from '@/utils/auth'
|
||||||
import getPageTitle from '@/utils/get-page-title'
|
import getPageTitle from '@/utils/get-page-title'
|
||||||
|
|
||||||
NProgress.configure({ showSpinner: false }) // NProgress Configuration
|
NProgress.configure({ showSpinner: false })
|
||||||
|
|
||||||
const whiteList = ['/login', '/register'] // no redirect whitelist
|
const whiteList = ['/login', '/register']
|
||||||
|
|
||||||
router.beforeEach(async(to, from, next) => {
|
router.beforeEach(async(to, from, next) => {
|
||||||
// start progress bar
|
|
||||||
NProgress.start()
|
NProgress.start()
|
||||||
|
|
||||||
// 获取网站基本信息
|
|
||||||
let siteData = store.getters.siteData
|
let siteData = store.getters.siteData
|
||||||
if (!siteData.siteName) {
|
if (!siteData.siteName) {
|
||||||
siteData = await store.dispatch('settings/getSite')
|
siteData = await store.dispatch('settings/getSite')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 页面标题
|
|
||||||
document.title = getPageTitle(siteData.siteName, to.meta.title)
|
document.title = getPageTitle(siteData.siteName, to.meta.title)
|
||||||
|
|
||||||
// 本地token
|
|
||||||
const hasToken = getToken()
|
const hasToken = getToken()
|
||||||
|
|
||||||
if (hasToken) {
|
if (hasToken) {
|
||||||
@@ -36,26 +32,24 @@ router.beforeEach(async(to, from, next) => {
|
|||||||
next()
|
next()
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
// 读取用户权限
|
|
||||||
const { roles } = await store.dispatch('user/getInfo')
|
const { roles } = await store.dispatch('user/getInfo')
|
||||||
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
|
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
|
||||||
router.addRoutes(accessRoutes)
|
accessRoutes.forEach(route => {
|
||||||
|
router.addRoute(route)
|
||||||
|
})
|
||||||
next({ ...to, replace: true })
|
next({ ...to, replace: true })
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 出错注销
|
|
||||||
await store.dispatch('user/resetToken')
|
await store.dispatch('user/resetToken')
|
||||||
Message.error(error || 'Has Error')
|
ElMessage.error(error || 'Has Error')
|
||||||
next(`/login?redirect=${to.path}`)
|
next(`/login?redirect=${to.path}`)
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 排除白名单
|
|
||||||
if (whiteList.indexOf(to.path) !== -1) {
|
if (whiteList.indexOf(to.path) !== -1) {
|
||||||
next()
|
next()
|
||||||
} else {
|
} else {
|
||||||
// 跳转到登录页面
|
|
||||||
next(`/login?redirect=${to.path}`)
|
next(`/login?redirect=${to.path}`)
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
}
|
}
|
||||||
@@ -63,6 +57,5 @@ router.beforeEach(async(to, from, next) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.afterEach(() => {
|
router.afterEach(() => {
|
||||||
// finish progress bar
|
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
import Vue from 'vue'
|
import { createRouter, createWebHashHistory } from 'vue-router'
|
||||||
import Router from 'vue-router'
|
|
||||||
|
|
||||||
Vue.use(Router)
|
|
||||||
|
|
||||||
// 主要框架
|
// 主要框架
|
||||||
import Layout from '@/layout'
|
import Layout from '@/layout/index.vue'
|
||||||
|
|
||||||
// 登录框架
|
// 登录框架
|
||||||
import LoginLayout from '@/views/login/components/LoginLayout'
|
import LoginLayout from '@/views/login/components/LoginLayout.vue'
|
||||||
|
|
||||||
export const constantRoutes = [{
|
export const constantRoutes = [{
|
||||||
path: '/redirect',
|
path: '/redirect',
|
||||||
component: Layout,
|
component: Layout,
|
||||||
hidden: true,
|
hidden: true,
|
||||||
children: [{
|
children: [{
|
||||||
path: '/redirect/:path*',
|
path: '/redirect/:path(.*)',
|
||||||
component: () => import('@/views/redirect/index')
|
component: () => import('@/views/redirect/index.vue')
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -26,13 +23,13 @@ export const constantRoutes = [{
|
|||||||
children: [{
|
children: [{
|
||||||
path: '/login',
|
path: '/login',
|
||||||
name: 'Login',
|
name: 'Login',
|
||||||
component: () => import('@/views/login/index'),
|
component: () => import('@/views/login/index.vue'),
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/register',
|
path: '/register',
|
||||||
name: 'Register',
|
name: 'Register',
|
||||||
component: () => import('@/views/login/register'),
|
component: () => import('@/views/login/register.vue'),
|
||||||
hidden: true
|
hidden: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -40,12 +37,12 @@ export const constantRoutes = [{
|
|||||||
|
|
||||||
{
|
{
|
||||||
path: '/404',
|
path: '/404',
|
||||||
component: () => import('@/views/error-page/404'),
|
component: () => import('@/views/error-page/404.vue'),
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/401',
|
path: '/401',
|
||||||
component: () => import('@/views/error-page/401'),
|
component: () => import('@/views/error-page/401.vue'),
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -54,7 +51,7 @@ export const constantRoutes = [{
|
|||||||
redirect: '/dashboard',
|
redirect: '/dashboard',
|
||||||
children: [{
|
children: [{
|
||||||
path: 'dashboard',
|
path: 'dashboard',
|
||||||
component: () => import('@/views/dashboard/index'),
|
component: () => import('@/views/dashboard/index.vue'),
|
||||||
name: 'Dashboard',
|
name: 'Dashboard',
|
||||||
meta: {
|
meta: {
|
||||||
title: '控制台',
|
title: '控制台',
|
||||||
@@ -71,7 +68,7 @@ export const constantRoutes = [{
|
|||||||
hidden: true,
|
hidden: true,
|
||||||
children: [{
|
children: [{
|
||||||
path: 'index',
|
path: 'index',
|
||||||
component: () => import('@/views/profile/index'),
|
component: () => import('@/views/profile/index.vue'),
|
||||||
name: 'Profile',
|
name: 'Profile',
|
||||||
meta: {
|
meta: {
|
||||||
title: '个人资料',
|
title: '个人资料',
|
||||||
@@ -88,26 +85,6 @@ export const constantRoutes = [{
|
|||||||
*/
|
*/
|
||||||
export const asyncRoutes = [
|
export const asyncRoutes = [
|
||||||
|
|
||||||
/*{
|
|
||||||
path: '/apply',
|
|
||||||
component: Layout,
|
|
||||||
redirect: '/apply/input',
|
|
||||||
name: 'Apply',
|
|
||||||
meta: {
|
|
||||||
title: '报销申请',
|
|
||||||
icon: 'example',
|
|
||||||
roles: ['root']
|
|
||||||
},
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: 'input',
|
|
||||||
component: () => import('@/views/apply/input'),
|
|
||||||
name: 'input',
|
|
||||||
meta: { title: '报销申请', noCache: true, icon: 'repo' }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},*/
|
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/sys',
|
path: '/sys',
|
||||||
component: Layout,
|
component: Layout,
|
||||||
@@ -120,7 +97,7 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
children: [{
|
children: [{
|
||||||
path: 'config',
|
path: 'config',
|
||||||
component: () => import('@/views/sys/config'),
|
component: () => import('@/views/sys/config/index.vue'),
|
||||||
name: 'SysConfig',
|
name: 'SysConfig',
|
||||||
meta: {
|
meta: {
|
||||||
title: '系统配置',
|
title: '系统配置',
|
||||||
@@ -129,26 +106,16 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'dict',
|
path: 'dict',
|
||||||
component: () => import('@/views/sys/dict'),
|
component: () => import('@/views/sys/dict/index.vue'),
|
||||||
name: 'SysDict',
|
name: 'SysDict',
|
||||||
meta: {
|
meta: {
|
||||||
title: '码值管理',
|
title: '码值管理',
|
||||||
icon: 'theme'
|
icon: 'theme'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/*{
|
|
||||||
path: 'depart',
|
|
||||||
component: () => import('@/views/sys/depart'),
|
|
||||||
name: 'SysDepart',
|
|
||||||
meta: {
|
|
||||||
title: '部门管理',
|
|
||||||
icon: 'tree'
|
|
||||||
}
|
|
||||||
},*/
|
|
||||||
|
|
||||||
{
|
{
|
||||||
path: 'role',
|
path: 'role',
|
||||||
component: () => import('@/views/sys/role'),
|
component: () => import('@/views/sys/role/index.vue'),
|
||||||
name: 'SysRole',
|
name: 'SysRole',
|
||||||
meta: {
|
meta: {
|
||||||
title: '角色管理',
|
title: '角色管理',
|
||||||
@@ -158,7 +125,7 @@ export const asyncRoutes = [
|
|||||||
|
|
||||||
{
|
{
|
||||||
path: 'user',
|
path: 'user',
|
||||||
component: () => import('@/views/sys/user'),
|
component: () => import('@/views/sys/user/index.vue'),
|
||||||
name: 'SysUser',
|
name: 'SysUser',
|
||||||
meta: {
|
meta: {
|
||||||
title: '用户管理',
|
title: '用户管理',
|
||||||
@@ -168,7 +135,7 @@ export const asyncRoutes = [
|
|||||||
|
|
||||||
{
|
{
|
||||||
path: 'bookgl',
|
path: 'bookgl',
|
||||||
component: () => import('@/views/sys/bookgl'),
|
component: () => import('@/views/sys/bookgl/index.vue'),
|
||||||
name: 'SysBookgl',
|
name: 'SysBookgl',
|
||||||
meta: {
|
meta: {
|
||||||
title: '书籍信息管理',
|
title: '书籍信息管理',
|
||||||
@@ -177,7 +144,7 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'jieshu',
|
path: 'jieshu',
|
||||||
component: () => import('@/views/sys/jieshu'),
|
component: () => import('@/views/sys/jieshu/index.vue'),
|
||||||
name: 'SysJieshu',
|
name: 'SysJieshu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '图书搜索',
|
title: '图书搜索',
|
||||||
@@ -187,7 +154,7 @@ export const asyncRoutes = [
|
|||||||
|
|
||||||
{
|
{
|
||||||
path: 'huanshu',
|
path: 'huanshu',
|
||||||
component: () => import('@/views/sys/huanshu'),
|
component: () => import('@/views/sys/huanshu/index.vue'),
|
||||||
name: 'Syshuanshu',
|
name: 'Syshuanshu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '我的借还',
|
title: '我的借还',
|
||||||
@@ -196,7 +163,7 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'jiehuanjilu',
|
path: 'jiehuanjilu',
|
||||||
component: () => import('@/views/sys/jiehuanjilu'),
|
component: () => import('@/views/sys/jiehuanjilu/index.vue'),
|
||||||
name: 'SysJiehuanjilu',
|
name: 'SysJiehuanjilu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '借还记录',
|
title: '借还记录',
|
||||||
@@ -204,7 +171,7 @@ export const asyncRoutes = [
|
|||||||
}
|
}
|
||||||
},{
|
},{
|
||||||
path: 'gggl',
|
path: 'gggl',
|
||||||
component: () => import('@/views/sys/gggl'),
|
component: () => import('@/views/sys/gggl/index.vue'),
|
||||||
name: 'SysGggl',
|
name: 'SysGggl',
|
||||||
meta: {
|
meta: {
|
||||||
title: '公告管理',
|
title: '公告管理',
|
||||||
@@ -213,7 +180,7 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'lygl',
|
path: 'lygl',
|
||||||
component: () => import('@/views/sys/liuyangl'),
|
component: () => import('@/views/sys/liuyangl/index.vue'),
|
||||||
name: 'SysLygl',
|
name: 'SysLygl',
|
||||||
meta: {
|
meta: {
|
||||||
title: '留言管理',
|
title: '留言管理',
|
||||||
@@ -222,9 +189,6 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/sys',
|
path: '/sys',
|
||||||
@@ -235,20 +199,11 @@ export const asyncRoutes = [
|
|||||||
title: '用户系统',
|
title: '用户系统',
|
||||||
icon: 'configure',
|
icon: 'configure',
|
||||||
roles: ['student']
|
roles: ['student']
|
||||||
},// 学生路由页面
|
},
|
||||||
children: [
|
children: [
|
||||||
/*{
|
|
||||||
path: 'grxxgl',
|
|
||||||
component: () => import('@/views/sys/grxxgl'),
|
|
||||||
name: 'SysGrxxgl',
|
|
||||||
meta: {
|
|
||||||
title: '个人信息管理',
|
|
||||||
icon: 'admin'
|
|
||||||
}
|
|
||||||
},*/
|
|
||||||
{
|
{
|
||||||
path: 'jieshu',
|
path: 'jieshu',
|
||||||
component: () => import('@/views/sys/jieshu'),
|
component: () => import('@/views/sys/jieshu/index.vue'),
|
||||||
name: 'SysJieshu',
|
name: 'SysJieshu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '图书搜索',
|
title: '图书搜索',
|
||||||
@@ -258,7 +213,7 @@ export const asyncRoutes = [
|
|||||||
|
|
||||||
{
|
{
|
||||||
path: 'huanshu',
|
path: 'huanshu',
|
||||||
component: () => import('@/views/sys/huanshu'),
|
component: () => import('@/views/sys/huanshu/index.vue'),
|
||||||
name: 'Syshuanshu',
|
name: 'Syshuanshu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '我的借还',
|
title: '我的借还',
|
||||||
@@ -267,7 +222,7 @@ export const asyncRoutes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'jiehuanjilu',
|
path: 'jiehuanjilu',
|
||||||
component: () => import('@/views/sys/jiehuanjilu'),
|
component: () => import('@/views/sys/jiehuanjilu/index.vue'),
|
||||||
name: 'SysJiehuanjilu',
|
name: 'SysJiehuanjilu',
|
||||||
meta: {
|
meta: {
|
||||||
title: '借还记录',
|
title: '借还记录',
|
||||||
@@ -277,7 +232,7 @@ export const asyncRoutes = [
|
|||||||
,
|
,
|
||||||
{
|
{
|
||||||
path: 'liuyan',
|
path: 'liuyan',
|
||||||
component: () => import('@/views/sys/stuliuyan'),
|
component: () => import('@/views/sys/stuliuyan/index.vue'),
|
||||||
name: 'SysStuliuyan',
|
name: 'SysStuliuyan',
|
||||||
meta: {
|
meta: {
|
||||||
title: '留言板块',
|
title: '留言板块',
|
||||||
@@ -287,7 +242,7 @@ export const asyncRoutes = [
|
|||||||
,
|
,
|
||||||
{
|
{
|
||||||
path: 'gonggao',
|
path: 'gonggao',
|
||||||
component: () => import('@/views/sys/stugggl'),
|
component: () => import('@/views/sys/stugggl/index.vue'),
|
||||||
name: 'SysStugggl',
|
name: 'SysStugggl',
|
||||||
meta: {
|
meta: {
|
||||||
title: '公告板块',
|
title: '公告板块',
|
||||||
@@ -300,25 +255,31 @@ export const asyncRoutes = [
|
|||||||
|
|
||||||
// 404 page must be placed at the end !!!
|
// 404 page must be placed at the end !!!
|
||||||
{
|
{
|
||||||
path: '*',
|
path: '/:pathMatch(.*)*',
|
||||||
redirect: '/dashboard',
|
redirect: '/dashboard',
|
||||||
hidden: true
|
hidden: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
const createRouter = () => new Router({
|
const router = createRouter({
|
||||||
// mode: 'history', // require service support
|
history: createWebHashHistory(),
|
||||||
scrollBehavior: () => ({
|
scrollBehavior: () => ({ top: 0 }),
|
||||||
y: 0
|
|
||||||
}),
|
|
||||||
routes: constantRoutes
|
routes: constantRoutes
|
||||||
})
|
})
|
||||||
|
|
||||||
const router = createRouter()
|
|
||||||
|
|
||||||
export function resetRouter() {
|
export function resetRouter() {
|
||||||
const newRouter = createRouter()
|
const newRouter = createRouter({
|
||||||
router.matcher = newRouter.matcher // reset router
|
history: createWebHashHistory(),
|
||||||
|
scrollBehavior: () => ({ top: 0 }),
|
||||||
|
routes: constantRoutes
|
||||||
|
})
|
||||||
|
// 注意:Vue Router 4 没有 matcher,通过移除所有路由再重新添加来重置
|
||||||
|
const currentRoutes = router.getRoutes()
|
||||||
|
currentRoutes.forEach(route => {
|
||||||
|
if (route.name && !constantRoutes.find(cr => cr.name === route.name)) {
|
||||||
|
router.removeRoute(route.name)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
export default {
|
||||||
title: '图书管理系统-陈昊东',
|
title: '图书管理系统-陈昊东',
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,23 +1,16 @@
|
|||||||
import Vue from 'vue'
|
import { createStore } from 'vuex'
|
||||||
import Vuex from 'vuex'
|
|
||||||
import getters from './getters'
|
import getters from './getters'
|
||||||
|
|
||||||
Vue.use(Vuex)
|
// 动态导入所有 modules
|
||||||
|
const modulesFiles = import.meta.glob('./modules/*.js', { eager: true })
|
||||||
|
|
||||||
// https://webpack.js.org/guides/dependency-management/#requirecontext
|
const modules = {}
|
||||||
const modulesFiles = require.context('./modules', true, /\.js$/)
|
for (const path in modulesFiles) {
|
||||||
|
const moduleName = path.replace(/(\.\/modules\/|\.js$)/g, '')
|
||||||
|
modules[moduleName] = modulesFiles[path].default
|
||||||
|
}
|
||||||
|
|
||||||
// you do not need `import app from './modules/app'`
|
const store = createStore({
|
||||||
// it will auto require all vuex module from modules file
|
|
||||||
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
|
|
||||||
// set './app.js' => 'app'
|
|
||||||
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
|
|
||||||
const value = modulesFiles(modulePath)
|
|
||||||
modules[moduleName] = value.default
|
|
||||||
return modules
|
|
||||||
}, {})
|
|
||||||
|
|
||||||
const store = new Vuex.Store({
|
|
||||||
modules,
|
modules,
|
||||||
getters
|
getters
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import variables from '@/styles/element-variables.scss'
|
|
||||||
import defaultSettings from '@/settings'
|
import defaultSettings from '@/settings'
|
||||||
import { fetchDetail } from '@/api/sys/config/config'
|
import { fetchDetail } from '@/api/sys/config/config.js'
|
||||||
|
|
||||||
const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
|
const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
theme: variables.theme,
|
theme: '#1890ff',
|
||||||
showSettings: showSettings,
|
showSettings: showSettings,
|
||||||
tagsView: tagsView,
|
tagsView: tagsView,
|
||||||
fixedHeader: fixedHeader,
|
fixedHeader: fixedHeader,
|
||||||
|
|||||||
@@ -161,7 +161,9 @@ const actions = {
|
|||||||
const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
|
const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
|
||||||
|
|
||||||
// dynamically add accessible routes
|
// dynamically add accessible routes
|
||||||
router.addRoutes(accessRoutes)
|
accessRoutes.forEach(route => {
|
||||||
|
router.addRoute(route)
|
||||||
|
})
|
||||||
|
|
||||||
// reset visited views and cached views
|
// reset visited views and cached views
|
||||||
dispatch('tagsView/delAllViews', null, { root: true })
|
dispatch('tagsView/delAllViews', null, { root: true })
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* I think element-ui's default theme color is too light for long-term use.
|
* Element Plus theme variables
|
||||||
* So I modified the default color and you can modify it to your liking.
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
/* theme color */
|
/* theme color */
|
||||||
@@ -8,24 +7,7 @@ $--color-primary: #1890ff;
|
|||||||
$--color-success: #13ce66;
|
$--color-success: #13ce66;
|
||||||
$--color-warning: #FFBA00;
|
$--color-warning: #FFBA00;
|
||||||
$--color-danger: #ff4949;
|
$--color-danger: #ff4949;
|
||||||
// $--color-info: #1E1E1E;
|
|
||||||
|
|
||||||
$--button-font-weight: 400;
|
|
||||||
|
|
||||||
// $--color-text-regular: #1f2d3d;
|
|
||||||
|
|
||||||
$--border-color-light: #dfe4ed;
|
|
||||||
$--border-color-lighter: #e6ebf5;
|
|
||||||
|
|
||||||
$--table-border:1px solid#dfe6ec;
|
|
||||||
|
|
||||||
/* icon font path, required */
|
|
||||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
|
||||||
|
|
||||||
@import "~element-ui/packages/theme-chalk/src/index";
|
|
||||||
|
|
||||||
// the :export directive is the magic sauce for webpack
|
|
||||||
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
|
|
||||||
:export {
|
:export {
|
||||||
theme: $--color-primary;
|
theme: $--color-primary;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
.login-container{
|
.login-container{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background-image: url('~@/assets/login-bg.svg');
|
background-image: url('@/assets/login-bg.svg');
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center 110px;
|
background-position: center 110px;
|
||||||
background-size: 100%;
|
background-size: 100%;
|
||||||
@@ -81,7 +81,6 @@
|
|||||||
color: #3296FA;
|
color: #3296FA;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep
|
|
||||||
.el-form-item__content{
|
.el-form-item__content{
|
||||||
line-height: 0px !important;
|
line-height: 0px !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
transition: opacity 0.28s;
|
transition: opacity 0.28s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fade-enter,
|
.fade-enter-from,
|
||||||
.fade-leave-active {
|
.fade-leave-active {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
transition: all .5s;
|
transition: all .5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fade-transform-enter {
|
.fade-transform-enter-from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateX(-30px);
|
transform: translateX(-30px);
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
transition: all .5s;
|
transition: all .5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.breadcrumb-enter,
|
.breadcrumb-enter-from,
|
||||||
.breadcrumb-leave-active {
|
.breadcrumb-leave-active {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateX(20px);
|
transform: translateX(20px);
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import Vue from 'vue'
|
import { getCurrentInstance } from 'vue'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { isString, isArray } from '@/utils/validate'
|
import { isString, isArray } from '@/utils/validate'
|
||||||
import settings from '@/settings'
|
import settings from '@/settings'
|
||||||
|
|
||||||
// you can set in settings.js
|
|
||||||
// errorLog:'production' | ['production', 'development']
|
|
||||||
const { errorLog: needErrorLog } = settings
|
const { errorLog: needErrorLog } = settings
|
||||||
|
|
||||||
function checkNeed() {
|
function checkNeed() {
|
||||||
const env = process.env.NODE_ENV
|
const env = import.meta.env.MODE
|
||||||
if (isString(needErrorLog)) {
|
if (isString(needErrorLog)) {
|
||||||
return env === needErrorLog
|
return env === needErrorLog
|
||||||
}
|
}
|
||||||
@@ -19,17 +17,19 @@ function checkNeed() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (checkNeed()) {
|
if (checkNeed()) {
|
||||||
Vue.config.errorHandler = function(err, vm, info, a) {
|
// Vue 3 使用 app.config.errorHandler
|
||||||
// Don't ask me why I use Vue.nextTick, it just a hack.
|
// 这里在 app 创建后设置,通过延迟设置
|
||||||
// detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
|
window.__setErrorhandler__ = function(app) {
|
||||||
Vue.nextTick(() => {
|
app.config.errorHandler = function(err, vm, info) {
|
||||||
store.dispatch('errorLog/addErrorLog', {
|
setTimeout(() => {
|
||||||
err,
|
store.dispatch('errorLog/addErrorLog', {
|
||||||
vm,
|
err,
|
||||||
info,
|
vm,
|
||||||
url: window.location.href
|
info,
|
||||||
})
|
url: window.location.href
|
||||||
console.error(err, info)
|
})
|
||||||
})
|
console.error(err, info)
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { MessageBox, Message } from 'element-ui'
|
import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'
|
||||||
import { Loading } from 'element-ui'
|
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
|
|
||||||
// 请求实例
|
|
||||||
const instance = axios.create({
|
const instance = axios.create({
|
||||||
baseURL: process.env.VUE_APP_BASE_API,
|
baseURL: import.meta.env.VITE_BASE_API,
|
||||||
timeout: 60000
|
timeout: 60000
|
||||||
})
|
})
|
||||||
|
|
||||||
// 请求前置过滤器
|
|
||||||
instance.interceptors.request.use(
|
instance.interceptors.request.use(
|
||||||
config => {
|
config => {
|
||||||
if (store.getters.token) {
|
if (store.getters.token) {
|
||||||
@@ -24,12 +21,10 @@ instance.interceptors.request.use(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// 响应数据拦截并做通用处理
|
|
||||||
instance.interceptors.response.use(
|
instance.interceptors.response.use(
|
||||||
response => {
|
response => {
|
||||||
const res = response.data
|
const res = response.data
|
||||||
|
|
||||||
// 下载文件直接返回
|
|
||||||
if (res.type === 'application/octet-stream') {
|
if (res.type === 'application/octet-stream') {
|
||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
@@ -38,18 +33,15 @@ instance.interceptors.response.use(
|
|||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0为正确响应码
|
|
||||||
if (res.code !== 0) {
|
if (res.code !== 0) {
|
||||||
Message({
|
ElMessage({
|
||||||
message: res.msg || 'Error',
|
message: res.msg || 'Error',
|
||||||
type: 'error',
|
type: 'error',
|
||||||
duration: 5 * 1000
|
duration: 5 * 1000
|
||||||
})
|
})
|
||||||
|
|
||||||
// 登录超时响应码
|
|
||||||
if (res.code === 10010002) {
|
if (res.code === 10010002) {
|
||||||
// to re-login
|
ElMessageBox.confirm('登录超时,请重新登录!', '登录提示', {
|
||||||
MessageBox.confirm('登录超时,请重新登录!', '登录提示', {
|
|
||||||
confirmButtonText: '重新登录',
|
confirmButtonText: '重新登录',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
@@ -66,7 +58,7 @@ instance.interceptors.response.use(
|
|||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
console.log('err' + error)
|
console.log('err' + error)
|
||||||
Message({
|
ElMessage({
|
||||||
message: error.message,
|
message: error.message,
|
||||||
type: 'error',
|
type: 'error',
|
||||||
duration: 5 * 1000
|
duration: 5 * 1000
|
||||||
@@ -75,16 +67,10 @@ instance.interceptors.response.use(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传
|
|
||||||
* @param url
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
export function upload(url, file, data) {
|
export function upload(url, file, data) {
|
||||||
const formData = new FormData()
|
const formData = new FormData()
|
||||||
formData.append('file', file)
|
formData.append('file', file)
|
||||||
|
|
||||||
// 附加数据
|
|
||||||
if (data) {
|
if (data) {
|
||||||
Object.keys(data).forEach((key) => {
|
Object.keys(data).forEach((key) => {
|
||||||
formData.append(key, data[key])
|
formData.append(key, data[key])
|
||||||
@@ -92,8 +78,7 @@ export function upload(url, file, data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// 打开
|
const loading = ElLoading.service({
|
||||||
const loading = Loading.service({
|
|
||||||
text: '正在上传数据...',
|
text: '正在上传数据...',
|
||||||
background: 'rgba(0, 0, 0, 0.7)'
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
})
|
})
|
||||||
@@ -114,15 +99,9 @@ export function upload(url, file, data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 下载
|
|
||||||
* @param url
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
export function download(url, data, fileName) {
|
export function download(url, data, fileName) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// 打开
|
const loading = ElLoading.service({
|
||||||
const loading = Loading.service({
|
|
||||||
text: '正在下载数据...',
|
text: '正在下载数据...',
|
||||||
background: 'rgba(0, 0, 0, 0.7)'
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
})
|
})
|
||||||
@@ -136,18 +115,16 @@ export function download(url, data, fileName) {
|
|||||||
}).then(res => {
|
}).then(res => {
|
||||||
loading.close()
|
loading.close()
|
||||||
|
|
||||||
// 文件下载
|
|
||||||
const blob = new Blob([res.data], {
|
const blob = new Blob([res.data], {
|
||||||
type: 'application/vnd.ms-excel'
|
type: 'application/vnd.ms-excel'
|
||||||
})
|
})
|
||||||
|
|
||||||
// 获得文件名称
|
|
||||||
let link = document.createElement('a')
|
let link = document.createElement('a')
|
||||||
link.href = URL.createObjectURL(blob)
|
link.href = URL.createObjectURL(blob)
|
||||||
link.setAttribute('download', fileName)
|
link.setAttribute('download', fileName)
|
||||||
link.click()
|
link.click()
|
||||||
link = null
|
link = null
|
||||||
Message.success('导出成功!')
|
ElMessage.success('导出成功!')
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
loading.close()
|
loading.close()
|
||||||
reject(err)
|
reject(err)
|
||||||
@@ -155,12 +132,6 @@ export function download(url, data, fileName) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 封装post请求
|
|
||||||
* @param url
|
|
||||||
* @param data
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
export function post(url, data = {}) {
|
export function post(url, data = {}) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
instance.post(url, data)
|
instance.post(url, data)
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<data-table ref="pagingTable" :options="options" :list-query="listQuery" @multi-actions="handleMultiAction">
|
<data-table ref="pagingTable" :options="options" :list-query="listQuery" @multi-actions="handleMultiAction">
|
||||||
<template slot="filter-content">
|
<template #filter-content>
|
||||||
<el-input v-model="listQuery.params.userName" style="width: 200px" placeholder="搜索登录名" class="filter-item"/>
|
<el-input v-model="listQuery.params.userName" style="width: 200px" placeholder="搜索登录名" class="filter-item"/>
|
||||||
<el-input v-model="listQuery.params.applyTimeParam" style="width: 200px" placeholder="搜索日期格式yyyyMM"
|
<el-input v-model="listQuery.params.applyTimeParam" style="width: 200px" placeholder="搜索日期格式yyyyMM"
|
||||||
class="filter-item"/>
|
class="filter-item"/>
|
||||||
<el-button class="filter-item" type="primary" icon="el-icon-plus" @click="handleAdd">
|
<el-button class="filter-item" type="primary" @click="handleAdd">
|
||||||
添加
|
<el-icon><Plus /></el-icon> 添加
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
<template slot="data-columns">
|
<template #data-columns>
|
||||||
<el-table-column type="selection" width="55"/>
|
<el-table-column type="selection" width="55"/>
|
||||||
<el-table-column align="center" label="用户名">
|
<el-table-column align="center" label="用户名">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<a style="color: #1890ff" @click="handleUpdate(scope.row)">{{ scope.row.userName }}</a>
|
<a style="color: #1890ff" @click="handleUpdate(scope.row)">{{ scope.row.userName }}</a>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</data-table>
|
</data-table>
|
||||||
|
|
||||||
<el-dialog :visible.sync="dialogVisible" title="添加申请" width="500px">
|
<el-dialog v-model="dialogVisible" title="添加申请" width="500px">
|
||||||
<el-form :model="formData" label-position="left" label-width="100px">
|
<el-form :model="formData" label-position="left" label-width="100px">
|
||||||
<el-form-item label="用户">
|
<el-form-item label="用户">
|
||||||
<el-select v-model="formData.userId" placeholder="请选择用户" :disabled="flag">
|
<el-select v-model="formData.userId" placeholder="请选择用户" :disabled="flag">
|
||||||
@@ -52,25 +52,27 @@
|
|||||||
v-model="formData.applyTime"
|
v-model="formData.applyTime"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
placeholder="选择日期时间"
|
placeholder="选择日期时间"
|
||||||
format="yyyy-MM-dd">
|
format="YYYY-MM-DD"
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<template #footer>
|
||||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
<div class="dialog-footer">
|
||||||
<el-button type="primary" @click="handleSave">确 定</el-button>
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
</div>
|
<el-button type="primary" @click="handleSave">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import DataTable from '@/components/DataTable'
|
import DataTable from '@/components/DataTable/index.vue'
|
||||||
import {userList} from '@/api/sys/user/user'
|
import {userList} from '@/api/sys/user/user.js'
|
||||||
import {saveData} from '@/api/apply/apply'
|
import {saveData} from '@/api/apply/apply.js'
|
||||||
import {mapGetters} from "vuex";
|
import {mapGetters} from "vuex";
|
||||||
import {formatDate} from '@/utils/index'
|
import {formatDate} from '@/utils/index'
|
||||||
import {dataFormatter} from '@/utils'
|
import {dataFormatter} from '@/utils'
|
||||||
import {getSelectOptions} from '@/api/sys/dict/dict'
|
import {getSelectOptions} from '@/api/sys/dict/dict.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'XmApply',
|
name: 'XmApply',
|
||||||
@@ -140,7 +142,7 @@
|
|||||||
dataFormatter,
|
dataFormatter,
|
||||||
formatDate,
|
formatDate,
|
||||||
handleUploadSuccess(response) {
|
handleUploadSuccess(response) {
|
||||||
// 上传图片赋值
|
// 上传图片注释
|
||||||
this.formData.avatar = response.data.url
|
this.formData.avatar = response.data.url
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user