Commit 3bb03a62 authored by 杨梦雪's avatar 杨梦雪

1

parent a9dca568
Pipeline #124 failed with stages
> 1%
last 2 versions
not dead
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
module.exports = {
root: true,
env: {
node: true
},
extends: [
'plugin:vue/essential',
'@vue/standard'
],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# campSite
#### Description
营地
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
# campSite
#### 介绍
营地
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
This diff is collapsed.
{
"name": "camp_site",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "eslint --fix --ext .js,.vue src"
},
"dependencies": {
"axios": "^0.21.4",
"core-js": "^3.6.5",
"element-ui": "^2.15.6",
"node-sass": "^6.0.1",
"sass": "^1.42.1",
"vue": "^2.6.11",
"vue-router": "^3.5.1",
"vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "^3.1.1",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "^4.5.13",
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^6.2.2",
"sass-loader": "^7.3.1",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.0.0"
}
}
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
<template>
<div id="app">
<router-view/>
</div>
</template>
<style scoped lang="scss">
// @import "~a/css/base.css";
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
position: relative;
height: 100%;
background: #fff;
}
</style>
::v-deep .el-breadcrumb {
height: 20px;
margin: 14px 0 20px;
.el-breadcrumb__item {
.el-breadcrumb__inner,
.el-breadcrumb__separator {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 20px;
}
&:last-child .el-breadcrumb__inner {
color: #563279 !important;
}
}
}
\ No newline at end of file
// 验证用户名
export function dottom(username) {
const myReg = /^([1-9]+[0-9]*)|((([1-9]+[0-9]*)|[0]).[0-9]{1,2})|[0]$/;
return myReg.test(username);
}
// 验证用户名
export function userNameCheck(username) {
const myReg = /^(?=.*[a-zA-Z])\w{4,20}$/i;
return myReg.test(username);
}
// 验证手机号码
export function mobileCheck(phone) {
const myReg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
return myReg.test(phone);
}
// 验证身份证
export function sfzNumCheck(sfzNum) {
const myReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X)$)/;
return myReg.test(sfzNum);
}
// 验证邮箱
export function mailCheck(mail) {
// const myReg = /^([a-zA-Z\d\w\-\.])+@[\w\-]+(\.[a-zA-Z]{2,4})+$/;
const myReg = /^([a-zA-Z\d])(\w|\-)+(\.\w+)*@[a-zA-Z\d-]+(\.[a-zA-Z]{2,4})+$/;
// const myReg = /^([a-zA-Z\d])(\w|\-)+@[a-zA-Z\d-]+(\.[a-zA-Z]{2,4})+$/;
return myReg.test(mail);
}
// 密码
export function checkStrong(sValue) {
var modes = 0;
if (sValue.length < 6) return modes;
if (/\d/.test(sValue)) modes++;
if (/[a-z]/.test(sValue)) modes++;
if (/[A-Z]/.test(sValue)) modes++;
if (/\W/.test(sValue)) modes++;
switch (modes) {
case 1:
return 1;
break;
case 2:
return 2;
break;
case 3:
case 4:
return sValue.length < 4 ? 2 : 3;
break;
}
return modes;
}
export function getDate(fmt, dt = new Date()) {
let o = {
"M+": dt.getMonth() + 1, //月份
"d+": dt.getDate(), //日
"h+": dt.getHours(), //小时
"m+": dt.getMinutes(), //分
"s+": dt.getSeconds(), //秒
"q+": Math.floor((dt.getMonth() + 3) / 3), //季度
S: dt.getMilliseconds(), //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(
RegExp.$1,
(dt.getFullYear() + "").substr(4 - RegExp.$1.length)
);
for (let k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
);
return fmt;
}
// 获取两个日期相差的好描述
export function timeSpan(d1, d2) {
let dateBegin = new Date(d1.replace(/-/g, "/")); //将-转化为/,使用new Date
let dateEnd = new Date(d2.replace(/-/g, "/")); //将-转化为/,使用new Date
let dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
return Math.round(dateDiff / 1000);
}
<template>
<div class="steps flex">
<!-- 1 -->
<div class="step flex">
<div class="cricle">
<span class="num">1</span>
</div>
<div class="step_title">确认报名须知</div>
<div>
<img src="../assets/img/signUp/left.png" alt="" />
</div>
</div>
<!-- 2 -->
<div class="step flex">
<div class="cricle cc">
<span class="num">2</span>
</div>
<div class="step_title">填写邀请码</div>
<img src="../assets/img/signUp/left.png" alt="" />
</div>
<!-- 3 -->
<div class="step flex">
<div class="cricle cc">
<span class="num">3</span>
</div>
<div class="step_title">填写报名资料</div>
<img src="../assets/img/signUp/left.png" alt="" />
</div>
<!-- 4 -->
<div class="step flex">
<div class="cricle cc">
<span class="num">4</span>
</div>
<div class="step_title">报名资料审核</div>
<img src="../assets/img/signUp/left.png" alt="" />
</div>
<!-- 5 -->
<div class="step flex">
<div class="cricle cc">
<span class="num">5</span>
</div>
<div class="step_title">缴费</div>
</div>
</div>
</template>
<script>
export default {};
</script>
<style scoped lang="scss">
.flex {
display: flex;
}
.steps {
.step {
}
.num {
color: #ffff;
position: absolute;
z-index: 999;
top: 7px;
left: 10px;
}
.cricle {
position: relative;
width: 57px;
height: 29px;
background: #60194a;
border-radius: 41px;
margin-right: 10px;
}
img {
margin: 15px;
}
.step_title {
font-size: 14px;
width: 100%;
height: 20px;
font-weight: 600;
color: #60194a;
line-height: 34px;
}
}
</style>
\ No newline at end of file
<template>
<!--底部-->
<div class="footer">
<div class="content flex">
<div class="cc flex">
<div class="info">
<span> 客服邮箱:service@thussat.com </span>
<span> 联系电话 0551-12345678 </span>
<span> 工作时间 周一至周五 09:00 - 12:00, 14:00 - 18:00 </span>
</div>
<div class="line"></div>
<div class="copyRight">
<a href="">Copyright © 2021 营地系统 版权所有</a>
<a target="_blank" href="https://beian.miit.gov.cn"
>京ICP备19058825号-3</a
><a
target="_blank"
href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802034612"
>
京公网安备 11010802034612号</a
>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Footer",
};
</script>
<style lang="scss" scoped>
.flex {
display: flex;
}
.footer {
font-family: PingFangSC-Medium, PingFang SC;
font-size: 14px;
height: 170px;
background: #000000;
opacity: 0.9;
line-height: 60px;
// text-align: center;
border-top: 1px solid #ccc;
.content {
justify-content: center;
.cc {
width: 100%;
justify-content: space-around;
align-items: center;
flex-direction: column;
}
}
.info {
font-weight: 500;
color: #ffffff;
line-height: 14px;
margin-top: 35px;
}
.line {
width: 1160px;
height: 1px;
background: #ffffff;
opacity: 0.2;
margin-top: 50px;
}
a {
font-weight: 400;
margin-right: 20px;
color: #333333;
text-decoration: none;
img {
width: 15px;
margin-top: -3px;
}
&:hover {
text-decoration: underline;
}
}
}
</style>
<template>
<div class="Header">
<div class="H_content flex">
<div class="cc flex">
<div class="image">
<img src="../../assets/img/南开logo@2x.png" alt="" />
</div>
<div class="right">
<span @click="toLogin">登录</span>
<span @click="toRegister">注册</span>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Header",
data() {
return {};
},
methods: {
toLogin() {
this.$router.replace({ name: "index-login" });
},
toRegister() {
this.$router.replace({ name: "index-register" });
},
},
};
</script>
<style lang="scss" scoped>
.flex {
display: flex;
}
.Header {
font-family: PingFangSC-Medium, PingFang SC;
height: 80px;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.12);
.H_content {
justify-content: center;
.cc {
width: 100%;
justify-content: space-around;
align-items: center;
div {
flex-direction: column;
}
}
}
.image img {
width: 318px;
height: 62px;
}
.right {
span {
font-size: 15px;
font-weight: 500;
color: #666666;
line-height: 21px;
}
:last-child {
font-weight: 500;
color: #60194a;
line-height: 21px;
padding: 10px 36px;
border-radius: 4px;
border: 2px solid #60194a;
margin-left: 50px;
}
}
}
</style>
<template>
<!--底部-->
<div class="confirm">
<div class="title">2021年南开大学历史学科暑假营报名须知</div>
<p>
南开大学是教育部直属重点综合性大学,是敬爱的周恩来总理的母校。新中国成立以来,学校发展始终得到党和国家的亲切关怀。毛泽东主席题写校名、亲临视察;周恩来总理三回母校指导;邓小平同志会见数学大师陈省身,批示成立南开数学研究所;江泽民同志、胡锦涛同志先后视察南开。特别是党的十八大以来,习近平总书记多次对南开的发展给予肯定,并对相关工作回信和勉励,更在百年校庆之际亲临南开视察。
</p>
<p>
南开大学是教育部直属重点综合性大学,是敬爱的周恩来总理的母校。新中国成立以来,学校发展始终得到党和国家的亲切关怀。毛泽东主席题写校名、亲临视察;周恩来总理三回母校指导;邓小平同志会见数学大师陈省身,批示成立南开数学研究所;江泽民同志、胡锦涛同志先后视察南开。特别是党的十八大以来,习近平总书记多次对南开的发展给予肯定,并对相关工作回信和勉励,更在百年校庆之际亲临南开视察。
</p>
<div class="line"></div>
<p>
南开大学是教育部直属重点综合性大学,是敬爱的周恩来总理的母校。新中国成立以来,学校发展始终得到党和国家的亲切关怀。毛泽东主席题写校名、亲临视察;
</p>
<div>
<img src="../../../assets/img/signUp/computer.png" alt="" />
</div>
<div class="check">
<el-checkbox v-model="checked"
>我已阅读并了解《2021年南开大学历史学科暑假营报名须知》</el-checkbox
>
</div>
<div class="btn">
<el-button @click="next()">下一步</el-button>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Confirm",
};
</script>
<style lang="scss" scoped>
.confirm {
padding: 0 56px 65px 56px;
.line {
border-bottom: 1px solid #d4d0d4;
}
.title {
font-size: 20px;
font-weight: 600;
color: #1b1419;
line-height: 20px;
text-align: center;
margin: 0 0 24px 0;
}
p {
font-size: 14px;
font-weight: 400;
color: #1b1419;
line-height: 28px;
}
.check {
text-align: center;
margin-top: 42px;
}
.btn {
text-align: center;
}
.el-button {
width: 200px;
height: 50px;
background: #60194a;
border-radius: 4px;
opacity: 0.8;
line-height: 50px;
text-align: center;
color: #fff;
font-size: 16px;
padding: 0;
margin: 30px 0 0 0;
}
}
</style>
<template>
<!--底部-->
<div class="invitation">
<div class="iv_content flex">
<div class="flex">
<div class="code_titile">邀请码</div>
</div>
<div>
<div class="code flex">
<el-input v-model="input"></el-input>
<el-input v-model="input"></el-input>
<el-input v-model="input"></el-input>
<el-input v-model="input"></el-input>
</div>
<div class="errorCode">该邀请码无效,请输入正确的邀请码。</div>
</div>
</div>
<div class="tips">
备注:每个邀请码只能绑定一个用户,请谨慎使用。无邀请码可直接点【下一步】
</div>
<div class="btn">
<el-button @click="next()">下一步</el-button>
</div>
</div>
</template>
<script>
export default {
name: "Invitation",
};
</script>
<style lang="scss" scoped>
.flex {
display: flex;
}
.invitation {
.iv_content {
justify-content: center;
height: 44px;
::v-deep .el-input__inner {
width: 110px;
height: 38px;
border-radius: 4px;
border: 2px solid #60194a;
margin-right: 15px;
}
.code_titile {
height: 16px;
font-size: 16px;
font-weight: 600;
color: #1b1419;
line-height: 48px;
margin-right: 10px;
}
.errorCode {
margin-top: 10px;
}
}
.tips {
font-size: 14px;
font-weight: 500;
color: #a7a2a6;
line-height: 54px;
margin: 30px 0;
text-align: center;
}
.errorCode {
font-size: 12px;
font-weight: 400;
color: #d7373f;
line-height: 12px;
}
.btn {
text-align: center;
padding-bottom: 224px;
}
.el-button {
width: 200px;
height: 50px;
background: #60194a;
border-radius: 4px;
opacity: 0.8;
line-height: 50px;
text-align: center;
color: #fff;
font-size: 16px;
padding: 0;
margin: 30px 0 0 0;
}
}
</style>
<template>
<div class="pass">
<div class="p_content">
<div>
<img src="@/assets/img/signUp/icon-shenhe.png" alt="" />
</div>
<div>同学你好,你的报名资料已提交</div>
<div>
请等待工作人员审核,审核结果将于1-3个工作日发布,请留意网站及短信
</div>
</div>
</div>
</template>
<script>
export default {
name: "Pass",
};
</script>
<style lang="scss" scoped>
.pass {
padding: 0 56px 65px 56px;
.p_content {
div {
text-align: center;
font-size: 16px;
font-weight: 500;
color: #666666;
line-height: 18px;
}
:nth-child(2) {
margin: 24px 0;
}
:nth-child(3) {
margin: 0 0 216px 0;
}
}
}
</style>
<template>
<div class="paying">
<div>
<span class="pay_titile">报名信息</span>
<div class="pay_top">
<div>营地名称:2021年南开大学历史学科暑假营</div>
<div>真实姓名:林柒月</div>
<div>身份证号:340828199612053920</div>
<div>缴费时间:2021-8-19 10:00 - 2021-8-31 24:00</div>
<div>报名费用: 1500元</div>
</div>
<div class="line"></div>
<div class="pay-money flex">
<div>报名费用 :<span>¥1500 </span></div>
<div class="btn">
<el-button @click="paying()">立即支付 </el-button>
</div>
</div>
<div class="pay_bottom">
<div>注意事项:</div>
<div>
1、考生支付完成后请不要立即关闭浏览器,等待支付完成返回本页面,以确认支付完成:
</div>
<div>
2、支付确认后,将不能再修改姓名和身份证号,请在支付前核对信息;
</div>
<div>
3、如果在完成支付后,状态许久未更新为“报名成功”,请仔细核查自己支付账号是否已扣费
;:
</div>
<div>
4、对于多次缴费的考生,除生效一笔之外其他重复支付的得用会在缴费结束阶段统一退款;
</div>
<div>5、网上缴费如有问题,请致电项目组工作人员:XXX-XXXXXXXXX</div>
</div>
</div>
<!-- 支付扫码框 -->
<el-dialog title="微信支付" :visible.sync="dialogVisible" width="20%">
<div class="pay_code">
<div class="pay_time">支付剩余时间<span>15分30秒</span></div>
<div>¥150</div>
<div class="pay_img">
<img src="" alt="" />
</div>
<div>请使用<span>微信</span>扫一扫,扫描二维码支付</div>
<div>手机完成支付后,请等待系统处理,在此之前请勿关闭窗口</div>
</div>
<span slot="footer" class="dialog-footer">
<div class="btn">
<el-button @click="dialogVisible = false">刷新二维码</el-button>
</div>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
name: "Paying",
data() {
return {
dialogVisible: false,
};
},
methods: {
paying() {
this.dialogVisible = true;
},
},
};
</script>
<style lang="scss" scoped>
.flex {
display: flex;
}
.paying {
padding: 0 56px 65px 56px;
.pay_titile {
font-size: 18px;
font-weight: 500;
color: #12141c;
line-height: 18px;
}
.pay_top {
margin: 24px 0;
div {
font-size: 14px;
font-weight: 500;
color: #12141c;
line-height: 32px;
}
}
.line {
height: 1px;
border-bottom: 1px solid #d1d1d1;
}
.pay-money {
font-size: 18px;
font-weight: 500;
color: #12141c;
line-height: 24px;
justify-content: space-between;
margin: 43px 0 110px 0;
span {
color: #60194a;
}
}
.pay_bottom {
font-size: 12px;
font-weight: 500;
color: #999999;
line-height: 21px;
}
.btn {
text-align: center;
// padding-bottom: 224px;
}
.el-button {
width: 200px;
height: 50px;
background: #60194a;
border-radius: 4px;
opacity: 0.8;
line-height: 50px;
text-align: center;
color: #fff;
font-size: 16px;
padding: 0;
// margin: 30px 0 0 0;
}
}
.pay_code {
text-align: center;
:nth-child(1) {
font-size: 14px;
font-weight: 500;
color: #12141c;
line-height: 14px;
span {
font-size: 13px !important;
color: #60194a;
}
}
:nth-child(2) {
font-size: 14px;
font-weight: 500;
color: #60194a;
line-height: 24px;
}
:nth-child(4) {
font-size: 14px;
font-weight: 500;
color: #333333;
line-height: 16px;
span {
font-size: 17px !important;
color: #60194a;
}
}
:nth-child(5) {
font-size: 12px;
font-weight: 500;
color: #666666;
line-height: 12px;
}
}
</style>
This diff is collapsed.
import Vue from 'vue';
import {
Avatar,
Pagination,
Dialog,
Autocomplete,
Dropdown,
DropdownMenu,
DropdownItem,
Menu,
Submenu,
MenuItem,
MenuItemGroup,
Input,
InputNumber,
Radio,
RadioGroup,
RadioButton,
Checkbox,
CheckboxButton,
CheckboxGroup,
Switch,
Select,
Option,
OptionGroup,
Button,
ButtonGroup,
Table,
TableColumn,
DatePicker,
TimeSelect,
TimePicker,
Popover,
Tooltip,
Breadcrumb,
BreadcrumbItem,
Form,
FormItem,
Tabs,
TabPane,
Tag,
Tree,
Alert,
Slider,
Icon,
Row,
Col,
Upload,
Progress,
Spinner,
Badge,
Card,
Rate,
Steps,
Step,
Carousel,
CarouselItem,
Collapse,
CollapseItem,
Cascader,
ColorPicker,
Transfer,
Container,
Header,
Aside,
Main,
Footer,
Timeline,
TimelineItem,
Link,
Divider,
Image,
Calendar,
Backtop,
PageHeader,
CascaderPanel,
Loading,
MessageBox,
Message,
Notification,
Drawer,
} from 'element-ui';
import infiniteScroll from "vue-infinite-scroll";
import 'element-ui/lib/theme-chalk/index.css';
import 'a/scss/index.scss'
Vue.use(infiniteScroll);
Vue.use(Avatar);
Vue.use(Pagination);
Vue.use(Dialog);
Vue.use(Autocomplete);
Vue.use(Dropdown);
Vue.use(DropdownMenu);
Vue.use(DropdownItem);
Vue.use(Menu);
Vue.use(Submenu);
Vue.use(MenuItem);
Vue.use(MenuItemGroup);
Vue.use(Input);
Vue.use(InputNumber);
Vue.use(Radio);
Vue.use(RadioGroup);
Vue.use(RadioButton);
Vue.use(Checkbox);
Vue.use(CheckboxButton);
Vue.use(CheckboxGroup);
Vue.use(Switch);
Vue.use(Select);
Vue.use(Option);
Vue.use(OptionGroup);
Vue.use(Button);
Vue.use(ButtonGroup);
Vue.use(Table);
Vue.use(TableColumn);
Vue.use(DatePicker);
Vue.use(TimeSelect);
Vue.use(TimePicker);
Vue.use(Popover);
Vue.use(Tooltip);
Vue.use(Breadcrumb);
Vue.use(BreadcrumbItem);
Vue.use(Form);
Vue.use(FormItem);
Vue.use(Tabs);
Vue.use(TabPane);
Vue.use(Tag);
Vue.use(Tree);
Vue.use(Alert);
Vue.use(Slider);
Vue.use(Icon);
Vue.use(Row);
Vue.use(Col);
Vue.use(Upload);
Vue.use(Progress);
Vue.use(Spinner);
Vue.use(Badge);
Vue.use(Card);
Vue.use(Rate);
Vue.use(Steps);
Vue.use(Step);
Vue.use(Carousel);
Vue.use(CarouselItem);
Vue.use(Collapse);
Vue.use(CollapseItem);
Vue.use(Cascader);
Vue.use(ColorPicker);
Vue.use(Transfer);
Vue.use(Container);
Vue.use(Header);
Vue.use(Aside);
Vue.use(Main);
Vue.use(Footer);
Vue.use(Timeline);
Vue.use(TimelineItem);
Vue.use(Link);
Vue.use(Divider);
Vue.use(Image);
Vue.use(Calendar);
Vue.use(Backtop);
Vue.use(PageHeader);
Vue.use(CascaderPanel);
Vue.use(Loading.directive);
Vue.use(Drawer)
Vue.prototype.$loading = Loading.service;
Vue.prototype.$msgbox = MessageBox;
Vue.prototype.$alert = MessageBox.alert;
Vue.prototype.$confirm = MessageBox.confirm;
Vue.prototype.$prompt = MessageBox.prompt;
Vue.prototype.$notify = Notification;
Vue.prototype.$message = Message;
// export const SERVER_URL = "https://ysslapi.thussat.cn"; // 测试环境
// export const DEVELOPMENT_SERVER_URL = "https://ysslapi.thussat.cn"; //开发环境
// export const SERVER_WS_URL = "wss://ysslapi.thussat.cn"; // websocket
// export const SERVER_URL = "http://123.56.237.167:20202"; // 测试环境
// export const DEVELOPMENT_SERVER_URL = "http://123.56.237.167:20202"; //测试环境
// export const SERVER_WS_URL = "wss://123.56.237.167:20202"; // websocket
// 官网
export const SERVER_URL = 'https://api1.testgate.cn' // 正式环境
export const DEVELOPMENT_SERVER_URL = 'https://api1.testgate.cn' // 开发环境
export const SERVER_WS_URL = 'wss://api.thussat.com' // websocket
// 剑桥官网
// export const SERVER_URL = "https://api.testgate.cn"; // 正式环境
// export const DEVELOPMENT_SERVER_URL = "https://api.testgate.cn"; //开发环境
// export const SERVER_WS_URL = "wss://api.testgate.cn"; // websocket
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false
Vue.use(ElementUI)
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
import {
request
} from './network'
// 登录
export function login(data) {
return request({
method: 'post',
url: '/web/auth/login',
data
})
}
// 注册获取验证码
export function logout(data) {
return request({
method: 'post',
url: '/web/auth/loginOut',
data
})
}
// 修改密码
export function changePass(data) {
return request({
method: 'post',
url: '/web/auth/changePass',
data
})
}
// 找回密码
export function sendPassMsg(data) {
return request({
method: 'post',
url: '/web/auth/sendPassMsg',
data
})
}
import axios from 'axios'
import store from '@/store'
import {
SERVER_URL,
DEVELOPMENT_SERVER_URL
} from '@/config/server'
import {
Notification,
Message,
Loading
} from 'element-ui'
import router from '@/router'
// 正在进行中的请求列表
const reqList = []
/**
* 阻止重复请求
* @param {array} reqList - 请求缓存列表
* @param {string} url - 当前请求地址
* @param {function} cancel - 请求中断函数
* @param {string} errorMessage - 请求中断时需要显示的错误信息
*/
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
const errorMsg = errorMessage || ''
for (let i = 0; i < reqList.length; i++) {
if (reqList[i] === url) {
// cancel(errorMsg);
return
}
}
reqList.push(url)
}
/**
* 允许某个请求可以继续进行
* @param {array} reqList 全部请求列表
* @param {string} url 请求地址
*/
const allowRequest = function (reqList, url) {
for (let i = 0; i < reqList.length; i++) {
if (reqList[i] === url) {
reqList.splice(i, 1)
break
}
}
}
let loadingInstance = null
export function request (config) {
const instance = axios.create({
baseURL: process.env.NODE_ENV === 'development'
? DEVELOPMENT_SERVER_URL
: SERVER_URL,
timeout: 60 * 1000
})
instance.interceptors.request.use(
(config) => {
const loginUrl = '/web/auth/login'
const setAccountInfo = '/web/register/setAccountInfo'
const checkIdCard = '/web/auth/checkIdCard'
const passMsg = '/web/auth/sendPassMsg'
const loginOut = '/web/auth/loginOut'
console.log(config.url)
if (
config.url == loginUrl ||
config.url == passMsg ||
config.url == setAccountInfo ||
config.url == checkIdCard
) {
return config
}
const token = localStorage.getItem('index-token')
if (token) {
const thatToken = store.state.token
if (thatToken != token && config.url != loginOut) {
// window.location.reload();
store.state.showDialog = true
store.state.dialogType = 0
const error = new Error('登录账号有问题!')
return Promise.reject(error)
}
config.headers.token = token
} else {
window.localStorage.clear()
router.push({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
} // 从哪个页面跳转
})
const error = new Error('请登录!')
return Promise.reject(error)
}
let cancel
// 设置cancelToken对象
config.cancelToken = new axios.CancelToken(function (c) {
cancel = c
})
if (
config.url.indexOf('/web/config/getUniversity') == -1 &&
config.url.indexOf('/web/config/getProfession') == -1
) {
// 阻止重复请求。当上个请求未完成时,相同的请求不会进行
stopRepeatRequest(
reqList,
config.url,
cancel,
`${config.url} 请求被中断`
)
}
if (config.hasLoading) {
const loadingText = config.loadingText ? config.loadingText : '请求中'
loadingInstance = Loading.service({
lock: true,
fullscreen: true,
text: loadingText,
// spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.25)'
})
}
return config
},
(error) => {
return Promise.reject(error)
}
)
instance.interceptors.response.use(
(res) => {
if (res.data.code == 400003) {
window.localStorage.clear()
router.push({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
} // 从哪个页面跳转
})
} else if (
res.data.code == 400801 ||
res.data.code == 400910 ||
res.data.code == 4002132 ||
res.data.code == 400410 ||
res.data.code == 401001
) {
store.state.showDialog = true
store.state.dialogType = 1
}
loadingInstance && loadingInstance.close()
setTimeout(() => {
allowRequest(reqList, res.config.url)
}, 1000)
return res
},
(error) => {
Message.closeAll()
// if (error.response.status === 401) {
// // 未登录
// Notification({
// message: "身份验证失败,请登录",
// duration: 1500,
// onClose() {
// console.log('error');
// router.push("/admin/login");
// },
// });
// return false;
// }
if (axios.isCancel(error)) {
console.log(error.message)
} else {
// 增加延迟,相同请求不得在短时间内重复发送
setTimeout(() => {
allowRequest(reqList, error.config.url)
}, 1000)
}
loadingInstance && loadingInstance.close()
return Promise.reject(error)
}
)
return instance(config)
}
// 合并多个请求
export function allRequest (arrRequest) {
return axios.all(arrRequest)
}
import Vue from 'vue'
import VueRouter from 'vue-router'
// import store from '@/store'
import indexLogin from './index/login'
import indexCamp from './index/camp'
Vue.use(VueRouter)
const routes = [{
path: '/',
meta: {
title: '招生简章'
},
component: () =>
import('v/index/recruit/Index.vue')
},
{
path: '/login',
name: 'loginIndex',
meta: {
title: '登录'
},
component: () =>
import('v/index/login/Index.vue'),
children: [...indexLogin]
},
{
path: '/cerificate',
name: 'cerificateIndex',
meta: {
title: '营地报名'
},
redirect: '/cerificate/signUp',
component: () =>
import('v/index/camp/Index.vue'),
children: [...indexCamp]
}
]
// const originalPush = VueRouter.prototype.push
// VueRouter.prototype.push = function push (location) {
// return originalPush.call(this, location).catch(err => err)
// }
const router = new VueRouter({
// mode: 'history',
// base: process.env.BASE_URL,
routes
})
// router.beforeEach((to, from, next) => {
// // 记录上一页
// if (from) {
// store.commit('setPrePage', from.path)
// }
// // 1.修改页面标题
// document.title = to.meta.title
// let token = localStorage.getItem(tokenKey)
// if (to.meta.authorization && to.meta.authorization === true) {
// store.commit('setPrePage', to.path)
// // 2.1.获取登录信息
// if (token == null) {
// // 2.1.1.未登录,跳转到登录页面
// router.push({
// path: toLogin
// })
// } else {
// next()
// // authInfo = JSON.parse(authInfo);
// // // 2.1.2.判断token是否过期
// // let dt = new Date(authInfo.dt);
// // let overDt = new Date(dt.getTime() + authInfo.data.expires_in * 1000);
// // if (overDt >= new Date()) {
// // // 2.1.2.1未过期
// // next();
// // } else {
// // // 2.1.2.2过期,刷新token
// // next();
// // }
// }
// } else {
// if (token) {
// router.push({
// path: toPage
// })
// } else {
// next()
// }
// }
// })
export default router
export default [{
path: 'signUp',
name: 'index-signUp',
component: () => import(/* webpackChunkName: "login" */ 'v/index/camp/SignUp.vue'),
meta: {
title: '营地报名'
}
},
{
path: 'homework',
name: 'index-homework',
component: () => import(/* webpackChunkName: "reset" */ 'v/index/camp/Homework.vue'),
meta: {
title: '营地作业'
}
},
{
path: 'certificate',
name: 'index-certificate',
component: () => import(/* webpackChunkName: "reset" */ 'v/index/camp/Certificate.vue'),
meta: {
title: '营地证书'
}
}
]
export default [{
path: '/',
name: 'index-login',
component: () => import(/* webpackChunkName: "login" */ 'v/index/login/Login.vue'),
meta: {
title: '登录'
}
},
{
path: 'register',
name: 'index-register',
component: () => import(/* webpackChunkName: "reset" */ 'v/index/login/Register.vue'),
meta: {
title: '新用户注册'
}
},
{
path: 'reset',
name: 'index-reset',
component: () => import(/* webpackChunkName: "reset" */ 'v/index/login/Reset.vue'),
meta: {
title: '重置密码'
}
}
]
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})
<template>
<el-container>
<el-header height="auto"><Header></Header></el-header>
<el-container>
<div>
<router-view></router-view>
<Footer></Footer>
</div>
</el-container>
</el-container>
</template>
<script>
import Header from '../../components/index/Header'
import Footer from '../../components/index/Footer'
export default {
name: 'index-index',
components: {
Header,
Footer
}
}
</script>
<style lang="scss">
.flex {
display: flex;
}
body {
background-color: #f5f5f5;
}
.el-container {
width: 100%;
height: 100%;
overflow: hidden;
min-width: 1024px;
box-sizing: border-box;
background-color: #f5f5f5;
.el-header {
padding: 0;
}
.el-container {
width: 100%;
> div {
width: 100%;
overflow: auto;
}
}
}
</style>
<template>
<div class="camp-index">
<Header> </Header>
<div class="content flex">
<div class="cc flex">
<div class="camp_left">
<ul class="camp_left_box">
<li @click="ToSignUp" :class="activeMenu == 0 ? 'active' : ''">
<img src="@/assets/img/signUp/icon-bm.png" />营地报名
</li>
<li @click="ToHomework">
<img src="@/assets/img/signUp/icon-zs.png" />营地作业
</li>
<li @click="ToCertificate">
<img src="@/assets/img/signUp/icon-zy.png" />营地证书
</li>
</ul>
</div>
<div class="camp_right">
<router-view />
</div>
</div>
</div>
<Footer> </Footer>
</div>
</template>
<script>
import Header from "@/components/index/Header.vue";
import Footer from "@/components/index/Footer.vue";
export default {
name: "campIndex",
components: {
Header,
Footer,
},
data() {
return {};
},
methods: {
ToSignUp() {
this.$router.replace({ name: "index-signUp" });
},
ToHomework() {
this.$router.replace({ name: "index-homework" });
},
ToCertificate() {
this.$router.replace({ name: "index-certificate" });
},
},
};
</script>
<style lang="scss" scoped>
.camp-index {
background: #f8f8f8;
.content {
justify-content: center;
.cc {
width: 60%;
justify-content: space-around;
// align-items: center;
}
}
.tab {
width: 280px;
height: 320px;
background: #ffffff;
position: relative;
top: 0;
// position: relative;
// top: -544px;
li {
height: 52px;
background: #f8f8f8;
}
}
.camp_left {
position: relative;
width: 24%;
max-width: 280px;
min-width: 240px;
/*height: 340px;*/
border-radius: 8px;
margin-right: 30px;
.camp_left_box {
max-width: 280px;
min-width: 240px;
height: 300px;
background-color: #ffffff;
border-radius: 8px;
padding: 20px 0;
&.is-fixed {
position: fixed;
top: 92px;
width: 24%;
max-width: 280px;
min-width: 240px;
}
&.is-absolute {
position: absolute;
bottom: 0;
width: 100%;
}
li {
position: relative;
padding: 0 23px;
height: 44px;
line-height: 44px;
margin: 10px 0;
font-size: 15px;
list-style: none;
img {
vertical-align: middle;
margin: -3px 8px 0 0;
width: 20px;
}
&.active,
&:hover {
cursor: pointer;
background-color: #f5f5f5;
border-right: 4px solid #3c0664;
}
}
}
}
}
</style>
<template>
<div class="signUp">
<div class="content">
<div class="signUp_titile">营地报名</div>
<div>
<Breadcrumb> </Breadcrumb>
</div>
</div>
<!-- <Confirm> </Confirm> -->
<!-- <Invitation> </Invitation> -->
<!-- <ReferInfo> </ReferInfo> -->
<!-- <Pass> </Pass> -->
<Paying> </Paying>
</div>
</template>
<script>
import Breadcrumb from "c/breadcrumb";
import Confirm from "c/index/SignUp/confirm";
import Invitation from "c/index/SignUp/invitation";
import ReferInfo from "c/index/SignUp/referInfo";
import Pass from "c/index/SignUp/pass";
import Paying from "c/index/SignUp/paying";
export default {
name: "signUp",
components: {
Breadcrumb,
Confirm,
Invitation,
ReferInfo,
Pass,
Paying,
},
data() {
return {};
},
};
</script>
<style lang="scss" >
.flex {
display: flex;
}
.signUp {
background: #ffffff;
width: 856px;
.signUp_titile {
font-size: 24px;
font-weight: 500;
color: #1b1419;
line-height: 24px;
margin-bottom: 40px;
}
.content {
padding: 50px;
}
}
</style>
<template>
<div class="login-index">
<div class="ConDivContent_bg">
<router-view />
</div>
</div>
</template>
<script>
import { login } from 'r/index/login.js'
// import DialogBox from "c/index/register/DialogBox";
export default {
name: 'loginIndex',
data () {
return {
isShowPwd: true, // 控制密码显示隐藏
loginForm: {
username: '',
password: ''
},
// 表单验证规则对象
loginFormRules: {
// 对用户名进行校验
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 4, max: 20, message: '请输入正确的用户名', trigger: 'blur' }
],
// 对密码进行校验
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, max: 20, message: '请输入正确的密码', trigger: 'blur' }
]
},
dialogFormFu: {
title: '',
message: ''
},
dialogVisibleFu: false
}
},
created () {
this.$emit('getStatus', false)
},
methods: {
// 忘记账号/密码
forgetPwd () {
window.localStorage.setItem('f_forgetpwd', 0)
this.$router.replace({ name: 'foundback' })
},
// 子组件触发,关闭弹框
closeDialog (value, type) {
this.dialogVisibleFu = value
if (type) {
this.$router.replace({ name: 'StepOne' })
}
},
// 去注册
register () {
this.dialogFormFu = {
title: '提示',
message: 1
}
this.dialogVisibleFu = true
// this.$router.replace({ name: "StepOne" });
},
// 改变密码显示状态
changePwdStatus () {
this.isShowPwd = !this.isShowPwd
},
// 表单验证
submitForm () {
this.$refs.loginFormRef.validate(async (valid) => {
// 验证用户名和密码是否符合规定
if (!valid) return
// 发送请求的操作
const { data: res } = await login(this.loginForm)
console.log(res, '返回用户注册数据')
// 根据返回的状态码做想关的判断
if (res.code !== 200) {
return this.$message.error(res.message)
}
// 判断用户注册是否填写信息完整
const applicationstatus = parseInt(res.applicationstatus)
const can_skip = parseInt(res.can_skip)
window.localStorage.setItem('applicationstatus', res.applicationstatus)
window.localStorage.setItem('can_skip', res.can_skip)
window.localStorage.setItem('is_check_id_card', res.is_check_id_card)
console.log(!can_skip)
if (!can_skip) {
if (applicationstatus == 0) {
window.localStorage.setItem('sfzNum', res.sfzNum)
this.$router.replace({
name: 'StepOne',
query: { applicationstatus: '0', data: res }
})
return
} else if (
applicationstatus == 3 ||
applicationstatus == 4 ||
applicationstatus == 5 ||
applicationstatus == 6
) {
window.localStorage.setItem('index-token', res.token)
this.$store.state.token = res.token
window.localStorage.setItem('student_id', res.student_id)
window.localStorage.setItem('sfzNum', res.sfzNum)
window.localStorage.setItem('username', res.username)
if (res.is_check_id_card != 1) {
this.$router.replace({ name: 'StepTwo' })
} else {
this.$router.replace({ name: 'StepThree' })
}
return
}
}
this.$store.state.token = res.token
window.localStorage.setItem('index-token', res.token)
window.localStorage.setItem('student_id', res.student_id)
window.localStorage.setItem('sfzNum', res.sfzNum)
window.localStorage.setItem('username', res.username)
this.$router.replace({ name: 'examlist' })
})
}
}
// components: {
// DialogBox,
// },
}
</script>
<style scoped lang="scss">
.login-index {
// height: 1080px;
background: #F8F8F8;
.ConDivContent_bg {
height: 1080px;
background: url("../../../assets/img/login/left@2x.png") no-repeat center
center;
background-size: 100% 100%;
// position: relative;
width: 30%;
}
// @media screen and (min-width: 1601px) {
// .ConDivContent_bg {
// height: 650px;
// max-height: 650px;
// }
// }
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div class="recruit">
<div>
<Header></Header>
</div>
<div class="content flex">
<div class="cc flex">
<div class="title">2021年南开大学历史学科暑假营招生简章</div>
<div class="time">发布时间:2021-12-28</div>
<div class="part">
<span>第一部分</span>
<p>
南开大学是教育部直属重点综合性大学,是敬爱的周恩来总理的母校。新中国成立以来,学校发展始终得到党和国家的亲切关怀。毛泽东主席题写校名、亲临视察;周恩来总理三回母校指导;邓小平同志会见数学大师陈省身,批示成立南开数学研究所;江泽民同志、胡锦涛同志先后视察南开。特别是党的十八大以来,习近平总书记多次对南开的发展给予肯定,并对相关工作回信和勉励,更在百年校庆之际亲临南开视察。
</p>
</div>
<div class="part">
<span>第二部分</span>
<p>
南开大学由严修、张伯苓秉承教育救国理念创办,肇始于1904年,成立于1919年。1937年校园遭侵华日军炸毁,学校南迁。1938年与北京大学、清华大学合组西南联合大学,被誉为“学府北辰”。1946年回津复校并改为国立。
</p>
<p>
新中国成立后,经历高等教育院系调整,成为文理并重的全国重点大学。改革开放以来,天津对外贸易学院、中国旅游管理干部学院相继并入,经教育部与天津市共建支持,学校发展成为国家“211工程”和“985工程”重点建设的综合性研究型大学。2015年9月,新校区建成启用后,初步形成了八里台校区、津南校区、泰达学院“一校三区”办学格局。2017年9月,入选国家42所世界一流大学建设高校,且为36所A类高校之一。
</p>
</div>
<div class="paper">
<img src="../../../assets/img/recruit.png" alt="" />
</div>
<div class="part">
<span>第三部分</span>
<p>
南开大学坚持“允公允能,日新月异”的校训,弘扬“爱国、敬业、创新、乐群”的传统和“文以治国、理以强国、商以富国”的理念,以“知中国,服务中国”为宗旨,以杰出校友周恩来为楷模,作育英才,繁荣学术,强国兴邦,传承文明,努力建设世界一流大学。
</p>
<p>
南开大学占地443.12万平方米,其中八里台校区占地121.60万平方米,津南校区占地245.89万平方米,泰达学院占地6.72万平方米。校舍建筑总面积195.19万平方米。按照“独立办学、紧密合作”的原则,与天津大学全面合作办学。
</p>
</div>
</div>
</div>
<div class="btn">
<el-button @click="toLogin()">立即报名 </el-button>
</div>
<div>
<Footer></Footer>
</div>
</div>
</template>
<script>
import Header from "@/components/index/Header.vue";
import Footer from "@/components/index/Footer.vue";
export default {
name: "recruit",
data() {
return {};
},
methods: {
toLogin() {
this.$router.replace({ name: "index-login" });
},
},
components: {
Header,
Footer,
},
};
</script>
<style lang="scss" >
.flex {
display: flex;
}
.recruit {
font-family: PingFangSC-Medium, PingFang SC;
flex-direction: column;
.content {
justify-content: center;
.cc {
width: 60%;
justify-content: space-around;
align-items: center;
flex-direction: column;
}
.title {
margin: 90px 0 20px 0;
font-size: 34px;
text-align: center;
}
.time {
font-size: 12px;
font-weight: 500;
color: #828282;
text-align: center;
}
.paper img {
width: 654px;
height: 368px;
}
.part {
span {
font-size: 16px;
font-weight: 600;
color: #333333;
}
p {
font-size: 16px;
font-weight: 500;
color: #666666;
line-height: 32px;
}
}
}
.btn {
text-align: center;
padding-bottom: 104px;
.el-button {
width: 200px;
height: 50px;
background: #60194a;
border-radius: 4px;
opacity: 0.8;
line-height: 50px;
text-align: center;
color: #fff;
font-size: 16px;
padding: 0;
margin: 30px 0 0 0;
}
}
}
</style>
const path = require('path')
function resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
publicPath: '/',
lintOnSave: false,
chainWebpack: (config) => {
config.resolve.alias
.set('@$', resolve('src'))
.set('a', resolve('src/assets'))
.set('c', resolve('src/components'))
.set('v', resolve('src/views'))
.set('r', resolve('src/request'))
// .set('config', resolve('src/config'))
// .set('common', resolve('src/common'))
// .set('mixins', resolve('src/mixins'))
.set('store', resolve('src/store'))
},
// devServer: {
// host: 'localhost',
// port: 8080, // 端口号
// https: true, // https:{type:Boolean}
// open: true, // 配置自动启动浏览器
// hotOnly: true // 热更新
// // proxy: {
// // "/api": {
// // target: "http://127.0.0.1:8080/",
// // changeOrigin: true,
// // pathRewrite: {
// // "^/api": "",
// // },
// // },
// // },
// },
pluginOptions: {
'style-resources-loader': {
preProcessor: 'scss',
patterns: [path.resolve(__dirname, 'src/assets/scss/index.scss')]
}
},
css: {
sourceMap: false,
loaderOptions: {
// postcss: {
// plugins: [
// require("postcss-px-to-viewport")({
// unitToConvert: "px",
// viewportWidth: 375,
// unitPrecision: 4,
// propList: ["*"],
// viewportUnit: "vw",
// fontViewportUnit: "vw",
// selectorBlackList: [],
// minPixelValue: 2,
// mediaQuery: false,
// replace: true,
// }),
// ],
// },
sass: {
prependData: '@import "./src/assets/scss/index.scss";'
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment