mod vue2 to vue3

This commit is contained in:
chenhaodong
2026-06-18 01:44:25 +08:00
parent 109204734a
commit d30ff1a362
124 changed files with 951 additions and 2183 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<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 />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
@@ -2,28 +2,44 @@ package com.bc.exam;
import com.bc.exam.core.api.utils.JsonConverter;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.SpringApplication;
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.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
/**
* @Description 描述:springboot 系统启动
* @Author A贾宇婷034244310
* @Date 20260615
* 启动
*/
@Log4j2
@SpringBootApplication
@EnableTransactionManagement
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" +
"系统启动成功,访问路径如下:\n\t" +
"本地路径: \t\thttp://127.0.0.1:8101/\n\t"+
"API文档: \t\thttp://127.0.0.1:8101/doc.html\n\t" +
"本地路径: \t\thttp://127.0.0.1:" + port + path + "/\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("/**/*.jpg", "anon");
map.put("/**/*.png", "anon");
map.put("/**/*.gif", "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.

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
+1 -1
View File
@@ -2,4 +2,4 @@
ENV = 'development'
# 开发环境,一般就设置为本地后端端口,如:http://localhost:8101
VUE_APP_BASE_API = 'http://127.0.0.1:8101'
VITE_BASE_API = 'http://127.0.0.1:8101'
+1 -1
View File
@@ -2,5 +2,5 @@
ENV = 'production'
# 接口地址,如果要放到后端的static目录下,此处不用填任何内容
VUE_APP_BASE_API = ''
VITE_BASE_API = ''
-5
View File
@@ -1,5 +0,0 @@
module.exports = {
presets: [
'@vue/app'
]
}
+14 -46
View File
@@ -4,68 +4,36 @@
"description": "陈昊东毕设",
"author": "haodongchen@aliyun.com",
"scripts": {
"dev": "vue-cli-service serve",
"build:prod": "vue-cli-service build",
"build:demo": "vue-cli-service build --mode demo",
"lint": "eslint --ext .js,.vue src",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"axios": "^0.21.1",
"babel-plugin-dynamic-import-node": "^2.3.3",
"clipboard": "^2.0.4",
"cos-js-sdk-v5": "^1.2.16",
"dropzone": "5.5.1",
"element-ui": "^2.15.7",
"eslint": "^8.34.0",
"element-plus": "^2.9.1",
"fast-glob": "^3.3.3",
"fuse.js": "3.4.4",
"js-cookie": "2.2.0",
"jsonlint": "1.6.3",
"moment": "^2.29.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"querystring": "^0.2.0",
"screenfull": "^4.2.0",
"showdown": "^1.9.1",
"sortablejs": "^1.8.4",
"tracking": "^1.1.3",
"vue": "2.6.10",
"vue-count-to": "1.0.13",
"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"
"vue": "^3.4.21",
"vue-router": "^4.3.0",
"vuex": "^4.1.0"
},
"devDependencies": {
"@babel/core": "7.0.0",
"@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",
"@vitejs/plugin-vue": "^5.0.4",
"sass": "^1.49.9",
"sass-loader": "^10.2.0",
"script-ext-html-webpack-plugin": "^2.1.5",
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.0",
"vue-template-compiler": "2.6.10",
"webpack": "^4.46.0"
"vite": "^5.2.0",
"vite-plugin-svg-icons": "^2.0.1"
},
"engines": {
"node": ">=8.9",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions"
]
"node": ">=16.0.0"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<!--
@Description 描述:
@Author D吕034244311
@Author D吕034244311
@Date 20260615
-->
<!DOCTYPE html>
+1
View File
@@ -15,3 +15,4 @@ export function userReg(data) {
export function userList(){
return post('/exam/api/sys/user/queryAll', null)
}
+2 -2
View File
@@ -47,7 +47,7 @@ export default {
mounted() {
window.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
beforeUnmount() {
window.removeEventListener('scroll', this.handleScroll)
if (this.interval) {
clearInterval(this.interval)
@@ -99,7 +99,7 @@ export default {
transition: opacity .5s;
}
.fade-enter,
.fade-enter-from,
.fade-leave-to {
opacity: 0
}
+4 -4
View File
@@ -7,7 +7,7 @@
<el-row>
<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-row>
@@ -47,13 +47,13 @@
</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>
</template>
<script>
import { fetchList, deleteData, changeState } from '@/api/common'
import Pagination from '@/components/Pagination'
import { fetchList, deleteData, changeState } from '@/api/common.js'
import Pagination from '@/components/Pagination/index.vue'
export default {
name: 'PagingTable',
@@ -21,30 +21,27 @@
default-expand-all
@node-click="onClickNode"
/>
<el-input
slot="reference"
ref="input"
v-model="labelModel"
:style="`width: ${width}px`"
:class="{ 'rotate': showStatus }"
:placeholder="placeholder"
clearable
suffix-icon="el-icon-arrow-down"
/>
<template #reference>
<el-input
ref="input"
v-model="labelModel"
:style="`width: ${width}px`"
:class="{ 'rotate': showStatus }"
:placeholder="placeholder"
clearable
>
<template #suffix><el-icon><ArrowDown /></el-icon></template>
</el-input>
</template>
</el-popover>
</template>
<script>
export default {
name: 'DepartTree',
// 设置绑定参数
model: {
prop: 'value',
event: 'selected'
},
props: {
// 接收绑定参数
value: String,
modelValue: String,
// 输入框宽度
width: String,
// 选项数据
@@ -100,14 +97,14 @@ export default {
}
this.$refs.tree.filter(val)
},
value(val) {
modelValue(val) {
this.labelModel = this.queryTree(this.data, val)
}
},
created() {
// 检测输入框原有值并显示对应 label
if (this.value) {
this.labelModel = this.queryTree(this.data, this.value)
if (this.modelValue) {
this.labelModel = this.queryTree(this.data, this.modelValue)
}
// 获取输入框宽度同步至树状菜单宽度
this.$nextTick(() => {
@@ -137,7 +134,7 @@ export default {
// 隐藏时触发
onHidePopover() {
this.showStatus = false
this.$emit('selected', this.valueModel)
this.$emit('update:modelValue', this.valueModel)
},
// 树节点过滤方法
filterNode(query, data) {
+10 -8
View File
@@ -1,19 +1,21 @@
<template>
<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">
<svg-icon icon-class="bug" />
</el-button>
</el-badge>
<el-dialog :visible.sync="dialogTableVisible" width="80%" append-to-body>
<div slot="title">
<el-dialog v-model="dialogTableVisible" width="80%" append-to="body">
<template #header>
<span style="padding-right: 10px;">Error Log</span>
<el-button size="mini" type="primary" icon="el-icon-delete" @click="clearAll">Clear All</el-button>
</div>
<el-button size="small" type="primary" @click="clearAll">
<el-icon><Delete /></el-icon> Clear All
</el-button>
</template>
<el-table :data="errorLogs" border>
<el-table-column label="Message">
<template slot-scope="{row}">
<template #default="{row}">
<div>
<span class="message-title">Msg:</span>
<el-tag type="danger">
@@ -24,7 +26,7 @@
<div>
<span class="message-title" style="padding-right: 10px;">Info: </span>
<el-tag type="warning">
{{ row.vm.$vnode.tag }} error in {{ row.info }}
error in {{ row.info }}
</el-tag>
</div>
<br>
@@ -37,7 +39,7 @@
</template>
</el-table-column>
<el-table-column label="Stack">
<template slot-scope="scope">
<template #default="scope">
{{ scope.row.err.stack }}
</template>
</el-table-column>
+5 -5
View File
@@ -29,7 +29,7 @@ export default {
name: 'ExamSelect',
props: {
multi: Boolean,
value: Array,
modelValue: Array,
default: String
},
data() {
@@ -42,14 +42,14 @@ export default {
watch: {
// 检测查询变化
value: {
modelValue: {
handler() {
this.currentValue = this.value
this.currentValue = this.modelValue
}
}
},
created() {
this.currentValue = this.value
this.currentValue = this.modelValue
this.fetchData()
},
methods: {
@@ -63,7 +63,7 @@ export default {
console.log(e)
this.$emit('change', e)
this.$emit('input', e)
this.$emit('update:modelValue', e)
}
}
}
+5 -5
View File
@@ -6,13 +6,13 @@
<script>
import FileUploadLocal from './local'
import FileUploadLocal from './local.vue'
export default {
name: 'FileUpload',
components: { FileUploadLocal },
props: {
value: String,
modelValue: String,
accept: {
type: String,
default: '*'
@@ -31,7 +31,7 @@ export default {
watch: {
// 检测查询变化
value: {
modelValue: {
handler() {
this.fillValue()
}
@@ -40,7 +40,7 @@ export default {
// 检测查询变化
fileUrl: {
handler() {
this.$emit('input', this.fileUrl)
this.$emit('update:modelValue', this.fileUrl)
}
}
},
@@ -55,7 +55,7 @@ export default {
methods: {
fillValue() {
this.fileUrl = this.value
this.fileUrl = this.modelValue
}
}
+8 -8
View File
@@ -18,12 +18,12 @@
<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">
将文件拖到此处
<em>点击上传</em>
</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>
</div>
@@ -37,7 +37,7 @@ import { getToken } from '@/utils/auth'
export default {
name: 'FileUploadLocal',
props: {
value: String,
modelValue: String,
accept: String,
tips: String,
listType: String,
@@ -48,7 +48,7 @@ export default {
},
data() {
return {
server: `${process.env.VUE_APP_BASE_API}/common/api/file/upload`,
server: `${import.meta.env.VITE_BASE_API}/common/api/file/upload`,
fileList: [],
fileUrl: '',
header: {}
@@ -57,7 +57,7 @@ export default {
watch: {
// 检测查询变化
value: {
modelValue: {
handler() {
this.fillValue()
}
@@ -73,7 +73,7 @@ export default {
fillValue() {
this.fileList = []
this.fileUrl = this.value
this.fileUrl = this.modelValue
if (this.fileUrl) {
this.fileList = [{ name: this.fileUrl, url: this.fileUrl }]
}
@@ -90,7 +90,7 @@ export default {
// 文件列表移除文件时的钩子
handleRemove() {
this.$emit('input', '')
this.$emit('update:modelValue', '')
this.fileList = []
},
@@ -105,7 +105,7 @@ export default {
this.fileList = []
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
// make search results more in line with expectations
import Fuse from 'fuse.js'
import path from 'path'
import { resolve } from '@/utils/path'
export default {
name: 'HeaderSearch',
@@ -83,7 +83,6 @@ export default {
threshold: 0.4,
location: 0,
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 1,
keys: [{
name: 'title',
@@ -104,7 +103,7 @@ export default {
if (router.hidden) { continue }
const data = {
path: path.resolve(basePath, router.path),
path: resolve(basePath, router.path),
title: [...prefixTitle]
}
@@ -159,7 +158,7 @@ export default {
display: inline-block;
vertical-align: middle;
::v-deep .el-input__inner {
:deep(.el-input__inner) {
border-radius: 0;
border: 0;
padding-left: 0;
+6 -6
View File
@@ -25,12 +25,12 @@
<script>
import { fetchList } from '@/api/sys/role/role'
import { fetchList } from '@/api/sys/role/role.js'
export default {
name: 'MeetRole',
props: {
value: Array,
modelValue: Array,
default: Array
},
data() {
@@ -43,15 +43,15 @@ export default {
watch: {
// 检测查询变化
value: {
modelValue: {
handler() {
this.values = this.value
this.values = this.modelValue
},
deep: true
}
},
created() {
this.values = this.value
this.values = this.modelValue
this.fetchList()
},
methods: {
@@ -63,7 +63,7 @@ export default {
},
handlerChange(e) {
this.$emit('change', e)
this.$emit('input', e)
this.$emit('update:modelValue', e)
}
}
}
+2 -2
View File
@@ -2,8 +2,8 @@
<div :class="{'hidden':hidden}" class="pagination-container">
<el-pagination
:background="background"
:current-page.sync="currentPage"
:page-size.sync="pageSize"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:layout="layout"
:page-sizes="pageSizes"
:total="total"
+5 -5
View File
@@ -34,7 +34,7 @@ export default {
type: Boolean,
default: false
},
value: String
modelValue: String
},
data() {
return {
@@ -46,14 +46,14 @@ export default {
watch: {
// 检测查询变化
value: {
modelValue: {
handler() {
this.currentValue = this.value
this.currentValue = this.modelValue
}
}
},
created() {
this.currentValue = this.value
this.currentValue = this.modelValue
this.fetchData()
},
methods: {
@@ -69,7 +69,7 @@ export default {
})
this.$emit('change', obj)
this.$emit('input', e)
this.$emit('update:modelValue', e)
}
}
}
+2 -2
View File
@@ -3,7 +3,7 @@
<div class="rightPanel-background" />
<div class="rightPanel">
<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 class="rightPanel-items">
<slot />
@@ -52,7 +52,7 @@ export default {
mounted() {
this.insertToBody()
},
beforeDestroy() {
beforeUnmount() {
const elx = this.$refs.rightPanel
elx.remove()
},
+1 -1
View File
@@ -17,7 +17,7 @@ export default {
mounted() {
this.init()
},
beforeDestroy() {
beforeUnmount() {
this.destroy()
},
methods: {
+1 -2
View File
@@ -3,7 +3,7 @@
<div>
<svg-icon class-name="size-icon" icon-class="size" />
</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">
{{
item.label }}
@@ -31,7 +31,6 @@ export default {
},
methods: {
handleSetSize(size) {
this.$ELEMENT.size = size
this.$store.dispatch('app/setSize', size)
this.refreshView()
this.$message({
+2 -2
View File
@@ -1,6 +1,6 @@
<template>
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
<svg v-else :class="svgClass" aria-hidden="true" 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-bind="$attrs">
<use :href="iconName" />
</svg>
</template>
@@ -8,7 +8,6 @@
</template>
<script>
const version = require('element-ui/package.json').version // element-ui version from node_modules
const ORIGINAL_THEME = '#409EFF' // default color
export default {
@@ -41,8 +40,7 @@ export default {
message: ' Compiling the theme',
customClass: 'theme-message',
type: 'success',
duration: 0,
iconClass: 'el-icon-loading'
duration: 0
})
const getHandler = (variable, id) => {
@@ -61,7 +59,7 @@ export default {
}
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')
}
@@ -5,7 +5,7 @@ if (!Clipboard) {
}
export default {
bind(el, binding) {
created(el, binding) {
if (binding.arg === 'success') {
el._v_clipboard_success = binding.value
} else if (binding.arg === 'error') {
@@ -26,7 +26,7 @@ export default {
el._v_clipboard = clipboard
}
},
update(el, binding) {
updated(el, binding) {
if (binding.arg === 'success') {
el._v_clipboard_success = binding.value
} else if (binding.arg === 'error') {
@@ -36,7 +36,7 @@ export default {
el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
}
},
unbind(el, binding) {
unmounted(el, binding) {
if (binding.arg === 'success') {
delete el._v_clipboard_success
} else if (binding.arg === 'error') {
@@ -1,7 +1,7 @@
import store from '@/store'
export default {
inserted(el, binding, vnode) {
mounted(el, binding, vnode) {
const { value } = binding
const roles = store.getters && store.getters.roles
+4 -10
View File
@@ -1,8 +1,8 @@
const vueSticky = {}
let listenAction
vueSticky.install = Vue => {
Vue.directive('sticky', {
inserted(el, binding) {
vueSticky.install = app => {
app.directive('sticky', {
mounted(el, binding) {
const params = binding.value || {}
const stickyTop = params.stickyTop || 0
const zIndex = params.zIndex || 1000
@@ -10,12 +10,6 @@ vueSticky.install = Vue => {
elStyle.position = '-webkit-sticky'
elStyle.position = 'sticky'
// if the browser support css stickyCurrently Safari, Firefox and Chrome Canary
// if (~elStyle.position.indexOf('sticky')) {
// elStyle.top = `${stickyTop}px`;
// elStyle.zIndex = zIndex;
// return
// }
const elHeight = el.getBoundingClientRect().height
const elWidth = el.getBoundingClientRect().width
elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
@@ -81,7 +75,7 @@ vueSticky.install = Vue => {
window.addEventListener('scroll', listenAction)
},
unbind() {
unmounted() {
window.removeEventListener('scroll', listenAction)
}
})
+6 -6
View File
@@ -6,9 +6,9 @@ function handleClick(el, binding) {
function handle(e) {
const customOpts = Object.assign({}, binding.value)
const opts = Object.assign({
ele: el, // 波纹作用元素
type: 'hit', // hit 点击位置扩散 center中心点扩展
color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
ele: el,
type: 'hit',
color: 'rgba(0, 0, 0, 0.15)'
},
customOpts
)
@@ -57,14 +57,14 @@ function handleClick(el, binding) {
}
export default {
bind(el, binding) {
created(el, binding) {
el.addEventListener('click', handleClick(el, binding), false)
},
update(el, binding) {
updated(el, binding) {
el.removeEventListener('click', el[context].removeHandle, false)
el.addEventListener('click', handleClick(el, binding), false)
},
unbind(el) {
unmounted(el) {
el.removeEventListener('click', el[context].removeHandle, false)
el[context] = null
delete el[context]
+1 -9
View File
@@ -1,9 +1 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
import 'virtual:svg-icons-register'
+11 -9
View File
@@ -21,9 +21,9 @@
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
{{ realName }}
<i class="el-icon-caret-bottom" />
<el-icon class="el-icon-caret-bottom"><ArrowDown /></el-icon>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-menu #dropdown>
<router-link to="/profile/index">
<el-dropdown-item>个人资料</el-dropdown-item>
</router-link>
@@ -38,12 +38,13 @@
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
import ErrorLog from '@/components/ErrorLog'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import { ArrowDown } from '@element-plus/icons-vue'
import Breadcrumb from '@/components/Breadcrumb/index.vue'
import Hamburger from '@/components/Hamburger/index.vue'
import ErrorLog from '@/components/ErrorLog/index.vue'
import Screenfull from '@/components/Screenfull/index.vue'
import SizeSelect from '@/components/SizeSelect/index.vue'
import Search from '@/components/HeaderSearch/index.vue'
export default {
components: {
@@ -52,7 +53,8 @@ export default {
ErrorLog,
Screenfull,
SizeSelect,
Search
Search,
ArrowDown
},
computed: {
...mapGetters([
@@ -28,7 +28,7 @@
</template>
<script>
import ThemePicker from '@/components/ThemePicker'
import ThemePicker from '@/components/ThemePicker/index.vue'
export default {
components: { ThemePicker },
@@ -1,7 +1,11 @@
<template>
<svg-icon v-if="icon" :icon-class="icon" />
<span v-if="title">{{ title }}</span>
</template>
<script>
export default {
name: 'MenuItem',
functional: true,
props: {
icon: {
type: String,
@@ -11,19 +15,6 @@ export default {
type: String,
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>
@@ -1,9 +1,11 @@
<template>
<!-- eslint-disable vue/require-component-is -->
<component v-bind="linkProps(to)">
<a v-if="isExternal" :href="to" target="_blank" rel="noopener">
<slot />
</component>
</a>
<router-link v-else :to="to">
<slot />
</router-link>
</template>
<script>
@@ -16,20 +18,9 @@ export default {
required: true
}
},
methods: {
linkProps(url) {
if (isExternal(url)) {
return {
is: 'a',
href: url,
target: '_blank',
rel: 'noopener'
}
}
return {
is: 'router-link',
to: url
}
computed: {
isExternal() {
return isExternal(this.to)
}
}
}
@@ -36,7 +36,7 @@ export default {
transition: opacity 1.5s;
}
.sidebarLogoFade-enter,
.sidebarLogoFade-enter-from,
.sidebarLogoFade-leave-to {
opacity: 0;
}
@@ -8,8 +8,8 @@
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template slot="title">
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
<template #title>
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
</template>
<sidebar-item
@@ -25,11 +25,11 @@
</template>
<script>
import path from 'path'
import { resolve } from '@/utils/path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'
import Item from './Item.vue'
import AppLink from './Link.vue'
import FixiOSBug from './FixiOSBug.js'
export default {
name: 'SidebarItem',
@@ -88,7 +88,7 @@ export default {
if (isExternal(this.basePath)) {
return this.basePath
}
return path.resolve(this.basePath, routePath)
return resolve(this.basePath, routePath)
}
}
}
@@ -20,9 +20,9 @@
<script>
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'
import Logo from './Logo.vue'
import SidebarItem from './SidebarItem.vue'
import variables from '@/styles/variables-js.js'
export default {
components: { SidebarItem, Logo },
@@ -1,5 +1,5 @@
<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 />
</el-scrollbar>
</template>
@@ -73,13 +73,11 @@ export default {
position: relative;
overflow: hidden;
width: 100%;
::v-deep {
.el-scrollbar__bar {
bottom: 0px;
}
.el-scrollbar__wrap {
height: 49px;
}
:deep(.el-scrollbar__bar) {
bottom: 0px;
}
:deep(.el-scrollbar__wrap) {
height: 49px;
}
}
</style>
@@ -1,20 +1,19 @@
<template>
<div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper">
<router-link
<span
v-for="tag in visitedViews"
ref="tag"
:key="tag.path"
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)"
@click="navigateTo(tag)"
@click.middle="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent="openMenu(tag,$event)"
>
{{ tag.title }}
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
</router-link>
</span>
</scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
<li @click="refreshSelectedTag(selectedTag)">Refresh</li>
@@ -26,8 +25,8 @@
</template>
<script>
import ScrollPane from './ScrollPane'
import path from 'path'
import ScrollPane from './ScrollPane.vue'
import { resolve } from '@/utils/path'
export default {
components: { ScrollPane },
@@ -76,7 +75,7 @@ export default {
let tags = []
routes.forEach(route => {
if (route.meta && route.meta.affix) {
const tagPath = path.resolve(basePath, route.path)
const tagPath = resolve(basePath, route.path)
tags.push({
fullPath: tagPath,
path: tagPath,
@@ -110,20 +109,19 @@ export default {
return false
},
moveToCurrentTag() {
const tags = this.$refs.tag
this.$nextTick(() => {
for (const tag of tags) {
if (tag.to.path === this.$route.path) {
this.$refs.scrollPane.moveToTarget(tag)
// when query is different then update
if (tag.to.fullPath !== this.$route.fullPath) {
this.$store.dispatch('tagsView/updateVisitedView', this.$route)
}
break
}
const tags = this.$refs.tag
if (!tags) return
// In Vue 3, $refs with v-for gives DOM elements in same order
const index = this.visitedViews.findIndex(v => v.path === this.$route.path)
if (index >= 0 && tags[index]) {
this.$refs.scrollPane.moveToTarget(tags[index])
}
})
},
navigateTo(tag) {
this.$router.push({ path: tag.path, query: tag.query })
},
refreshSelectedTag(view) {
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
const { fullPath } = view
+3 -3
View File
@@ -1,5 +1,5 @@
export { default as AppMain } from './AppMain'
export { default as Navbar } from './Navbar'
export { default as Settings } from './Settings'
export { default as AppMain } from './AppMain.vue'
export { default as Navbar } from './Navbar.vue'
export { default as Settings } from './Settings/index.vue'
export { default as Sidebar } from './Sidebar/index.vue'
export { default as TagsView } from './TagsView/index.vue'
+3 -3
View File
@@ -16,7 +16,7 @@
</template>
<script>
import RightPanel from '@/components/RightPanel'
import RightPanel from '@/components/RightPanel/index.vue'
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex'
@@ -58,8 +58,8 @@ export default {
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
@import "~@/styles/variables.scss";
@import "@/styles/mixin.scss";
@import "@/styles/variables.scss";
.app-wrapper {
@include clearfix;
+1 -1
View File
@@ -14,7 +14,7 @@ export default {
beforeMount() {
window.addEventListener('resize', this.$_resizeHandler)
},
beforeDestroy() {
beforeUnmount() {
window.removeEventListener('resize', this.$_resizeHandler)
},
mounted() {
+34 -21
View File
@@ -1,37 +1,50 @@
import Vue from 'vue'
import { createApp } from 'vue'
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/index.scss'
import App from './App'
import App from './App.vue'
import store from './store'
import router from './router'
import './icons' // icon
import './permission' // permission control
import './utils/error-log' // error log
import SvgIcon from '@/components/SvgIcon/index.vue'
import './icons'
import './permission'
import './utils/error-log'
import * as filters from './filters'
// Element UI
Vue.use(Element, {
size: Cookies.get('size') || 'medium' // set element-ui default size
const app = createApp(App)
app.use(ElementPlus, {
locale: zhCn,
size: Cookies.get('size') || 'default'
})
// 注册全局过滤器
Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key])
})
// 全局注册 Element Plus 图标组件
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
Vue.config.productionTip = false
app.use(store)
app.use(router)
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})
// 注册全局过滤器(Vue3 过滤器为普通函数,通过 globalProperties 提供)
app.component('svg-icon', SvgIcon)
app.config.globalProperties.$filters = filters
// 设置错误处理器
if (window.__setErrorhandler__) {
window.__setErrorhandler__(app)
}
app.mount('#app')
+10 -17
View File
@@ -1,29 +1,25 @@
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
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) => {
// start progress bar
NProgress.start()
// 获取网站基本信息
let siteData = store.getters.siteData
if (!siteData.siteName) {
siteData = await store.dispatch('settings/getSite')
}
// 页面标题
document.title = getPageTitle(siteData.siteName, to.meta.title)
// 本地token
const hasToken = getToken()
if (hasToken) {
@@ -36,26 +32,24 @@ router.beforeEach(async(to, from, next) => {
next()
} else {
try {
// 读取用户权限
const { roles } = await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
router.addRoutes(accessRoutes)
accessRoutes.forEach(route => {
router.addRoute(route)
})
next({ ...to, replace: true })
} catch (error) {
// 出错注销
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
ElMessage.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
// 排除白名单
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
// 跳转到登录页面
next(`/login?redirect=${to.path}`)
NProgress.done()
}
@@ -63,6 +57,5 @@ router.beforeEach(async(to, from, next) => {
})
router.afterEach(() => {
// finish progress bar
NProgress.done()
})
+43 -82
View File
@@ -1,21 +1,18 @@
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
import { createRouter, createWebHashHistory } from 'vue-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 = [{
path: '/redirect',
component: Layout,
hidden: true,
children: [{
path: '/redirect/:path*',
component: () => import('@/views/redirect/index')
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect/index.vue')
}]
},
@@ -26,13 +23,13 @@ export const constantRoutes = [{
children: [{
path: '/login',
name: 'Login',
component: () => import('@/views/login/index'),
component: () => import('@/views/login/index.vue'),
hidden: true
},
{
path: '/register',
name: 'Register',
component: () => import('@/views/login/register'),
component: () => import('@/views/login/register.vue'),
hidden: true
}
]
@@ -40,12 +37,12 @@ export const constantRoutes = [{
{
path: '/404',
component: () => import('@/views/error-page/404'),
component: () => import('@/views/error-page/404.vue'),
hidden: true
},
{
path: '/401',
component: () => import('@/views/error-page/401'),
component: () => import('@/views/error-page/401.vue'),
hidden: true
},
{
@@ -54,7 +51,7 @@ export const constantRoutes = [{
redirect: '/dashboard',
children: [{
path: 'dashboard',
component: () => import('@/views/dashboard/index'),
component: () => import('@/views/dashboard/index.vue'),
name: 'Dashboard',
meta: {
title: '控制台',
@@ -71,7 +68,7 @@ export const constantRoutes = [{
hidden: true,
children: [{
path: 'index',
component: () => import('@/views/profile/index'),
component: () => import('@/views/profile/index.vue'),
name: 'Profile',
meta: {
title: '个人资料',
@@ -88,26 +85,6 @@ export const constantRoutes = [{
*/
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',
component: Layout,
@@ -120,7 +97,7 @@ export const asyncRoutes = [
},
children: [{
path: 'config',
component: () => import('@/views/sys/config'),
component: () => import('@/views/sys/config/index.vue'),
name: 'SysConfig',
meta: {
title: '系统配置',
@@ -129,26 +106,16 @@ export const asyncRoutes = [
},
{
path: 'dict',
component: () => import('@/views/sys/dict'),
component: () => import('@/views/sys/dict/index.vue'),
name: 'SysDict',
meta: {
title: '码值管理',
icon: 'theme'
}
},
/*{
path: 'depart',
component: () => import('@/views/sys/depart'),
name: 'SysDepart',
meta: {
title: '部门管理',
icon: 'tree'
}
},*/
{
path: 'role',
component: () => import('@/views/sys/role'),
component: () => import('@/views/sys/role/index.vue'),
name: 'SysRole',
meta: {
title: '角色管理',
@@ -158,7 +125,7 @@ export const asyncRoutes = [
{
path: 'user',
component: () => import('@/views/sys/user'),
component: () => import('@/views/sys/user/index.vue'),
name: 'SysUser',
meta: {
title: '用户管理',
@@ -168,7 +135,7 @@ export const asyncRoutes = [
{
path: 'bookgl',
component: () => import('@/views/sys/bookgl'),
component: () => import('@/views/sys/bookgl/index.vue'),
name: 'SysBookgl',
meta: {
title: '书籍信息管理',
@@ -177,7 +144,7 @@ export const asyncRoutes = [
},
{
path: 'jieshu',
component: () => import('@/views/sys/jieshu'),
component: () => import('@/views/sys/jieshu/index.vue'),
name: 'SysJieshu',
meta: {
title: '图书搜索',
@@ -187,7 +154,7 @@ export const asyncRoutes = [
{
path: 'huanshu',
component: () => import('@/views/sys/huanshu'),
component: () => import('@/views/sys/huanshu/index.vue'),
name: 'Syshuanshu',
meta: {
title: '我的借还',
@@ -196,7 +163,7 @@ export const asyncRoutes = [
},
{
path: 'jiehuanjilu',
component: () => import('@/views/sys/jiehuanjilu'),
component: () => import('@/views/sys/jiehuanjilu/index.vue'),
name: 'SysJiehuanjilu',
meta: {
title: '借还记录',
@@ -204,7 +171,7 @@ export const asyncRoutes = [
}
},{
path: 'gggl',
component: () => import('@/views/sys/gggl'),
component: () => import('@/views/sys/gggl/index.vue'),
name: 'SysGggl',
meta: {
title: '公告管理',
@@ -213,7 +180,7 @@ export const asyncRoutes = [
},
{
path: 'lygl',
component: () => import('@/views/sys/liuyangl'),
component: () => import('@/views/sys/liuyangl/index.vue'),
name: 'SysLygl',
meta: {
title: '留言管理',
@@ -222,9 +189,6 @@ export const asyncRoutes = [
},
]
},
{
path: '/sys',
@@ -235,20 +199,11 @@ export const asyncRoutes = [
title: '用户系统',
icon: 'configure',
roles: ['student']
},// 学生路由页面
},
children: [
/*{
path: 'grxxgl',
component: () => import('@/views/sys/grxxgl'),
name: 'SysGrxxgl',
meta: {
title: '个人信息管理',
icon: 'admin'
}
},*/
{
path: 'jieshu',
component: () => import('@/views/sys/jieshu'),
component: () => import('@/views/sys/jieshu/index.vue'),
name: 'SysJieshu',
meta: {
title: '图书搜索',
@@ -258,7 +213,7 @@ export const asyncRoutes = [
{
path: 'huanshu',
component: () => import('@/views/sys/huanshu'),
component: () => import('@/views/sys/huanshu/index.vue'),
name: 'Syshuanshu',
meta: {
title: '我的借还',
@@ -267,7 +222,7 @@ export const asyncRoutes = [
},
{
path: 'jiehuanjilu',
component: () => import('@/views/sys/jiehuanjilu'),
component: () => import('@/views/sys/jiehuanjilu/index.vue'),
name: 'SysJiehuanjilu',
meta: {
title: '借还记录',
@@ -277,7 +232,7 @@ export const asyncRoutes = [
,
{
path: 'liuyan',
component: () => import('@/views/sys/stuliuyan'),
component: () => import('@/views/sys/stuliuyan/index.vue'),
name: 'SysStuliuyan',
meta: {
title: '留言板块',
@@ -287,7 +242,7 @@ export const asyncRoutes = [
,
{
path: 'gonggao',
component: () => import('@/views/sys/stugggl'),
component: () => import('@/views/sys/stugggl/index.vue'),
name: 'SysStugggl',
meta: {
title: '公告板块',
@@ -300,25 +255,31 @@ export const asyncRoutes = [
// 404 page must be placed at the end !!!
{
path: '*',
path: '/:pathMatch(.*)*',
redirect: '/dashboard',
hidden: true
}
]
const createRouter = () => new Router({
// mode: 'history', // require service support
scrollBehavior: () => ({
y: 0
}),
const router = createRouter({
history: createWebHashHistory(),
scrollBehavior: () => ({ top: 0 }),
routes: constantRoutes
})
const router = createRouter()
export function resetRouter() {
const newRouter = createRouter()
router.matcher = newRouter.matcher // reset router
const newRouter = createRouter({
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
+1 -1
View File
@@ -1,4 +1,4 @@
module.exports = {
export default {
title: '图书管理系统-陈昊东',
/**
+9 -16
View File
@@ -1,23 +1,16 @@
import Vue from 'vue'
import Vuex from 'vuex'
import { createStore } from 'vuex'
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 modulesFiles = require.context('./modules', true, /\.js$/)
const modules = {}
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'`
// 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({
const store = createStore({
modules,
getters
})
+2 -3
View File
@@ -1,11 +1,10 @@
import variables from '@/styles/element-variables.scss'
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 state = {
theme: variables.theme,
theme: '#1890ff',
showSettings: showSettings,
tagsView: tagsView,
fixedHeader: fixedHeader,
+3 -1
View File
@@ -161,7 +161,9 @@ const actions = {
const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
// dynamically add accessible routes
router.addRoutes(accessRoutes)
accessRoutes.forEach(route => {
router.addRoute(route)
})
// reset visited views and cached views
dispatch('tagsView/delAllViews', null, { root: true })
+1 -19
View File
@@ -1,6 +1,5 @@
/**
* I think element-ui's default theme color is too light for long-term use.
* So I modified the default color and you can modify it to your liking.
* Element Plus theme variables
**/
/* theme color */
@@ -8,24 +7,7 @@ $--color-primary: #1890ff;
$--color-success: #13ce66;
$--color-warning: #FFBA00;
$--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 {
theme: $--color-primary;
}
+1 -2
View File
@@ -14,7 +14,7 @@
.login-container{
display: flex;
flex-direction: column;
background-image: url('~@/assets/login-bg.svg');
background-image: url('@/assets/login-bg.svg');
background-repeat: no-repeat;
background-position: center 110px;
background-size: 100%;
@@ -81,7 +81,6 @@
color: #3296FA;
}
::v-deep
.el-form-item__content{
line-height: 0px !important;
}
+3 -3
View File
@@ -6,7 +6,7 @@
transition: opacity 0.28s;
}
.fade-enter,
.fade-enter-from,
.fade-leave-active {
opacity: 0;
}
@@ -17,7 +17,7 @@
transition: all .5s;
}
.fade-transform-enter {
.fade-transform-enter-from {
opacity: 0;
transform: translateX(-30px);
}
@@ -33,7 +33,7 @@
transition: all .5s;
}
.breadcrumb-enter,
.breadcrumb-enter-from,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
+16 -16
View File
@@ -1,14 +1,12 @@
import Vue from 'vue'
import { getCurrentInstance } from 'vue'
import store from '@/store'
import { isString, isArray } from '@/utils/validate'
import settings from '@/settings'
// you can set in settings.js
// errorLog:'production' | ['production', 'development']
const { errorLog: needErrorLog } = settings
function checkNeed() {
const env = process.env.NODE_ENV
const env = import.meta.env.MODE
if (isString(needErrorLog)) {
return env === needErrorLog
}
@@ -19,17 +17,19 @@ function checkNeed() {
}
if (checkNeed()) {
Vue.config.errorHandler = function(err, vm, info, a) {
// Don't ask me why I use Vue.nextTick, it just a hack.
// detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
Vue.nextTick(() => {
store.dispatch('errorLog/addErrorLog', {
err,
vm,
info,
url: window.location.href
})
console.error(err, info)
})
// Vue 3 使用 app.config.errorHandler
// 这里在 app 创建后设置,通过延迟设置
window.__setErrorhandler__ = function(app) {
app.config.errorHandler = function(err, vm, info) {
setTimeout(() => {
store.dispatch('errorLog/addErrorLog', {
err,
vm,
info,
url: window.location.href
})
console.error(err, info)
}, 0)
}
}
}
+8 -37
View File
@@ -1,16 +1,13 @@
import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import { Loading } from 'element-ui'
import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import store from '@/store'
import { getToken } from '@/utils/auth'
// 请求实例
const instance = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
baseURL: import.meta.env.VITE_BASE_API,
timeout: 60000
})
// 请求前置过滤器
instance.interceptors.request.use(
config => {
if (store.getters.token) {
@@ -24,12 +21,10 @@ instance.interceptors.request.use(
}
)
// 响应数据拦截并做通用处理
instance.interceptors.response.use(
response => {
const res = response.data
// 下载文件直接返回
if (res.type === 'application/octet-stream') {
return response
}
@@ -38,18 +33,15 @@ instance.interceptors.response.use(
return response
}
// 0为正确响应码
if (res.code !== 0) {
Message({
ElMessage({
message: res.msg || 'Error',
type: 'error',
duration: 5 * 1000
})
// 登录超时响应码
if (res.code === 10010002) {
// to re-login
MessageBox.confirm('登录超时,请重新登录!', '登录提示', {
ElMessageBox.confirm('登录超时,请重新登录!', '登录提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
@@ -66,7 +58,7 @@ instance.interceptors.response.use(
},
error => {
console.log('err' + error)
Message({
ElMessage({
message: error.message,
type: 'error',
duration: 5 * 1000
@@ -75,16 +67,10 @@ instance.interceptors.response.use(
}
)
/**
* 上传
* @param url
* @param data
*/
export function upload(url, file, data) {
const formData = new FormData()
formData.append('file', file)
// 附加数据
if (data) {
Object.keys(data).forEach((key) => {
formData.append(key, data[key])
@@ -92,8 +78,7 @@ export function upload(url, file, data) {
}
return new Promise((resolve, reject) => {
// 打开
const loading = Loading.service({
const loading = ElLoading.service({
text: '正在上传数据...',
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) {
return new Promise((resolve, reject) => {
// 打开
const loading = Loading.service({
const loading = ElLoading.service({
text: '正在下载数据...',
background: 'rgba(0, 0, 0, 0.7)'
})
@@ -136,18 +115,16 @@ export function download(url, data, fileName) {
}).then(res => {
loading.close()
// 文件下载
const blob = new Blob([res.data], {
type: 'application/vnd.ms-excel'
})
// 获得文件名称
let link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.setAttribute('download', fileName)
link.click()
link = null
Message.success('导出成功!')
ElMessage.success('导出成功!')
}).catch(err => {
loading.close()
reject(err)
@@ -155,12 +132,6 @@ export function download(url, data, fileName) {
})
}
/**
* 封装post请求
* @param url
* @param data
* @returns {Promise}
*/
export function post(url, data = {}) {
return new Promise((resolve, reject) => {
instance.post(url, data)
+18 -16
View File
@@ -1,18 +1,18 @@
<template>
<div>
<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.applyTimeParam" style="width: 200px" placeholder="搜索日期格式yyyyMM"
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>
</template>
<template slot="data-columns">
<template #data-columns>
<el-table-column type="selection" width="55"/>
<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>
</template>
</el-table-column>
@@ -22,7 +22,7 @@
</template>
</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-item label="用户">
<el-select v-model="formData.userId" placeholder="请选择用户" :disabled="flag">
@@ -52,25 +52,27 @@
v-model="formData.applyTime"
type="datetime"
placeholder="选择日期时间"
format="yyyy-MM-dd">
format="YYYY-MM-DD"
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="handleSave"> </el-button>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="handleSave"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script>
import DataTable from '@/components/DataTable'
import {userList} from '@/api/sys/user/user'
import {saveData} from '@/api/apply/apply'
import DataTable from '@/components/DataTable/index.vue'
import {userList} from '@/api/sys/user/user.js'
import {saveData} from '@/api/apply/apply.js'
import {mapGetters} from "vuex";
import {formatDate} from '@/utils/index'
import {dataFormatter} from '@/utils'
import {getSelectOptions} from '@/api/sys/dict/dict'
import {getSelectOptions} from '@/api/sys/dict/dict.js'
export default {
name: 'XmApply',
@@ -140,7 +142,7 @@
dataFormatter,
formatDate,
handleUploadSuccess(response) {
// 上传图片赋值
// 上传图片注释
this.formData.avatar = response.data.url
},

Some files were not shown because too many files have changed in this diff Show More