提交Vue客户端

heshiguang 1 year ago
parent d53cced101
commit 572314ae03

@ -0,0 +1,62 @@
<template> <div id="app">
<keep-alive include="UserInfoList,AreaList,LookingForList,LookingForUserList,LostFoundList,LostFoundUserList,ClaimList,PraiseList,NoticeList">
<router-view></router-view>
</keep-alive>
<!-- tab-bar -->
<main-tab-bar class="tab" v-show="this.show"></main-tab-bar>
</div>
</template>
<script>
import MainTabBar from './components/content/mainTabBar/MainTabBar'
export default {
name: 'App',
components: {
MainTabBar
},
data() {
return {
show: true,
path: [ '/home',
'/userInfo/list',
'/area/list',
'/lookingFor/list',
'/lostFound/list',
'/claim/list',
'/praise/list',
'/notice/list',
'/profile'
]
}
},
methods: {
},
watch: {
$route() {
if(this.path.indexOf(this.$route.path) != -1) {
this.show = true
}else {
this.show = false
}
}
},
mounted() {
console.log('Vue App Start ...')
}
}
</script>
<style>
@import './assets/css/base.css';
@import './assets/css/resetVant.css';
#app {
width: 100vw;
}
.tab {
position: fixed;
bottom: 0;
}
</style>

@ -0,0 +1,81 @@
@import "./normalize.css";
:root {
--color-text: #000;
--color-high-text: #ff5777;
--color-tint: #ff8198;
--color-background: #f2f2f2;
--font-size: 14px;
--line-height: 1.5;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
user-select: none;
/* 禁止用户鼠标在页面上选中文字/图片等 */
-webkit-tap-highlight-color: transparent;
/* webkit是苹果浏览器引擎tap点击highlight背景高亮color颜色颜色用数值调节 */
background: var(--color-background);
color: var(--color-text);
width: 100vw;
}
a {
color: var(--color-text);
text-decoration: none;
}
.clear-fix::after {
clear: both;
content: '';
display: block;
width: 0;
height: 0;
visibility: hidden;
}
.clear-fix {
zoom: 1;
}
.arrow-right {
border-top: 1px solid #999;
border-left: 1px solid #999;
width: 9px;
height: 9px;
background-color: transparent;
transform: rotate(135deg);
display: inline-block;
margin-left: .1rem;
}
.left {
float: left;
}
.right {
float: right;
}
@font-face {
font-family: 'icomoon';
src: url('../fonts/icomoon.eot?wum72a');
src: url('../fonts/icomoon.eot?wum72a#iefix') format('embedded-opentype'), url('../fonts/icomoon.ttf?wum72a') format('truetype'), url('../fonts/icomoon.woff?wum72a') format('woff'), url('../fonts/icomoon.svg?wum72a#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
.icon-font {
width: 1em; height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}

@ -0,0 +1,78 @@
.nav {
background-color: #54bf8e;
color: #fff;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.block {
height: 88px;
}
.ignore-pull-down1,
.ignore-pull-down2 {
height: 80px;
width: 100vw;
text-align: center;
position: absolute;
top: -80px;
line-height: 80px;
}
.ignore-pull-down2 {
line-height: 120px;
}
.loading {
width: 60px;
height: 20px;
background-color: pink;
position: absolute;
bottom: 0;
left: 50%;
transform: translate3d(-50%, 0, 0);
display: flex;
}
.ball1,
.ball2,
.ball3 {
width: 10px;
height: 10px;
background-color: #4fc08d;
border-radius: 50%;
position: absolute;
bottom: 10px;
}
.ball1 {
right: calc(50% + 15px);
}
.ball2 {
left: calc(50% - 5px);
}
.ball3 {
left: calc(50% + 15px);
}
.ball1 {
animation: loading 1.2s linear infinite;
}
.ball2 {
animation: loading 1.2s 0.4s linear infinite;
}
.ball3 {
animation: loading 1.2s 0.8s linear infinite;
}
@keyframes loading {
16.667% {
transform: scale(2);
}
33.333% {
transform: scale(1);
}
100% {
transform: scale(1);
}
}

@ -0,0 +1,419 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box;
/* 1 */
height: 0;
/* 1 */
overflow: visible;
/* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace;
/* 1 */
font-size: 1em;
/* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none;
/* 1 */
text-decoration: underline;
/* 2 */
text-decoration: underline dotted;
/* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace;
/* 1 */
font-size: 1em;
/* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-size: 100%;
/* 1 */
line-height: 1.15;
/* 1 */
margin: 0;
/* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input {
/* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select {
/* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box;
/* 1 */
color: inherit;
/* 2 */
display: table;
/* 1 */
max-width: 100%;
/* 1 */
padding: 0;
/* 3 */
white-space: normal;
/* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box;
/* 1 */
padding: 0;
/* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

@ -0,0 +1,16 @@
.van-uploader__preview-image {
width: 98px!important;
height: 98px!important;
}
.van-uploader__preview:nth-child(3),
.van-uploader__preview:nth-child(6),
.van-uploader__preview:nth-child(9){
margin-right: 0!important;
}
.van-uploader__upload {
width: 98px!important;
height: 98px!important;
box-sizing: border-box;
/* border: 1px dashed #888; */
margin-right: 0!important;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

@ -0,0 +1,55 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe900;" glyph-name="compass" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM733.397 594.091c2.816 8.363 3.072 17.835 0 26.965-7.467 22.357-31.616 34.432-53.973 26.965l-271.36-90.453c-12.373-4.181-22.571-13.781-26.965-26.965l-90.453-271.36c-2.816-8.363-3.072-17.835 0-26.965 7.467-22.357 31.616-34.432 53.973-26.965l271.36 90.453c12.373 4.181 22.571 13.781 26.965 26.965zM625.451 540.118l-56.747-170.155-170.155-56.747 56.704 170.155z" />
<glyph unicode="&#xe901;" glyph-name="file-text" d="M750.336 640h-110.336v110.336zM883.499 627.499l-256 256c-3.925 3.925-8.619 7.083-13.824 9.259s-10.795 3.243-16.341 3.243h-341.333c-35.328 0-67.413-14.379-90.496-37.504s-37.504-55.168-37.504-90.496v-682.667c0-35.328 14.379-67.413 37.504-90.496s55.168-37.504 90.496-37.504h512c35.328 0 67.413 14.379 90.496 37.504s37.504 55.168 37.504 90.496v512c0 11.776-4.779 22.443-12.501 30.165zM554.667 810.667v-213.333c0-23.552 19.115-42.667 42.667-42.667h213.333v-469.333c0-11.776-4.736-22.4-12.501-30.165s-18.389-12.501-30.165-12.501h-512c-11.776 0-22.4 4.736-30.165 12.501s-12.501 18.389-12.501 30.165v682.667c0 11.776 4.736 22.4 12.501 30.165s18.389 12.501 30.165 12.501zM682.667 426.667h-341.333c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h341.333c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667zM682.667 256h-341.333c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h341.333c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667zM426.667 597.334h-85.333c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h85.333c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667z" />
<glyph unicode="&#xe902;" glyph-name="home" d="M101.803 588.331c-10.069-7.851-16.469-20.011-16.469-33.664v-469.333c0-35.328 14.379-67.413 37.504-90.496s55.168-37.504 90.496-37.504h597.333c35.328 0 67.413 14.379 90.496 37.504s37.504 55.168 37.504 90.496v469.333c-0.043 12.8-5.717 25.301-16.469 33.664l-384 298.667c-15.275 11.733-36.736 12.16-52.395 0zM682.667 42.667v384c0 23.552-19.115 42.667-42.667 42.667h-256c-23.552 0-42.667-19.115-42.667-42.667v-384h-128c-11.776 0-22.4 4.736-30.165 12.501s-12.501 18.389-12.501 30.165v448.469l341.333 265.472 341.333-265.472v-448.469c0-11.776-4.736-22.4-12.501-30.165s-18.389-12.501-30.165-12.501zM426.667 42.667v341.333h170.667v-341.333z" />
<glyph unicode="&#xe903;" glyph-name="user" d="M896 42.667v85.333c0 58.88-23.936 112.299-62.464 150.869s-91.989 62.464-150.869 62.464h-341.333c-58.88 0-112.299-23.936-150.869-62.464s-62.464-91.989-62.464-150.869v-85.333c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v85.333c0 35.371 14.293 67.285 37.504 90.496s55.125 37.504 90.496 37.504h341.333c35.371 0 67.285-14.293 90.496-37.504s37.504-55.125 37.504-90.496v-85.333c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667zM725.333 640c0 58.88-23.936 112.299-62.464 150.869s-91.989 62.464-150.869 62.464-112.299-23.936-150.869-62.464-62.464-91.989-62.464-150.869 23.936-112.299 62.464-150.869 91.989-62.464 150.869-62.464 112.299 23.936 150.869 62.464 62.464 91.989 62.464 150.869zM640 640c0-35.371-14.293-67.285-37.504-90.496s-55.125-37.504-90.496-37.504-67.285 14.293-90.496 37.504-37.504 55.125-37.504 90.496 14.293 67.285 37.504 90.496 55.125 37.504 90.496 37.504 67.285-14.293 90.496-37.504 37.504-55.125 37.504-90.496z" />
<glyph unicode="&#xe904;" glyph-name="minus-circle" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM341.333 384h341.333c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667h-341.333c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667z" />
<glyph unicode="&#xe905;" glyph-name="plus-circle" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM341.333 384h128v-128c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v128h128c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667h-128v128c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-128h-128c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667z" />
<glyph unicode="&#xe906;" glyph-name="th-menu" d="M810.667 213.334h-597.333c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h597.333c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333zM810.667 512h-597.333c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h597.333c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333zM810.667 810.667h-597.333c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h597.333c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333z" />
<glyph unicode="&#xe907;" glyph-name="th-list" d="M810.667 213.334h-298.667c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h298.667c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333zM810.667 512h-298.667c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h298.667c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333zM810.667 810.667h-298.667c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333h298.667c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333zM320 128c0-58.91-47.756-106.667-106.667-106.667s-106.667 47.756-106.667 106.667c0 58.91 47.756 106.667 106.667 106.667 58.91 0 106.667-47.756 106.667-106.667zM320 426.667c0-58.91-47.756-106.667-106.667-106.667s-106.667 47.756-106.667 106.667c0 58.91 47.756 106.667 106.667 106.667 58.91 0 106.667-47.756 106.667-106.667zM320 725.334c0-58.91-47.756-106.667-106.667-106.667s-106.667 47.756-106.667 106.667c0 58.91 47.756 106.667 106.667 106.667 58.91 0 106.667-47.756 106.667-106.667z" />
<glyph unicode="&#xe908;" glyph-name="arrow-back" d="M512 552.15v109.184c0 10.923-4.181 21.845-12.501 30.208-8.32 8.32-19.243 12.459-30.165 12.459s-21.845-4.139-30.165-12.459l-268.501-264.875 268.501-264.832c8.32-8.32 19.243-12.501 30.165-12.501s21.845 4.181 30.165 12.501 12.501 19.285 12.501 30.165v106.197c117.333-2.901 245.547-24.149 341.333-170.197v42.667c0 197.675-149.333 360.235-341.333 381.483z" />
<glyph unicode="&#xe909;" glyph-name="pencil" d="M896 645.163l-165.504 165.504c-12.501 12.501-28.928 18.731-45.269 18.731-16.384 0-32.725-6.229-45.227-18.731l-466.731-466.731c-12.501-12.501-23.808-31.019-32-50.688-8.192-19.755-13.269-40.917-13.269-58.581v-192h192c17.664 0 38.741 5.077 58.496 13.269s38.229 19.499 50.731 32l466.773 466.731c12.501 12.501 18.731 28.928 18.731 45.269 0 16.384-6.229 32.725-18.731 45.227zM246.101 296.064l353.835 353.835 52.565-52.565-353.835-353.835-52.565 52.565zM320 128h-64l-42.667 42.667v64c0 3.285 1.408 13.013 6.741 25.813 0.427 0.853 126.592-125.355 126.592-125.355-13.739-5.717-23.381-7.125-26.667-7.125zM381.397 160.768l-52.565 52.565 353.835 353.835 52.565-52.565-353.835-353.835zM765.397 544.768l-135.339 135.339 55.168 55.168 135.253-135.339-55.083-55.168z" />
<glyph unicode="&#xe90a;" glyph-name="tick" d="M724.139 671.958c-41.259 22.955-93.227 8.021-116.053-33.152l-158.421-285.099-90.667 90.667c-33.323 33.323-87.339 33.323-120.661 0s-33.323-87.339 0-120.661l170.667-170.667c16.128-16.171 37.888-25.045 60.331-25.045 3.925 0 7.893 0.256 11.819 0.853 26.496 3.712 49.749 19.627 62.763 43.051l213.333 384c22.912 41.216 8.064 93.141-33.109 116.053z" />
<glyph unicode="&#xe90b;" glyph-name="chevron-down" d="M231.219 586.342c22.323 22.835 53.402 24.627 80.691 0l200.090-191.846 200.090 191.846c27.29 24.627 58.419 22.835 80.589 0 22.323-22.784 20.89-61.286 0-82.688-20.787-21.402-240.384-230.502-240.384-230.502-11.11-11.418-25.702-17.152-40.294-17.152s-29.184 5.734-40.397 17.152c0 0-219.494 209.101-240.384 230.502-20.941 21.402-22.323 59.904 0 82.688z" />
<glyph unicode="&#xe90c;" glyph-name="chevron-left" d="M637.542 741.581c22.835-22.323 24.627-53.402 0-80.691l-191.846-200.090 191.846-200.090c24.627-27.29 22.835-58.419 0-80.589-22.784-22.323-61.286-20.89-82.688 0-21.402 20.787-230.502 240.384-230.502 240.384-11.418 11.11-17.152 25.702-17.152 40.294s5.734 29.184 17.152 40.397c0 0 209.101 219.494 230.502 240.384 21.402 20.941 59.904 22.323 82.688 0z" />
<glyph unicode="&#xe90d;" glyph-name="chevron-right" d="M469.146 741.581c21.402-20.89 230.502-240.384 230.502-240.384 11.418-11.213 17.152-25.805 17.152-40.397s-5.734-29.184-17.152-40.294c0 0-209.101-219.597-230.502-240.384-21.402-20.89-59.904-22.323-82.688 0-22.835 22.221-24.627 53.299 0 80.589l191.846 200.090-191.846 200.090c-24.627 27.29-22.835 58.419 0 80.691 22.784 22.323 61.286 20.941 82.688 0z" />
<glyph unicode="&#xe90e;" glyph-name="chevron-small-down" d="M687.002 570.419c13.875 13.722 36.301 13.722 50.074 0 13.824-13.722 13.926-35.891 0-49.613l-200.090-196.096c-13.824-13.722-36.198-13.722-50.125 0l-200.090 196.096c-13.824 13.67-13.824 35.891 0 49.613 13.875 13.722 36.301 13.722 50.074 0l175.155-160.819 175.002 160.819z" />
<glyph unicode="&#xe90f;" glyph-name="chevron-small-left" d="M621.619 285.798c13.722-13.875 13.722-36.301 0-50.074-13.722-13.824-35.891-13.926-49.613 0l-196.096 200.090c-13.722 13.824-13.722 36.198 0 50.125l196.096 200.090c13.67 13.824 35.891 13.824 49.613 0 13.722-13.875 13.722-36.301 0-50.074l-160.819-175.155 160.819-175.002z" />
<glyph unicode="&#xe910;" glyph-name="chevron-small-right" d="M563.2 460.8l-160.819 175.104c-13.722 13.824-13.722 36.198 0 50.074 13.722 13.824 35.891 13.824 49.613 0l196.096-200.090c13.722-13.875 13.722-36.301 0-50.125l-196.096-200.090c-13.67-13.926-35.891-13.824-49.613 0-13.722 13.773-13.722 36.198 0 50.074l160.819 175.053z" />
<glyph unicode="&#xe911;" glyph-name="chevron-small-up" d="M336.998 351.181c-13.875-13.722-36.301-13.722-50.074 0s-13.926 35.891 0 49.613l200.090 196.096c13.824 13.722 36.198 13.722 50.125 0l200.090-196.096c13.824-13.67 13.824-35.891 0-49.613-13.875-13.722-36.301-13.722-50.125 0l-175.104 160.819-175.002-160.819z" />
<glyph unicode="&#xe912;" glyph-name="chevron-up" d="M792.781 335.258c-22.323-22.835-53.402-24.627-80.691 0l-200.090 191.846-200.090-191.846c-27.29-24.627-58.419-22.835-80.589 0-22.323 22.784-20.89 61.286 0 82.688 20.787 21.402 240.384 230.502 240.384 230.502 11.11 11.418 25.702 17.152 40.294 17.152s29.184-5.734 40.397-17.152c0 0 219.494-209.101 240.384-230.502 20.941-21.402 22.323-59.904 0-82.688z" />
<glyph unicode="&#xe913;" glyph-name="alert-circle" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM469.333 597.334v-170.667c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v170.667c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667zM512 213.334c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667-42.667-19.115-42.667-42.667 19.115-42.667 42.667-42.667z" />
<glyph unicode="&#xe914;" glyph-name="check-circle" d="M896 465.92v-39.253c-0.043-106.027-43.051-201.941-112.64-271.445s-165.547-112.384-271.573-112.299-201.984 43.051-271.445 112.64-112.384 165.504-112.341 271.573 43.051 201.941 112.64 271.445 165.547 112.384 271.573 112.341c56.747-0.043 110.336-12.331 155.691-33.067 21.419-9.813 46.763-0.341 56.533 21.077s0.341 46.763-21.077 56.533c-56.619 25.856-122.283 40.747-191.104 40.789-129.579 0.085-246.997-52.437-331.947-137.259s-137.557-202.24-137.643-331.819 52.437-246.997 137.259-331.947 202.197-137.6 331.776-137.643 246.997 52.437 331.947 137.259 137.6 202.197 137.685 331.819v39.253c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667zM908.501 798.166l-396.501-396.885-97.835 97.792c-16.683 16.683-43.691 16.683-60.331 0s-16.683-43.691 0-60.331l128-128c16.683-16.683 43.691-16.64 60.373 0l426.667 427.093c16.64 16.683 16.64 43.691-0.043 60.331s-43.691 16.64-60.331-0.043z" />
<glyph unicode="&#xe915;" glyph-name="eye" d="M4.523 445.739c-5.803-11.691-6.229-25.728 0-38.144 0 0 16.896-33.664 47.787-78.635 19.243-27.989 44.288-61.099 74.965-94.635 38.144-41.771 85.504-84.779 141.611-119.467 68.053-42.069 149.589-72.192 243.115-72.192s175.061 30.123 243.115 72.192c56.107 34.688 103.467 77.696 141.611 119.467 30.635 33.536 55.723 66.645 74.965 94.635 30.891 44.971 47.787 78.635 47.787 78.635 5.803 11.691 6.229 25.728 0 38.144 0 0-16.896 33.664-47.787 78.635-19.243 27.989-44.288 61.099-74.965 94.635-38.144 41.771-85.504 84.779-141.611 119.467-68.053 42.069-149.589 72.192-243.115 72.192s-175.061-30.123-243.115-72.192c-56.107-34.688-103.467-77.696-141.611-119.467-30.677-33.536-55.723-66.603-74.965-94.635-30.891-44.971-47.787-78.635-47.787-78.635zM91.307 426.667c6.955 11.989 17.365 29.056 31.317 49.408 17.493 25.429 40.107 55.296 67.627 85.376 34.347 37.589 75.733 74.923 123.477 104.448 57.6 35.584 123.776 59.435 198.272 59.435s140.672-23.851 198.229-59.435c47.744-29.525 89.131-66.859 123.477-104.448 27.477-30.080 50.133-59.947 67.627-85.376 13.995-20.352 24.405-37.376 31.317-49.408-6.955-11.989-17.365-29.056-31.317-49.408-17.493-25.429-40.107-55.296-67.627-85.376-34.347-37.589-75.733-74.923-123.477-104.448-57.557-35.584-123.733-59.435-198.229-59.435s-140.672 23.851-198.229 59.435c-47.744 29.525-89.131 66.859-123.477 104.448-27.477 30.080-50.133 59.947-67.627 85.376-13.995 20.352-24.405 37.419-31.36 49.408zM682.667 426.667c0 47.104-19.157 89.856-50.005 120.661s-73.557 50.005-120.661 50.005-89.856-19.157-120.661-50.005-50.005-73.557-50.005-120.661 19.157-89.856 50.005-120.661 73.557-50.005 120.661-50.005 89.856 19.157 120.661 50.005 50.005 73.557 50.005 120.661zM597.333 426.667c0-23.595-9.515-44.843-25.003-60.331s-36.736-25.003-60.331-25.003-44.843 9.515-60.331 25.003-25.003 36.736-25.003 60.331 9.515 44.843 25.003 60.331 36.736 25.003 60.331 25.003 44.843-9.515 60.331-25.003 25.003-36.736 25.003-60.331z" />
<glyph unicode="&#xe916;" glyph-name="help-circle" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM428.075 540.502c7.808 22.229 23.851 39.168 43.605 48.64s42.965 11.392 65.195 3.541c19.541-6.869 34.944-20.053 44.8-36.651 7.808-13.099 12.117-28.373 12.203-44.245 0-6.613-1.664-13.184-4.992-19.797-3.413-6.827-8.661-13.867-15.701-20.907-30.251-30.251-78.123-46.592-78.123-46.592-22.357-7.467-34.432-31.616-26.965-53.973s31.616-34.432 53.973-26.965c0 0 65.877 21.589 111.488 67.2 11.904 11.904 23.253 26.197 31.701 43.093 8.533 17.067 13.995 36.608 13.995 58.411-0.171 31.189-8.704 61.312-24.192 87.424-19.755 33.195-50.773 59.819-89.813 73.557-44.459 15.616-91.093 11.733-130.432-7.125s-71.595-52.821-87.211-97.28c-7.851-22.229 3.84-46.592 26.069-54.4s46.592 3.883 54.4 26.069zM512 170.667c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667-42.667-19.115-42.667-42.667 19.115-42.667 42.667-42.667z" />
<glyph unicode="&#xe917;" glyph-name="circle" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531z" />
<glyph unicode="&#xe918;" glyph-name="map-pin" d="M938.667 512c0 117.803-47.787 224.555-124.971 301.696s-183.893 124.971-301.696 124.971-224.555-47.787-301.696-124.971-124.971-183.893-124.971-301.696c0-24.277 2.261-48.128 6.4-71.509 11.691-66.048 38.357-128.171 71.765-184.32 116.565-195.883 324.821-334.336 324.821-334.336 14.123-9.259 32.64-9.771 47.317 0 0 0 208.299 138.453 324.821 334.336 33.408 56.149 60.075 118.272 71.765 184.32 4.181 23.381 6.443 47.232 6.443 71.509zM853.333 512c0-18.944-1.749-37.845-5.077-56.661-9.429-53.333-31.445-105.728-61.099-155.563-81.579-137.131-214.869-245.205-271.744-287.573-59.648 39.083-195.755 148.352-278.613 287.573-29.653 49.835-51.669 102.229-61.099 155.563-3.285 18.816-5.035 37.717-5.035 56.661 0 94.251 38.144 179.541 99.968 241.365s147.115 99.968 241.365 99.968 179.541-38.144 241.365-99.968 99.968-147.115 99.968-241.365zM682.667 512c0 47.104-19.157 89.856-50.005 120.661s-73.557 50.005-120.661 50.005-89.856-19.157-120.661-50.005-50.005-73.557-50.005-120.661 19.157-89.856 50.005-120.661 73.557-50.005 120.661-50.005 89.856 19.157 120.661 50.005 50.005 73.557 50.005 120.661zM597.333 512c0-23.595-9.515-44.843-25.003-60.331s-36.736-25.003-60.331-25.003-44.843 9.515-60.331 25.003-25.003 36.736-25.003 60.331 9.515 44.843 25.003 60.331 36.736 25.003 60.331 25.003 44.843-9.515 60.331-25.003 25.003-36.736 25.003-60.331z" />
<glyph unicode="&#xe919;" glyph-name="travel-walk" d="M563.2 614.4l73.728-110.592c15.872-24.064 51.712-43.008 80.384-43.008h153.088v102.4h-153.6l-73.728 110.592c-20.018 27.942-43.738 51.661-70.768 71.058l-0.912 0.622-67.584 45.056c-12.935 7.887-28.583 12.557-45.321 12.557-15.281 0-29.653-3.892-42.179-10.739l0.46 0.23-211.968-126.976v-256h102.4v204.8l102.4 51.2-153.6-716.8h102.4l120.32 391.68 84.48-84.48v-307.2h102.4v409.6l-138.24 138.24 35.84 117.76zM614.4 768c56.554 0 102.4 45.846 102.4 102.4s-45.846 102.4-102.4 102.4v0c-56.554 0-102.4-45.846-102.4-102.4s45.846-102.4 102.4-102.4v0z" />
<glyph unicode="&#xe91a;" glyph-name="clock" d="M981.333 426.667c0 129.579-52.565 246.997-137.472 331.861s-202.283 137.472-331.861 137.472-246.997-52.565-331.861-137.472-137.472-202.283-137.472-331.861 52.565-246.997 137.472-331.861 202.283-137.472 331.861-137.472 246.997 52.565 331.861 137.472 137.472 202.283 137.472 331.861zM896 426.667c0-106.069-42.923-201.984-112.469-271.531s-165.461-112.469-271.531-112.469-201.984 42.923-271.531 112.469-112.469 165.461-112.469 271.531 42.923 201.984 112.469 271.531 165.461 112.469 271.531 112.469 201.984-42.923 271.531-112.469 112.469-165.461 112.469-271.531zM469.333 682.667v-256c0-16.597 9.472-31.019 23.595-38.144l170.667-85.333c21.077-10.539 46.72-2.005 57.259 19.072s2.005 46.72-19.072 57.259l-147.115 73.515v229.632c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667z" />
<glyph unicode="&#xe91b;" glyph-name="phone-call" d="M633.984 683.478c40.235-7.851 74.24-29.141 98.56-58.624 17.92-21.76 30.549-47.957 36.352-76.501 4.651-23.083 27.179-38.016 50.261-33.365s38.016 27.179 33.365 50.261c-8.533 42.325-27.307 81.365-54.144 113.877-36.437 44.203-87.765 76.331-148.053 88.064-23.125 4.523-45.525-10.581-50.048-33.707s10.581-45.525 33.707-50.048zM637.44 853.59c85.333-9.472 159.701-49.579 213.547-108.544 47.701-52.224 79.275-119.211 87.979-192.811 2.773-23.381 23.979-40.149 47.36-37.376s40.149 23.979 37.376 47.36c-10.795 91.605-50.176 175.189-109.696 240.384-67.328 73.728-160.512 123.989-267.136 135.808-23.424 2.603-44.501-14.293-47.104-37.675s14.293-44.501 37.675-47.104zM981.333 216.747c0.683 30.464-10.069 59.904-28.715 82.901-19.627 24.149-48.171 41.259-82.133 46.080-34.133 4.181-72.32 13.397-110.336 27.563-18.475 6.784-38.101 9.301-57.344 7.424-28.288-2.731-55.765-14.891-77.611-36.48l-30.72-30.72c-75.52 47.659-143.36 113.792-195.541 195.797l30.976 30.976c13.739 14.080 24.021 30.976 30.165 49.323 9.045 26.965 9.131 57.003-1.664 85.803-12.331 32.128-22.101 70.144-27.477 110.72-4.437 30.464-19.456 57.387-41.088 76.971-22.997 20.736-53.589 33.237-86.485 32.896h-127.829c-3.755 0-7.765-0.171-11.648-0.512-35.157-3.2-65.792-20.395-86.741-45.483s-32.341-58.325-29.141-93.824c12.8-131.243 58.24-266.368 137.216-388.352 64.085-102.955 155.648-197.248 268.715-269.056 109.568-72.405 242.517-122.112 387.669-137.856 3.925-0.384 8.149-0.555 12.288-0.555 35.328 0.128 67.328 14.635 90.368 37.845s37.248 55.339 37.12 90.496zM896 216.747v-128c0.043-11.947-4.651-22.613-12.373-30.379s-18.304-12.587-30.123-12.629c-134.357 14.336-254.336 59.349-352.555 124.245-103.595 65.835-185.984 150.912-243.285 242.944-72.405 111.787-113.28 233.856-124.757 351.488-1.024 11.435 2.731 22.443 9.771 30.891s17.195 14.080 28.928 15.147l131.755 0.213c11.563 0.128 21.632-4.011 29.312-10.923 7.253-6.571 12.288-15.616 13.781-25.941 6.059-45.739 17.408-90.325 32.299-129.067 3.456-9.216 3.413-19.072 0.427-28.075-2.091-6.187-5.589-11.989-10.325-16.853l-53.845-53.803c-13.824-13.824-16.171-34.731-6.912-51.243 67.584-118.827 163.797-211.499 272.256-272.128 16.939-9.472 37.632-6.144 50.987 7.083l54.187 54.187c7.083 6.997 16.085 10.965 25.515 11.904 6.485 0.64 13.227-0.213 19.584-2.56 43.605-16.256 88.32-27.136 129.451-32.171 10.283-1.451 19.712-7.083 26.24-15.147 6.272-7.723 9.856-17.579 9.643-29.099z" />
<glyph unicode="&#xe91c;" glyph-name="check" d="M823.168 712.832l-439.168-439.168-183.168 183.168c-16.683 16.683-43.691 16.683-60.331 0s-16.683-43.691 0-60.331l213.333-213.333c16.683-16.683 43.691-16.683 60.331 0l469.333 469.333c16.683 16.683 16.683 43.691 0 60.331s-43.691 16.683-60.331 0z" />
<glyph unicode="&#xe91d;" glyph-name="checkmark1" d="M0 409.6l102.4 102.4 256-256 563.2 563.2 102.4-102.4-665.6-665.6z" />
<glyph unicode="&#xe91e;" glyph-name="heart" d="M859.008 711.808c37.547-37.589 56.277-86.656 56.277-135.851s-18.773-98.261-56.277-135.765l-347.008-347.008-347.008 347.008c-37.504 37.504-56.235 86.571-56.235 135.808s18.731 98.304 56.235 135.808 86.571 56.235 135.808 56.235 98.304-18.731 135.808-56.235l45.227-45.227c16.683-16.683 43.691-16.683 60.331 0l45.312 45.312c37.504 37.504 86.571 56.235 135.765 56.192s98.261-18.773 135.765-56.277zM919.339 772.139c-54.144 54.144-125.184 81.237-196.096 81.28s-141.952-27.051-196.139-81.195l-15.104-15.147-15.061 15.061c-54.144 54.144-125.227 81.237-196.139 81.237s-141.995-27.093-196.139-81.237-81.237-125.227-81.237-196.139 27.093-141.995 81.237-196.139l377.173-377.173c16.683-16.683 43.691-16.683 60.331 0l377.173 377.173c54.144 54.144 81.237 125.184 81.28 196.096s-27.051 141.952-81.28 196.181z" />
<glyph unicode="&#xe91f;" glyph-name="package" d="M618.965 537.387l-106.965-61.867-297.003 171.819 107.136 61.227zM809.003 647.339l-104.789-60.629-296.277 170.88 82.517 47.147c4.779 2.731 9.899 4.48 15.147 5.291 9.301 1.451 18.987-0.128 27.904-5.291zM491.776-41.002c6.016-3.243 12.928-5.077 20.224-5.077 7.381 0 14.336 1.877 20.395 5.163 15.189 2.475 29.909 7.68 43.392 15.36l298.709 170.709c26.368 15.232 45.227 38.272 55.424 64.597 5.675 14.592 8.619 30.165 8.747 46.251v341.333c0 20.395-4.821 39.723-13.397 56.917-0.939 3.029-2.219 5.973-3.883 8.832-1.963 3.371-4.267 6.357-6.912 8.96-1.323 1.835-2.731 3.669-4.139 5.419-9.813 12.203-21.845 22.528-35.456 30.507l-299.051 170.88c-26.027 15.019-55.467 19.84-83.371 15.531-15.488-2.432-30.507-7.637-44.245-15.488l-136.491-77.995c-8.96-1.749-17.323-6.4-23.595-13.483l-138.624-79.232c-16.341-9.429-29.824-21.888-40.149-36.267-2.56-2.56-4.864-5.547-6.784-8.832-1.664-2.901-2.987-5.888-3.925-8.96-1.707-3.413-3.243-6.955-4.608-10.496-5.632-14.635-8.576-30.208-8.704-45.995v-341.632c0.043-30.293 10.581-58.155 28.331-80.128 9.813-12.203 21.845-22.528 35.456-30.507l299.051-170.88c13.824-7.979 28.587-13.099 43.605-15.445zM469.333 401.622v-340.949l-277.12 158.336c-4.736 2.773-8.832 6.315-12.16 10.453-5.931 7.339-9.387 16.469-9.387 26.539v318.379zM554.667 60.672v340.949l298.667 172.757v-318.379c-0.043-5.163-1.067-10.496-2.987-15.445-3.413-8.789-9.6-16.384-18.176-21.333z" />
<glyph unicode="&#xe920;" glyph-name="shopping-bag" d="M810.667 725.334h-597.333l64 85.333h469.333zM929.877 708.608l-127.744 170.325c-8.363 11.136-21.077 17.024-34.133 17.067h-512c-13.909 0-26.283-6.656-34.133-17.067l-127.744-170.325c-1.835-2.389-3.456-4.992-4.736-7.765-2.773-5.845-4.096-12.075-4.053-18.176v-597.333c0-35.328 14.379-67.413 37.504-90.496s55.168-37.504 90.496-37.504h597.333c35.328 0 67.413 14.379 90.496 37.504s37.504 55.168 37.504 90.496v597.333c0 9.344-3.029 18.005-8.064 24.96-0.171 0.213-0.299 0.427-0.469 0.64zM170.667 640h682.667v-554.667c0-11.776-4.736-22.4-12.501-30.165s-18.389-12.501-30.165-12.501h-597.333c-11.776 0-22.4 4.736-30.165 12.501s-12.501 18.389-12.501 30.165zM640 512c0-35.371-14.293-67.285-37.504-90.496s-55.125-37.504-90.496-37.504-67.285 14.293-90.496 37.504-37.504 55.125-37.504 90.496c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667c0-58.88 23.936-112.299 62.464-150.869s91.989-62.464 150.869-62.464 112.299 23.936 150.869 62.464 62.464 91.989 62.464 150.869c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667z" />
<glyph unicode="&#xe921;" glyph-name="heart-outlined" d="M880.128 760.013c-85.606 78.592-224.41 78.592-310.016 0l-58.112-53.299-58.163 53.299c-85.606 78.592-224.358 78.592-309.965 0-96.307-88.371-96.307-231.373 0-319.744l368.128-337.869 368.128 337.869c96.256 88.371 96.256 231.424 0 319.744zM825.549 492.8l-313.549-292.608-313.6 292.608c-31.59 29.030-43.827 66.918-43.827 107.213s7.066 73.37 38.707 102.349c27.904 25.651 65.434 39.782 105.626 39.782 40.141 0 77.67-24.371 105.574-50.074l107.52-93.44 107.469 93.491c27.955 25.702 65.434 50.074 105.626 50.074s77.722-14.131 105.626-39.782c31.642-28.979 38.656-62.054 38.656-102.349s-12.186-78.234-43.827-107.264z" />
<glyph unicode="&#xe922;" glyph-name="heart1" d="M880.128 760.064c-85.606 78.541-224.41 78.541-310.016 0l-58.112-53.35-58.163 53.35c-85.606 78.541-224.358 78.541-309.965 0-96.307-88.422-96.307-231.424 0-319.795l368.128-337.869 368.128 337.869c96.256 88.371 96.256 231.424 0 319.795z" />
<glyph unicode="&#xe923;" glyph-name="old-phone" d="M883.507 345.446c-4.915 34.15-31.283 60.774-65.229 68.71-131.942 30.925-165.018 106.906-170.598 191.181-23.398 4.352-65.024 9.062-135.68 9.062s-112.282-4.71-135.68-9.062c-5.581-84.275-38.656-160.256-170.598-191.181-33.946-7.987-60.314-34.56-65.229-68.71l-25.446-176.23c-8.96-62.054 36.608-118.016 99.994-118.016h593.92c63.334 0 108.954 55.962 99.994 118.016l-25.446 176.23zM512 179.61c-71.424 0-129.331 57.344-129.331 128s57.907 128 129.331 128 129.331-57.344 129.331-128-57.958-128-129.331-128zM1021.44 665.6c-1.229 76.8-196.71 204.749-509.44 204.8-312.781-0.051-508.262-128-509.44-204.8s1.075-176.742 129.792-160.102c150.579 19.507 141.312 72.090 141.312 147.251 0 52.429 122.47 65.075 238.336 65.075s238.285-12.646 238.336-65.075c0-75.162-9.267-127.744 141.312-147.251 128.666-16.64 130.97 83.302 129.792 160.102z" />
<glyph unicode="&#xe924;" glyph-name="shop" d="M313.498 601.6l40.499 268.8h-210.637l-88.013-230.4c-2.714-8.192-4.147-16.691-4.147-25.6 0-56.525 58.88-102.4 131.635-102.4 67.072 0 122.522 39.117 130.662 89.6zM512 512c72.704 0 131.635 45.875 131.635 102.4 0 2.099-0.154 4.198-0.256 6.195l-26.061 249.805h-210.637l-26.112-249.6c-0.102-2.099-0.205-4.198-0.205-6.4 0-56.525 58.931-102.4 131.635-102.4zM768 458.445v-202.445h-512v202.138c-22.426-8.090-47.104-12.698-73.165-12.698-9.984 0-19.661 1.178-29.235 2.509v-325.069c0-39.424 32.205-71.68 71.578-71.68h573.542c39.424 0 71.68 32.307 71.68 71.68v325.018c-9.626-1.28-19.251-2.509-29.235-2.509-25.907 0.051-50.688 4.762-73.165 13.056zM968.704 640l-88.115 230.4h-210.586l40.448-268.39c7.885-50.688 63.334-90.010 130.714-90.010 72.704 0 131.635 45.875 131.635 102.4 0 8.909-1.434 17.408-4.096 25.6z" />
<glyph unicode="&#xe925;" glyph-name="plane-outline" d="M895.488 409.771l-212.821 121.643v204.587c0 82.347-66.987 149.333-149.333 149.333s-149.333-66.987-149.333-149.333v-204.587l-212.821-121.643c-56.192-32.085-79.573-101.163-54.443-160.811 25.131-59.691 90.965-91.093 153.131-73.387l114.133 32.64v-35.755l-37.291-29.824c-51.115-40.917-63.147-113.792-27.861-168.917 35.285-55.168 106.411-74.795 165.077-45.483 0.171 0.043 21.333 7.808 49.408 7.808s49.237-7.765 49.408-7.808c58.667-29.312 129.792-9.685 165.077 45.483 35.285 55.125 23.253 128-27.861 168.917l-37.291 29.824v35.755l114.176-32.64c62.165-17.707 128 13.696 153.131 73.387s1.749 128.725-54.485 160.811zM871.339 282.112c-8.405-19.883-30.336-30.421-51.029-24.448l-222.976 63.659v-189.909l69.333-55.467c17.024-13.611 21.035-37.931 9.301-56.32-11.733-18.347-35.328-24.875-55.040-15.147-0.341 0.171-35.157 16.853-87.595 16.853s-87.253-16.683-87.595-16.853c-19.712-9.685-43.307-3.157-55.040 15.147-11.733 18.389-7.765 42.667 9.301 56.32l69.333 55.467v189.909l-222.976-63.701c-20.693-5.973-42.624 4.565-51.029 24.448-8.363 19.883-0.597 42.88 18.176 53.589l255.829 146.219v254.123c0 35.285 28.715 64 64 64s64-28.715 64-64v-254.123l255.829-146.176c18.773-10.709 26.539-33.707 18.176-53.589zM554.667 746.667c0-11.782-9.551-21.333-21.333-21.333s-21.333 9.551-21.333 21.333c0 11.782 9.551 21.333 21.333 21.333s21.333-9.551 21.333-21.333z" />
<glyph unicode="&#xe926;" glyph-name="plane" d="M853.163 362.368l-255.829 146.176v254.123c0 35.285-28.715 64-64 64s-64-28.715-64-64v-254.123l-255.829-146.176c-18.731-10.709-26.539-33.707-18.176-53.589 8.405-19.883 30.336-30.421 51.029-24.448l222.976 63.659v-189.909l-69.333-55.467c-16.512-13.227-20.821-36.523-10.197-54.784s33.109-25.941 52.693-18.133l90.837 36.352 90.837-36.352c5.163-2.048 10.539-3.029 15.829-3.029 14.805 0 29.056 7.723 36.864 21.205 10.624 18.261 6.272 41.6-10.197 54.784l-69.333 55.467v189.909l222.976-63.701c3.883-1.109 7.851-1.664 11.691-1.664 16.811 0 32.512 9.941 39.339 26.112 8.363 19.883 0.597 42.88-18.176 53.589zM533.333 752c-11.776 0-21.333 9.557-21.333 21.333s9.557 21.333 21.333 21.333 21.333-9.557 21.333-21.333-9.557-21.333-21.333-21.333z" />
<glyph unicode="&#xe927;" glyph-name="rocket" d="M747.872 15.072c0 0 10.72 64.384-55.392 143.008 64.352 180.512 73.28 344.896 73.28 344.896s132.256-30.4 132.256-160.832c-0.032-223.392-150.144-327.072-150.144-327.072zM383.328 93.504c0 0-88.576 284.256-88.576 402.176 0 53.056 5.984 100.256 15.296 143.104h403.52c9.376-42.88 15.392-90.112 15.392-143.136 0-116.128-88.32-402.144-88.32-402.144h-257.312zM511.68 573.792c-45.376 0-82.176-36.8-82.176-82.208 0-45.376 36.8-82.208 82.176-82.208 45.408 0 82.208 36.8 82.208 82.208 0.032 45.408-36.8 82.208-82.208 82.208zM494.016 940.928v111.936h32v-109.088c36.576-26.624 135.552-111.296 180.32-274.4h-389.12c43.264 158.624 137.472 242.368 176.8 271.552zM276.128 15.072c0 0-150.112 103.68-150.112 327.072 0 130.432 132.256 160.832 132.256 160.832s8.928-164.384 73.248-344.896c-66.144-78.656-55.392-143.008-55.392-143.008zM566.112-1.44l-26.816 26.816-28.576-89.376-33.984 89.376-23.232-46.432-33.984 84h184.064l-37.472-64.384z" />
<glyph unicode="&#xe928;" glyph-name="search" d="M684.416 262.144c-1.451-1.109-2.859-2.347-4.224-3.712s-2.56-2.731-3.712-4.224c-53.675-51.755-126.677-83.541-207.147-83.541-82.475 0-157.099 33.365-211.2 87.467s-87.467 128.725-87.467 211.2 33.365 157.099 87.467 211.2 128.725 87.467 211.2 87.467 157.099-33.365 211.2-87.467 87.467-128.725 87.467-211.2c0-80.469-31.787-153.472-83.584-207.189zM926.165 72.832l-156.8 156.8c52.523 65.707 83.968 149.035 83.968 239.701 0 106.027-43.008 202.069-112.469 271.531s-165.504 112.469-271.531 112.469-202.069-43.008-271.531-112.469-112.469-165.504-112.469-271.531 43.008-202.069 112.469-271.531 165.504-112.469 271.531-112.469c90.667 0 173.995 31.445 239.701 83.968l156.8-156.8c16.683-16.683 43.691-16.683 60.331 0s16.683 43.691 0 60.331z" />
<glyph unicode="&#xe929;" glyph-name="star" d="M399.445 547.926c0 0-134.827-14.933-224.768-24.917-8.107-0.981-15.275-6.4-17.963-14.635s0-16.811 5.973-22.229c66.816-60.971 167.211-152.277 167.211-152.277-0.085 0-27.563-132.821-45.824-221.44-1.536-8.021 1.365-16.512 8.363-21.589 6.955-5.077 15.915-5.163 22.955-1.195 78.677 44.715 196.523 111.957 196.523 111.957s117.888-67.243 196.437-112c7.168-3.925 16.128-3.84 23.083 1.237 6.997 5.077 9.899 13.568 8.32 21.547-18.261 88.661-45.696 221.483-45.696 221.483s100.395 91.307 167.211 152.149c5.973 5.589 8.619 14.165 5.973 22.357s-9.813 13.611-17.92 14.549c-89.941 10.069-224.811 25.003-224.811 25.003s-55.893 123.648-93.141 206.080c-3.499 7.381-10.837 12.544-19.456 12.544s-16-5.205-19.328-12.544c-37.291-82.432-93.141-206.080-93.141-206.080z" />
<glyph unicode="&#xe92a;" glyph-name="star-outline" d="M719.147 44.118c-9.557 0-18.901 2.133-27.563 6.229-1.493 0.597-2.944 1.323-4.437 2.176l-175.232 99.968-175.232-100.011c-1.493-0.853-2.987-1.579-4.523-2.261-20.821-9.728-46.293-7.424-64.896 6.101-20.011 14.507-29.909 39.808-25.003 64.384l40.832 198.059c-15.957 14.507-41.045 37.333-68.352 62.165l-80.853 73.6c-1.152 1.067-2.347 2.261-3.328 3.499-16 16.896-21.717 41.387-14.507 63.659 7.381 22.357 26.453 38.912 49.493 43.051 1.451 0.341 2.859 0.597 4.352 0.768l200.576 22.229 83.029 183.893c0.725 1.621 1.536 3.2 2.56 4.693 11.179 20.181 32.597 32.896 55.851 32.896 23.168 0 44.544-12.715 55.851-32.853 0.896-1.536 1.749-3.115 2.56-4.779l83.115-183.979 200.576-22.229c1.451-0.128 2.901-0.384 4.437-0.725 22.997-4.267 42.069-20.736 49.408-43.179 7.253-22.229 1.493-46.848-14.507-63.744-1.024-1.109-2.176-2.304-3.328-3.328l-149.248-135.851 40.832-197.632c4.821-25.045-5.035-50.261-25.173-64.811-10.752-7.765-23.723-11.989-37.291-11.989zM371.456 324.182c-1.664-7.765-19.883-95.829-36.053-174.165l155.435 88.619c13.099 7.467 29.184 7.467 42.24 0l155.435-88.533-36.224 175.104c-3.029 14.763 1.92 30.080 13.141 40.192l132.267 120.405-177.835 19.669c-14.976 1.664-27.904 11.093-34.176 24.917l-73.728 163.029-73.643-163.029c-6.229-13.739-19.2-23.168-34.176-24.917l-177.835-19.669 132.267-120.405c11.605-10.496 16.384-26.325 12.885-41.216z" />
<glyph unicode="&#xe92b;" glyph-name="thumbs-up" d="M554.667 554.667c0-23.552 19.115-42.667 42.667-42.667h242.304c2.773-0.085 6.528-0.469 6.528-0.469 11.648-1.749 21.419-8.021 27.947-16.896s9.6-20.053 7.851-31.659l-58.88-383.915c-1.579-10.197-6.656-19.115-13.867-25.6-7.68-6.869-17.707-10.923-29.269-10.795h-438.613v417.621l153.941 346.368c13.099-4.181 24.832-11.435 34.389-20.992 15.488-15.488 25.003-36.736 25.003-60.331zM640 597.334v128c0 47.104-19.157 89.856-50.005 120.661s-73.557 50.005-120.661 50.005c-17.28 0-32.171-10.283-38.997-25.344l-170.667-384c-2.56-5.717-3.712-11.733-3.669-17.323v-469.333c0-23.552 19.115-42.667 42.667-42.667h481.28c32.725-0.384 63.232 11.989 86.229 32.555 21.547 19.285 36.565 45.909 41.259 76.075l58.88 384.085c5.333 34.987-4.096 68.864-23.467 95.189s-48.939 45.355-83.84 50.645c-7.040 1.067-14.208 1.579-20.992 1.451zM298.667 42.667h-128c-11.776 0-22.4 4.736-30.165 12.501s-12.501 18.389-12.501 30.165v298.667c0 11.776 4.736 22.4 12.501 30.165s18.389 12.501 30.165 12.501h128c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667h-128c-35.328 0-67.413-14.379-90.496-37.504s-37.504-55.168-37.504-90.496v-298.667c0-35.328 14.379-67.413 37.504-90.496s55.168-37.504 90.496-37.504h128c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667z" />
<glyph unicode="&#xea10;" glyph-name="checkmark" d="M864 832l-480-480-224 224-160-160 384-384 640 640z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1006 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

@ -0,0 +1,66 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from '@/store'
Vue.config.productionTip = false
// 使用toast
import toast from 'components/common/toast'
Vue.use(toast)
import notify from 'components/common/notify'
Vue.use(notify)
// // 使用overlay
// import overlay from 'components/common/overlay'
// Vue.use(overlay)
//取消移动端300ms延时
import FastClick from 'fastclick'
FastClick.attach(document.body)
//懒加载
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
preLoad: 1,
error: '/images/static/angry.png',
loading: '/images/static/kani.png',
attempt: 3
})
import 'vant/lib/index.css'
import Dialog from 'vant';
Vue.use(Dialog);
import { Button } from 'vant';
Vue.use(Button);
import { Popup } from 'vant';
Vue.use(Popup);
import { Field } from 'vant';
Vue.use(Field);
import { Form } from 'vant';
Vue.use(Form);
// 文件上传
import { Uploader } from 'vant';
Vue.use(Uploader);
import { DropdownMenu, DropdownItem } from 'vant';
Vue.use(DropdownMenu);
Vue.use(DropdownItem);
//创建事件总线
Vue.prototype.$bus = new Vue()
var vue = new Vue({
render: h => h(App),
router,
store
}).$mount('#app')
window.vue = vue

@ -0,0 +1,63 @@
// 学院信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询学院信息 */
export function queryArea(page) {
return request({
url: '/area/list',
method: "POST",
params: {
"page": page,
"rows": 10
}
})
}
/* 查询所有的学院信息*/
export function queryAllArea() {
return request({
url: '/area/listAll',
method: "POST",
})
}
/* 添加学院信息 */
export function addArea(area) {
return request({
url: '/area/add',
method: "POST",
data: qs.stringify(area),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新学院信息 */
export function updateArea(area) {
return request({
url: '/area/update',
method: "POST",
data: qs.stringify(area),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键学院id查询学院信息 */
export function getArea(areaId) {
return request({
url: '/area/get/' + areaId,
method: "POST"
})
}
/* 根据主键areaId删除学院 */
export function deleteArea(areaId) {
return request({
url: '/area/delete/' + areaId,
method: "POST",
})
}

@ -0,0 +1,66 @@
// 认领信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询认领信息 */
export function queryClaim(lostFoundObj_lostFoundId, personName, claimTime, page) {
return request({
url: '/claim/list',
method: "POST",
params: {
"lostFoundObj.lostFoundId": lostFoundObj_lostFoundId,
"personName": personName,
"claimTime": claimTime,
"page": page,
"rows": 10
}
})
}
/* 查询所有的认领信息*/
export function queryAllClaim() {
return request({
url: '/claim/listAll',
method: "POST",
})
}
/* 添加认领信息 */
export function addClaim(claim) {
return request({
url: '/claim/add',
method: "POST",
data: qs.stringify(claim),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新认领信息 */
export function updateClaim(claim) {
return request({
url: '/claim/update',
method: "POST",
data: qs.stringify(claim),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键认领id查询认领信息 */
export function getClaim(claimId) {
return request({
url: '/claim/get/' + claimId,
method: "POST"
})
}
/* 根据主键claimId删除认领 */
export function deleteClaim(claimId) {
return request({
url: '/claim/delete/' + claimId,
method: "POST",
})
}

@ -0,0 +1,89 @@
// 寻物启事信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询寻物启事信息 */
export function queryLookingFor(title, goodsName, lostTime, lostPlace, telephone, userObj_user_name, page) {
return request({
url: '/lookingFor/list',
method: "POST",
params: {
"title": title,
"goodsName": goodsName,
"lostTime": lostTime,
"lostPlace": lostPlace,
"telephone": telephone,
"userObj.user_name": userObj_user_name,
"page": page,
"rows": 10
}
})
}
/* 根据查询条件分页查询寻物启事信息 */
export function userQueryLookingFor(title, goodsName, lostTime, lostPlace, telephone, page) {
return request({
url: '/lookingFor/userList',
method: "POST",
params: {
"title": title,
"goodsName": goodsName,
"lostTime": lostTime,
"lostPlace": lostPlace,
"telephone": telephone,
"page": page,
"rows": 10
}
})
}
/* 查询所有的寻物启事信息*/
export function queryAllLookingFor() {
return request({
url: '/lookingFor/listAll',
method: "POST",
})
}
/* 添加寻物启事信息 */
export function addLookingFor(lookingFor) {
return request({
url: '/lookingFor/add',
method: "POST",
data: qs.stringify(lookingFor),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新寻物启事信息 */
export function updateLookingFor(lookingFor) {
return request({
url: '/lookingFor/update',
method: "POST",
data: qs.stringify(lookingFor),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键寻物id查询寻物启事信息 */
export function getLookingFor(lookingForId) {
return request({
url: '/lookingFor/get/' + lookingForId,
method: "POST"
})
}
/* 根据主键lookingForId删除寻物启事 */
export function deleteLookingFor(lookingForId) {
return request({
url: '/lookingFor/delete/' + lookingForId,
method: "POST",
})
}

@ -0,0 +1,91 @@
// 失物招领信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询失物招领信息 */
export function queryLostFound(title, goodsName, pickUpTime, pickUpPlace, connectPerson, phone, userObj_user_name, page) {
return request({
url: '/lostFound/list',
method: "POST",
params: {
"title": title,
"goodsName": goodsName,
"pickUpTime": pickUpTime,
"pickUpPlace": pickUpPlace,
"connectPerson": connectPerson,
"phone": phone,
"userObj.user_name": userObj_user_name,
"page": page,
"rows": 10
}
})
}
/* 根据查询条件分页查询失物招领信息 */
export function userQueryLostFound(title, goodsName, pickUpTime, pickUpPlace, connectPerson, phone, page) {
return request({
url: '/lostFound/userList',
method: "POST",
params: {
"title": title,
"goodsName": goodsName,
"pickUpTime": pickUpTime,
"pickUpPlace": pickUpPlace,
"connectPerson": connectPerson,
"phone": phone,
"page": page,
"rows": 10
}
})
}
/* 查询所有的失物招领信息*/
export function queryAllLostFound() {
return request({
url: '/lostFound/listAll',
method: "POST",
})
}
/* 添加失物招领信息 */
export function addLostFound(lostFound) {
return request({
url: '/lostFound/add',
method: "POST",
data: qs.stringify(lostFound),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新失物招领信息 */
export function updateLostFound(lostFound) {
return request({
url: '/lostFound/update',
method: "POST",
data: qs.stringify(lostFound),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键招领id查询失物招领信息 */
export function getLostFound(lostFoundId) {
return request({
url: '/lostFound/get/' + lostFoundId,
method: "POST"
})
}
/* 根据主键lostFoundId删除失物招领 */
export function deleteLostFound(lostFoundId) {
return request({
url: '/lostFound/delete/' + lostFoundId,
method: "POST",
})
}

@ -0,0 +1,65 @@
// 站内通知信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询站内通知信息 */
export function queryNotice(title, addTime, page) {
return request({
url: '/notice/list',
method: "POST",
params: {
"title": title,
"addTime": addTime,
"page": page,
"rows": 10
}
})
}
/* 查询所有的站内通知信息*/
export function queryAllNotice() {
return request({
url: '/notice/listAll',
method: "POST",
})
}
/* 添加站内通知信息 */
export function addNotice(notice) {
return request({
url: '/notice/add',
method: "POST",
data: qs.stringify(notice),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新站内通知信息 */
export function updateNotice(notice) {
return request({
url: '/notice/update',
method: "POST",
data: qs.stringify(notice),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键通知id查询站内通知信息 */
export function getNotice(noticeId) {
return request({
url: '/notice/get/' + noticeId,
method: "POST"
})
}
/* 根据主键noticeId删除站内通知 */
export function deleteNotice(noticeId) {
return request({
url: '/notice/delete/' + noticeId,
method: "POST",
})
}

@ -0,0 +1,66 @@
// 表扬信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询表扬信息 */
export function queryPraise(lostFoundObj_lostFoundId, title, addTime, page) {
return request({
url: '/praise/list',
method: "POST",
params: {
"lostFoundObj.lostFoundId": lostFoundObj_lostFoundId,
"title": title,
"addTime": addTime,
"page": page,
"rows": 10
}
})
}
/* 查询所有的表扬信息*/
export function queryAllPraise() {
return request({
url: '/praise/listAll',
method: "POST",
})
}
/* 添加表扬信息 */
export function addPraise(praise) {
return request({
url: '/praise/add',
method: "POST",
data: qs.stringify(praise),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新表扬信息 */
export function updatePraise(praise) {
return request({
url: '/praise/update',
method: "POST",
data: qs.stringify(praise),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键表扬id查询表扬信息 */
export function getPraise(praiseId) {
return request({
url: '/praise/get/' + praiseId,
method: "POST"
})
}
/* 根据主键praiseId删除表扬 */
export function deletePraise(praiseId) {
return request({
url: '/praise/delete/' + praiseId,
method: "POST",
})
}

@ -0,0 +1,79 @@
// 用户信息业务处理
import request from './request'
import qs from 'qs'
/* 根据查询条件分页查询用户信息 */
export function queryUserInfo(user_name, areaObj_areaId, name, birthday, telephone, regTime, page) {
return request({
url: '/userInfo/list',
method: "POST",
params: {
"user_name": user_name,
"areaObj.areaId": areaObj_areaId,
"name": name,
"birthday": birthday,
"telephone": telephone,
"regTime": regTime,
"page": page,
"rows": 10
}
})
}
/* 查询所有的用户信息*/
export function queryAllUserInfo() {
return request({
url: '/userInfo/listAll',
method: "POST",
})
}
/* 添加用户信息 */
export function addUserInfo(userInfo) {
return request({
url: '/userInfo/add',
method: "POST",
data: qs.stringify(userInfo),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 更新用户信息 */
export function updateUserInfo(userInfo) {
return request({
url: '/userInfo/update',
method: "POST",
data: qs.stringify(userInfo),
headers: { //添加请求头
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}
/* 根据主键手机账号查询用户信息 */
export function getUserInfo(user_name) {
return request({
url: '/userInfo/get/' + user_name,
method: "POST"
})
}
/* 查询用户个人信息 */
export function getSelfUserInfo() {
return request({
url: '/userInfo/selfGet',
method: "POST"
})
}
/* 根据主键user_name删除用户 */
export function deleteUserInfo(user_name) {
return request({
url: '/userInfo/delete/' + user_name,
method: "POST",
})
}

@ -0,0 +1,7 @@
import request from './request'
export function getShop() {
return request({
url: '/shop'
})
}

@ -0,0 +1,61 @@
//登录注册相关业务处理
import request from './request'
/* 根据手机号发送验证码 */
export function requestCode(tell) {
return request({
url: '/auth/sendSMS',
params: {
tel: tell
}
})
}
/* 客户端输入手机号和验证码注册或者登陆系统 */
export function login(tell, code) {
return request({
url: '/auth/login',
params: {
tell: tell,
code: code
}
})
}
/* 新用户注册的时候更新用户昵称和头像 */
export function register(nickName, avatar) {
return request({
url: '/auth/register',
params: {
nickName: nickName,
avatar: avatar
}
})
}
/* 用户重新登录系统用于以后token过期的预留接口 */
export function appLogin(username) {
return request({
url: '/auth/appLogin',
method: "POST",
params: {
username: username
}
})
}
/*获取用户个人信息*/
export function getUserInfo() {
return request({
url: '/auth/userInfo'
})
}
/* 退出系统 */
export function logout() {
return request({
url: '/auth/logout'
})
}

@ -0,0 +1,61 @@
import axios from 'axios'
//携带cookie
axios.defaults.withCredentials = true
export default function request(config, success, failure) {
const instance = axios.create({
baseURL: "/api",
timeout: 5000,
})
// 拦截
instance.interceptors.request.use(config => {
//config 一些信息不符合服务器要求
//每次发送网络请求过程 有等待图标转动
//某些网络请求 需要携带 token登录信息
if (localStorage.getItem("x-auth-token")) {
config.headers['x-auth-token'] = localStorage.getItem("x-auth-token") // 让每个请求携带自定义token 请根据实际情况自行修改
}
window.vue.$toast.loading();
return config;
}, err => {
console.log(err)
})
// 响应拦截器
instance.interceptors.response.use(res => {
setTimeout(()=>{window.vue.$toast.hide();},200);
var result = res.data;
if (result && result.code == '0000') {
return result;
} else if (result && result.code == '90001') {
// TODO 提示用户登录
window.vue.$router.replace('/login')
return Promise.reject('请先登录系统');
} else if (result && result.code == "90005") {
console.info("Token值失效" + result.msg);
window.vue.$router.replace('/login')
return Promise.reject('Token回话过期需重新登录');
/*
if (!noRefetch) {
self._refetch(url, data, successCallback, failCallback)
}*/
} else {
return Promise.reject('系统错误: '+result.msg);
}
},
error => {
console.log('err' + error)
window.vue.$toast.show(error.message);
return Promise.reject(error)
}
)
return instance(config)
}

@ -0,0 +1,28 @@
//文件上传业务处理
import request from './request'
/* 图片文件上传 */
export function uploadImage(formData) {
return request({
url: '/upload/image',
method: "POST",
data: formData,
headers: { //添加请求头
'Content-Type': 'multipart/form-data'
}
})
}
/* 普通文件上传处理 */
export function uploadFile(formData) {
return request({
url: '/upload/file',
method: "POST",
data: formData,
headers: { //添加请求头
'Content-Type': 'multipart/form-data'
}
})
}

@ -0,0 +1,221 @@
//前端路由代码
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
/**
* 重写路由的push方法
*/
// const routerPush = Router.prototype.push
// Router.prototype.push = function push(location) {
// return routerPush.call(this, location).catch(error => error)
// }
const Home = () => import ('../views/home/Home') //引入首页组件页
const UserInfoList = () => import('../views/userInfo/UserInfoList.vue') //引入用户列表组件页
const UserInfoAdd = () => import('../views/userInfo/UserInfoAdd') //引入用户添加组件页
const UserInfoModify = () => import('../views/userInfo/UserInfoModify') //引入用户修改组件页
const UserInfoSelfModify = () => import('../views/userInfo/UserInfoSelfModify') //引入用户修改组件页
const UserInfoDetail = () => import('../views/userInfo/UserInfoDetail') //引入用户详情组件页
const AreaList = () => import('../views/area/AreaList.vue') //引入学院列表组件页
const AreaAdd = () => import('../views/area/AreaAdd') //引入学院添加组件页
const AreaModify = () => import('../views/area/AreaModify') //引入学院修改组件页
const AreaDetail = () => import('../views/area/AreaDetail') //引入学院详情组件页
const LookingForList = () => import('../views/lookingFor/LookingForList.vue') //引入寻物启事列表组件页
const LookingForUserList = () => import('../views/lookingFor/LookingForUserList.vue') //引入寻物启事列表组件页
const LookingForAdd = () => import('../views/lookingFor/LookingForAdd') //引入寻物启事添加组件页
const LookingForModify = () => import('../views/lookingFor/LookingForModify') //引入寻物启事修改组件页
const LookingForDetail = () => import('../views/lookingFor/LookingForDetail') //引入寻物启事详情组件页
const LostFoundList = () => import('../views/lostFound/LostFoundList.vue') //引入失物招领列表组件页
const LostFoundUserList = () => import('../views/lostFound/LostFoundUserList.vue') //引入失物招领列表组件页
const LostFoundAdd = () => import('../views/lostFound/LostFoundAdd') //引入失物招领添加组件页
const LostFoundModify = () => import('../views/lostFound/LostFoundModify') //引入失物招领修改组件页
const LostFoundDetail = () => import('../views/lostFound/LostFoundDetail') //引入失物招领详情组件页
const ClaimList = () => import('../views/claim/ClaimList.vue') //引入认领列表组件页
const ClaimAdd = () => import('../views/claim/ClaimAdd') //引入认领添加组件页
const ClaimModify = () => import('../views/claim/ClaimModify') //引入认领修改组件页
const ClaimDetail = () => import('../views/claim/ClaimDetail') //引入认领详情组件页
const PraiseList = () => import('../views/praise/PraiseList.vue') //引入表扬列表组件页
const PraiseAdd = () => import('../views/praise/PraiseAdd') //引入表扬添加组件页
const PraiseModify = () => import('../views/praise/PraiseModify') //引入表扬修改组件页
const PraiseDetail = () => import('../views/praise/PraiseDetail') //引入表扬详情组件页
const NoticeList = () => import('../views/notice/NoticeList.vue') //引入站内通知列表组件页
const NoticeAdd = () => import('../views/notice/NoticeAdd') //引入站内通知添加组件页
const NoticeModify = () => import('../views/notice/NoticeModify') //引入站内通知修改组件页
const NoticeDetail = () => import('../views/notice/NoticeDetail') //引入站内通知详情组件页
const Profile = () => import ('../views/profile/Profile') //引入个人中心组件页
const Login = () => import ('../views/login/Login') //引入登录组件页
const CreateAccount = () => import ('../views/login/CreateAccount') //引入创建账号组件页
const Coupon = () => import ('../views/profile/CouponExchange') //引入优惠卷组件页
const About = () => import ('../views/profile/About') //引入关于我们组件页
const routes = [{
path: '', // 根路径跳到登录页路由
redirect: '/login'
},
{
path: '/login', // 系统登录页路由
component: Login
},
{
path: '/register', // 创建新账号页路由
component: CreateAccount
},
{
path: '/home', // 首页路由
component: Home
},
{
path: '/userInfo/add', // 添加用户页路由
component: UserInfoAdd
},
{
path: '/userInfo/modify/:user_name', // 修改用户页路由
component: UserInfoModify
},
{
path: '/userInfo/selfModify', // 修改用户页路由
component: UserInfoSelfModify
},
{
path: '/userInfo/list', // 用户查询页路由
component: UserInfoList
},
{
path: '/userInfo/detail/:user_name', // 用户详情页路由
component: UserInfoDetail
},
{
path: '/area/add', // 添加学院页路由
component: AreaAdd
},
{
path: '/area/modify/:areaId', // 修改学院页路由
component: AreaModify
},
{
path: '/area/list', // 学院查询页路由
component: AreaList
},
{
path: '/area/detail/:areaId', // 学院详情页路由
component: AreaDetail
},
{
path: '/lookingFor/add', // 添加寻物启事页路由
component: LookingForAdd
},
{
path: '/lookingFor/modify/:lookingForId', // 修改寻物启事页路由
component: LookingForModify
},
{
path: '/lookingFor/list', // 寻物启事查询页路由
component: LookingForList
},
{
path: '/lookingFor/userList', // 寻物启事查询页路由
component: LookingForUserList
},
{
path: '/lookingFor/detail/:lookingForId', // 寻物启事详情页路由
component: LookingForDetail
},
{
path: '/lostFound/add', // 添加失物招领页路由
component: LostFoundAdd
},
{
path: '/lostFound/modify/:lostFoundId', // 修改失物招领页路由
component: LostFoundModify
},
{
path: '/lostFound/list', // 失物招领查询页路由
component: LostFoundList
},
{
path: '/lostFound/userList', // 失物招领查询页路由
component: LostFoundUserList
},
{
path: '/lostFound/detail/:lostFoundId', // 失物招领详情页路由
component: LostFoundDetail
},
{
path: '/claim/add', // 添加认领页路由
component: ClaimAdd
},
{
path: '/claim/modify/:claimId', // 修改认领页路由
component: ClaimModify
},
{
path: '/claim/list', // 认领查询页路由
component: ClaimList
},
{
path: '/claim/detail/:claimId', // 认领详情页路由
component: ClaimDetail
},
{
path: '/praise/add', // 添加表扬页路由
component: PraiseAdd
},
{
path: '/praise/modify/:praiseId', // 修改表扬页路由
component: PraiseModify
},
{
path: '/praise/list', // 表扬查询页路由
component: PraiseList
},
{
path: '/praise/detail/:praiseId', // 表扬详情页路由
component: PraiseDetail
},
{
path: '/notice/add', // 添加站内通知页路由
component: NoticeAdd
},
{
path: '/notice/modify/:noticeId', // 修改站内通知页路由
component: NoticeModify
},
{
path: '/notice/list', // 站内通知查询页路由
component: NoticeList
},
{
path: '/notice/detail/:noticeId', // 站内通知详情页路由
component: NoticeDetail
},
{
path: '/Profile', // 个人中心页路由
component: Profile,
},
{
path: '/about', //关于我们页路由
component: About
},
{
path: '/coupon', // 优惠卷页路由
component: Coupon
}
]
const router = new Router({
routes,
mode: 'history'
})
export default router

@ -0,0 +1,48 @@
import {
ADD_TO_CART,
ADD_COUNTER
} from './mutaion-types'
export default {
addCart(context, payload) {
return new Promise((resolve) => {
let flag = true
let cartList = context.state.cartList
let shopId = payload.shopId
if (!cartList[shopId]) {
context.commit('newCart', shopId)
}
cartList[shopId].list.forEach((el, index) => {
if (el.iid == payload.iid) {
context.commit('addCounter', { shopId: shopId, index: index })
flag = false
resolve('数量+1')
}
})
if (flag) {
payload.count = 1
context.commit('addToCart', { shopId: shopId, food: payload })
resolve('添加成功')
}
})
},
reduceCart(context, payload) {
return new Promise((resolve) => {
let cartList = context.state.cartList
let shopId = payload.shopId
cartList[shopId].list.forEach((el, index) => {
if (el.iid == payload.iid) {
if (el.count > 1) {
context.commit('reduceFromCart', { shopId: shopId, index: index })
resolve('数量-1')
} else {
context.commit('removeFromCart', { shopId: shopId, index: index })
resolve('删除成功')
}
}
})
})
}
}

@ -0,0 +1,3 @@
export default {
}

@ -0,0 +1,23 @@
import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
import modules from './modules'
Vue.use(Vuex)
const state = {
cartList: {}
}
const store = new Vuex.Store({
state,
mutations,
actions,
getters,
modules
})
export default store

@ -0,0 +1,3 @@
export default {
}

@ -0,0 +1,2 @@
export const ADD_COUNTER = 'add_counter'
export const ADD_TO_CART = 'add_to_cart'

@ -0,0 +1,24 @@
export default {
newCart(state, shopId) { //初始化购物车
state.cartList[shopId] = {
shopId: shopId,
list: []
}
},
addCounter(state, payload) {
state.cartList[payload.shopId].list[payload.index].count++
},
addToCart(state, payload) {
state.cartList[payload.shopId].list.push(payload.food)
},
reduceFromCart(state, payload) {
state.cartList[payload.shopId].list[payload.index].count--
},
removeFromCart(state, payload) {
state.cartList[payload.shopId].list.splice(payload.index, 1)
},
setInfo(state, payload) {
state.userInfo = payload
}
}

@ -0,0 +1,87 @@
<template>
<div id="area">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>添加学院</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field autosize clearable name="area.areaName" v-model="areaName" label="学院名称:" placeholder="请输入学院名称" :rules="[{ required: true, message: '请填写学院名称' }]" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { addArea} from "../../network/Area";
export default {
name: "AreaAdd",
components: {
NavBar,
Scroll,
},
data() {
return {
areaName: "", //
}
},
mounted() {
},
created() {
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onSubmit(area) { //
addArea(area).then(res => {
console.log(res)
this.$notify.success('添加成功~')
}).catch(error => { this.$notify.error(error)})
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#area {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
</style>

@ -0,0 +1,146 @@
<template>
<div id="area">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>学院详情</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<div class="main-box">
<div class="info-bar">
<span class="title2">&nbsp;学院id</span>
<span class="title3">{{areaId}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;学院名称</span>
<span class="title3">{{areaName}}</span>
</div>
</div>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit" @click.stop="back">返回</van-button>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { getArea } from "../../network/Area";
export default {
name: "AreaDetail",
components: {
NavBar,
Scroll,
},
data() {
return {
areaId: "", //id
areaName: "", //
}
},
created() {
this.areaId = this.$route.params.areaId; //id
//
getArea(this.areaId).then(res => {
var area = res.data;
this.areaName = area.areaName;
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.replace('/area/list')
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#area {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.header {
background-color: #fff;
position: relative;
padding: 0 15px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.header p{
margin-top: 40px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
.main-box {
background-color: #fff;
margin: 10px 0;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.info-bar {
height: auto;
border-bottom: 1px solid #f3f3f3;
padding: 0 15px;
display: block;
clear:both;
}
.title2 {
width:35%;
line-height: 46px;
font-weight: 600;
font-family: 'icomoon';
}
.title3 {
width: auto;
height: 100%;
text-align: right;
line-height: 46px;
color: #3c3c3c;
float: right;
}
.desc {
width: 100%;
line-height: 25px;
color: #3c3c3c;
clear:both;
}
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
border-radius: 3px;
}
</style>

@ -0,0 +1,73 @@
.areaList {
width: 100%;
height: auto;
flex-direction: column;
display: flex;
margin-top: 0px;
}
.areaItem {
margin: 5px;
width: 98%;
height: auto;
border-top: 1px solid #ededed;
text-align: left;
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 5px;
position: relative;
}
.areaItem .content_view {
display: flex;
flex-direction: row;
}
.areaItem .areaImg {
width: 30%;
text-align: right;
padding: 2px;
border-right: 1px solid #eee;
}
.areaItem .areaImg img {
width: 100%;
height: auto;
}
.areaItem .areaText {
width:70%;
display: flex;
flex-direction: column;
padding-left: 5px;
}
.areaItem .areaText div {
line-height: 25px;
height: auto;
}
.areaItem .opt_view {
display:block;
width: 100%;
margin-top: 2px;
margin-bottom: 5px;
text-align: right;
}
.areaQueryForm {
width: 100%;
height: auto;
}
.areaQueryForm h3 {
text-align: center;
margin-top: 20px;
margin-bottom: 10px;
}
.areaQueryForm .queryBtn {
text-align: right;
margin: 10px;
}

@ -0,0 +1,166 @@
<template>
<div id="area">
<van-popup v-model="showQueryAreaForm" closeable position="top" :style="{ height: 'auto' }">
<div class="areaQueryForm">
<h3>学院查询</h3>
<div class="queryBtn">
<van-button round size= small type="primary" @click="queryArea"></van-button>
</div>
</div>
</van-popup>
<nav-bar class="nav" ref="nav" >
<template v-slot:left><van-icon name="plus" size="25" v-show="false" @click.stop="areaAdd" /></template>
<template v-slot:center>学院列表</template>
<template v-slot:right><van-icon name="search" size="25" @click.stop="showQueryAreaForm=true" /></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" @iscroll="contentScroll">
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<div class="areaList">
<template v-for="area in areaList">
<div class="areaItem" :key="area.areaId" @click.stop="areaDetailClick(`${area.areaId}`)">
<div class="content_view">
<div class="areaText">
<div>学院id{{area.areaId}}</div>
<div>学院名称{{area.areaName}}</div>
</div>
</div>
<div class="opt_view" v-show="false">
<van-button round size= small type="primary" @click.stop="areaEditClick(`${area.areaId}`)" >编辑</van-button>
<van-button round size= small type="warning" @click.stop="areaDeleteClick(`${area.areaId}`)" style="margin-left:10px;">删除</van-button>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
<return-top @returnTop="returnTop" v-show="isReturnTop"></return-top>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ReturnTop from '../../components/common/returntop/ReturnTop'
import {queryArea,deleteArea} from '../../network/Area'
export default {
name: 'AreaList',
components: {
NavBar,
Scroll,
ReturnTop
},
data() {
return {
areaList: [], //
pullFlag: true, //
page: 1, //1
showQueryAreaForm: false, //
isReturnTop: false,
}
},
created() {
//
this.areaQuery("");
document.getElementById("tabbar").style.display = "flex";
},
methods: {
areaAdd() {
this.$router.push('/area/add'); //
},
queryArea() {
this.page = 1;
this.areaList = [];
this.pullFlag = false;
this.showQueryAreaForm = false;
this.areaQuery("QUERY");
},
areaQuery(action) {
queryArea(this.page).then(res => {
//this.areaList.push(...res.data)
this.areaList = this.areaList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
areaDetailClick(areaId) {
this.$router.push('/area/detail/' + areaId); //
},
areaEditClick(areaId) {
this.$router.push('/area/modify/' + areaId); //
},
areaDeleteClick(areaId) {
this.$dialog.confirm({
title: '删除学院:' + areaId,
message: '确定删除吗?'
}).then(() => {
deleteArea(areaId).then(res => {
console.log(res)
this.areaList.forEach(function(area, index, arr) {
if(area.areaId == areaId) arr.splice(index, 1);
});
});
});
},
pullingDown() { //
this.page = 1;
this.areaList = [];
this.pullFlag = false;
this.areaQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.areaQuery("UP");
},
returnTop() {
this.$refs.scroll.scrollTo(0, 0)
},
//
contentScroll(position) {
this.isReturnTop = position.y < -800
},
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "AreaList.css";
#area {
height: 100vh;
width: 100vw;
position: relative;
}
</style>

@ -0,0 +1,107 @@
<template>
<div id="area">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>编辑学院</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="area.areaId" v-model="areaId" label="学院id" placeholder="请输入学院id" :rules="[{ required: true, message: '请填写学院id' }]" />
<van-field autosize clearable name="area.areaName" v-model="areaName" label="学院名称:" placeholder="请输入学院名称" :rules="[{ required: true, message: '请填写学院名称' }]" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { updateArea} from "../../network/Area";
import { getArea } from "../../network/Area";
export default {
name: "AreaAdd",
components: {
NavBar,
Scroll,
},
data() {
return {
areaId: "", //id
areaName: "", //
}
},
mounted() {
},
created() {
this.areaId = this.$route.params.areaId; //id
//
getArea(this.areaId).then(res => {
var area = res.data;
this.areaId = area.areaId; //id
this.areaName = area.areaName; //
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onSubmit(area) { //
updateArea(area).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#area {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,163 @@
<template>
<div id="claim">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>添加认领</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field v-show="false" clearable name="claim.lostFoundObj.lostFoundId" v-model="lostFoundObj_lostFoundId" label="招领信息:" />
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-picker v-show="showLostFoundObjPicker" show-toolbar :columns="lostFoundObjColumns" :default-index="1" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
<van-field autosize clearable name="claim.personName" v-model="personName" label="认领人:" placeholder="请输入认领人" :rules="[{ required: true, message: '请填写认领人' }]" />
<van-field readonly name="claim.claimTime" label="认领时间" :value="claimTime" placeholder="选择认领时间" @click="showClaimTimePicker = true" :rules="[{ required: true, message: '认领时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearClaimTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showClaimTimePicker" v-model="picker_claimTime" type="date" @cancel="showClaimTimePicker = false" title="选择认领时间" @confirm="onConfirmClaimTime" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>描述说明</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body"></div>
</div>
</div>
<van-field v-show="false" name="claim.contents" v-model="contents" rows="5" label="描述说明" type="textarea" maxlength="8000" placeholder="请输入描述说明" show-word-limit />
<VueUeditorWrap v-model="contents" :config="editorConfig" @ready="contentsEditorReady" />
<van-field autosize clearable name="claim.addTime" v-model="addTime" label="发布时间:" placeholder="请输入发布时间" :rules="[{ required: true, message: '请填写发布时间' }]" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import VueUeditorWrap from 'vue-ueditor-wrap'
import { queryAllLostFound } from '../../network/LostFound'
import { addClaim} from "../../network/Claim";
export default {
name: "ClaimAdd",
components: {
NavBar,
Scroll,
VueUeditorWrap
},
data() {
return {
lostFoundObjList: [], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: [], //Picker
personName: "", //
showClaimTimePicker:false, //Picker
claimTime: '', //
picker_claimTime: new Date(), //Picker
contents: "", //
addTime: "", //
//
editorConfig: {
//
autoHeightEnabled: false,
//
initialFrameHeight: 280,
//
initialFrameWidth: '100%',
//
//serverUrl: 'http://localhost:8080/JavaWebProject/ueditor1_4_3/jsp/controller.jsp',
}
}
},
mounted() {
},
created() {
/*查询所有招领信息初始化下拉Picker*/
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
if(this.lostFoundObjList.length > 0) {
var firstLostFoundObj = this.lostFoundObjList[0]; //
this.lostFoundObj_title = firstLostFoundObj.title;
this.lostFoundObj_lostFoundId = firstLostFoundObj.lostFoundId;
}
});
document.getElementById("tabbar").style.display = "flex";
},
methods: {
contentsEditorReady(editorInstance) {
// ueditoreditorInstance.getContent()html
//this.evtHub.$emit('editor.data', editorInstance);
console.log("准备编辑器ok",editorInstance);
},
back() {
this.$router.go(-1);
},
onConfirmLostFoundObj(value,index) {
this.lostFoundObj_title = value; //
this.lostFoundObj_lostFoundId = this.lostFoundObjList[index].lostFoundId;
this.showLostFoundObjPicker = false;
},
onSubmit(claim) { //
addClaim(claim).then(res => {
console.log(res)
this.$notify.success('添加成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmClaimTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.claimTime = year + "-" + month + "-" + day ;
this.showClaimTimePicker = false;
},
clearClaimTime() { //
this.claimTime='';
this.showClaimTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#claim {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
</style>

@ -0,0 +1,170 @@
<template>
<div id="claim">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>认领详情</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<div class="main-box">
<div class="info-bar">
<span class="title2">&nbsp;认领id</span>
<span class="title3">{{claimId}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;招领信息</span>
<span class="title3">{{lostFoundObj_title}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;认领人</span>
<span class="title3">{{personName}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;认领时间</span>
<span class="title3">{{claimTime}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;描述说明:</span>
<span class="desc" v-html="contents"> </span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;发布时间</span>
<span class="title3">{{addTime}}</span>
</div>
</div>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit" @click.stop="back">返回</van-button>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { getClaim } from "../../network/Claim";
export default {
name: "ClaimDetail",
components: {
NavBar,
Scroll,
},
data() {
return {
claimId: "", //id
lostFoundObj_title: "", //
personName: "", //
claimTime: "", //
contents: "", //
addTime: "", //
}
},
created() {
this.claimId = this.$route.params.claimId; //id
//
getClaim(this.claimId).then(res => {
var claim = res.data;
this.lostFoundObj_title = claim.lostFoundObj.title;
this.personName = claim.personName;
this.claimTime = claim.claimTime;
this.contents = claim.contents;
this.addTime = claim.addTime;
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.replace('/claim/list')
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#claim {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.header {
background-color: #fff;
position: relative;
padding: 0 15px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.header p{
margin-top: 40px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
.main-box {
background-color: #fff;
margin: 10px 0;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.info-bar {
height: auto;
border-bottom: 1px solid #f3f3f3;
padding: 0 15px;
display: block;
clear:both;
}
.title2 {
width:35%;
line-height: 46px;
font-weight: 600;
font-family: 'icomoon';
}
.title3 {
width: auto;
height: 100%;
text-align: right;
line-height: 46px;
color: #3c3c3c;
float: right;
}
.desc {
width: 100%;
line-height: 25px;
color: #3c3c3c;
clear:both;
}
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
border-radius: 3px;
}
</style>

@ -0,0 +1,73 @@
.claimList {
width: 100%;
height: auto;
flex-direction: column;
display: flex;
margin-top: 0px;
}
.claimItem {
margin: 5px;
width: 98%;
height: auto;
border-top: 1px solid #ededed;
text-align: left;
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 5px;
position: relative;
}
.claimItem .content_view {
display: flex;
flex-direction: row;
}
.claimItem .claimImg {
width: 30%;
text-align: right;
padding: 2px;
border-right: 1px solid #eee;
}
.claimItem .claimImg img {
width: 100%;
height: auto;
}
.claimItem .claimText {
width:70%;
display: flex;
flex-direction: column;
padding-left: 5px;
}
.claimItem .claimText div {
line-height: 25px;
height: auto;
}
.claimItem .opt_view {
display:block;
width: 100%;
margin-top: 2px;
margin-bottom: 5px;
text-align: right;
}
.claimQueryForm {
width: 100%;
height: auto;
}
.claimQueryForm h3 {
text-align: center;
margin-top: 20px;
margin-bottom: 10px;
}
.claimQueryForm .queryBtn {
text-align: right;
margin: 10px;
}

@ -0,0 +1,217 @@
<template>
<div id="claim">
<van-popup v-model="showQueryClaimForm" closeable position="top" :style="{ height: 'auto' }">
<div class="claimQueryForm">
<h3>认领查询</h3>
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-popup v-model="showLostFoundObjPicker" position="bottom">
<van-picker show-toolbar :columns="lostFoundObjColumns" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
</van-popup>
<van-field clearable v-model="personName" label="认领人:" placeholder="请输入认领人" />
<van-field readonly label="认领时间" :value="claimTime" placeholder="选择认领时间" @click="showClaimTimePicker = true">
<template #button>
<van-button size="small" type="warning" @click.stop="clearClaimTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showClaimTimePicker" v-model="picker_claimTime" type="date" @cancel="showClaimTimePicker = false" title="选择认领时间" @confirm="onConfirmClaimTime" />
<div class="queryBtn">
<van-button round size= small type="primary" @click="queryClaim"></van-button>
</div>
</div>
</van-popup>
<nav-bar class="nav" ref="nav" >
<template v-slot:left><van-icon name="plus" size="25" v-show="false" @click.stop="claimAdd" /></template>
<template v-slot:center>认领列表</template>
<template v-slot:right><van-icon name="search" size="25" @click.stop="showQueryClaimForm=true" /></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" @iscroll="contentScroll">
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<div class="claimList">
<template v-for="claim in claimList">
<div class="claimItem" :key="claim.claimId" @click.stop="claimDetailClick(`${claim.claimId}`)">
<div class="content_view">
<div class="claimText">
<div>招领信息{{claim.lostFoundObj.title}}</div>
<div>认领人{{claim.personName}}</div>
<div>认领时间{{claim.claimTime}}</div>
<div>发布时间{{claim.addTime}}</div>
</div>
</div>
<div class="opt_view" v-show="false">
<van-button round size= small type="primary" @click.stop="claimEditClick(`${claim.claimId}`)" >编辑</van-button>
<van-button round size= small type="warning" @click.stop="claimDeleteClick(`${claim.claimId}`)" style="margin-left:10px;">删除</van-button>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
<return-top @returnTop="returnTop" v-show="isReturnTop"></return-top>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ReturnTop from '../../components/common/returntop/ReturnTop'
import {queryClaim,deleteClaim} from '../../network/Claim'
import { queryAllLostFound } from '../../network/LostFound'
export default {
name: 'ClaimList',
components: {
NavBar,
Scroll,
ReturnTop
},
data() {
return {
claimList: [], //
lostFoundObjList:[], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "不限制", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: ['不限制'], //Picker
personName: "", //
claimTime: "", //
showClaimTimePicker: false, //Picker
picker_claimTime: new Date(), //Picker
pullFlag: true, //
page: 1, //1
showQueryClaimForm: false, //
isReturnTop: false,
}
},
created() {
//
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
});
//
this.claimQuery("");
document.getElementById("tabbar").style.display = "flex";
},
methods: {
onConfirmLostFoundObj(value,index) { //
this.lostFoundObj_title = value;
if(index == 0) this.lostFoundObj_lostFoundId = 0;
else this.lostFoundObj_lostFoundId = this.lostFoundObjList[index-1].lostFoundId;
this.showLostFoundObjPicker = false;
},
onConfirmClaimTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.claimTime = year + "-" + month + "-" + day ;
this.showClaimTimePicker = false;
},
clearClaimTime() { //
this.claimTime=''
this.showClaimTimePicker=false;
},
claimAdd() {
this.$router.push('/claim/add'); //
},
queryClaim() {
this.page = 1;
this.claimList = [];
this.pullFlag = false;
this.showQueryClaimForm = false;
this.claimQuery("QUERY");
},
claimQuery(action) {
queryClaim(this.lostFoundObj_lostFoundId,this.personName,this.claimTime,this.page).then(res => {
//this.claimList.push(...res.data)
this.claimList = this.claimList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
claimDetailClick(claimId) {
this.$router.push('/claim/detail/' + claimId); //
},
claimEditClick(claimId) {
this.$router.push('/claim/modify/' + claimId); //
},
claimDeleteClick(claimId) {
this.$dialog.confirm({
title: '删除认领:' + claimId,
message: '确定删除吗?'
}).then(() => {
deleteClaim(claimId).then(res => {
console.log(res)
this.claimList.forEach(function(claim, index, arr) {
if(claim.claimId == claimId) arr.splice(index, 1);
});
});
});
},
pullingDown() { //
this.page = 1;
this.claimList = [];
this.pullFlag = false;
this.claimQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.claimQuery("UP");
},
returnTop() {
this.$refs.scroll.scrollTo(0, 0)
},
//
contentScroll(position) {
this.isReturnTop = position.y < -800
},
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "ClaimList.css";
#claim {
height: 100vh;
width: 100vw;
position: relative;
}
</style>

@ -0,0 +1,179 @@
<template>
<div id="claim">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>编辑认领</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="claim.claimId" v-model="claimId" label="认领id" placeholder="请输入认领id" :rules="[{ required: true, message: '请填写认领id' }]" />
<van-field v-show="false" clearable name="claim.lostFoundObj.lostFoundId" v-model="lostFoundObj_lostFoundId" label="招领信息:" />
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-picker v-show="showLostFoundObjPicker" show-toolbar :columns="lostFoundObjColumns" :default-index="1" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
<van-field autosize clearable name="claim.personName" v-model="personName" label="认领人:" placeholder="请输入认领人" :rules="[{ required: true, message: '请填写认领人' }]" />
<van-field readonly name="claim.claimTime" label="认领时间" :value="claimTime" placeholder="选择认领时间" @click="showClaimTimePicker = true" :rules="[{ required: true, message: '认领时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearClaimTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showClaimTimePicker" v-model="picker_claimTime" type="date" @cancel="showClaimTimePicker = false" title="选择认领时间" @confirm="onConfirmClaimTime" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>描述说明</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body"></div>
</div>
</div>
<van-field v-show="false" name="claim.contents" v-model="contents" rows="5" label="描述说明" type="textarea" maxlength="8000" placeholder="请输入描述说明" show-word-limit />
<VueUeditorWrap v-model="contents" :config="editorConfig" />
<van-field autosize clearable name="claim.addTime" v-model="addTime" label="发布时间:" placeholder="请输入发布时间" :rules="[{ required: true, message: '请填写发布时间' }]" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import VueUeditorWrap from 'vue-ueditor-wrap'
import { queryAllLostFound } from '../../network/LostFound'
import { updateClaim} from "../../network/Claim";
import { getClaim } from "../../network/Claim";
export default {
name: "ClaimAdd",
components: {
NavBar,
Scroll,
VueUeditorWrap
},
data() {
return {
claimId: "", //id
lostFoundObjList: [], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: [], //Picker
personName: "", //
showClaimTimePicker:false, //Picker
claimTime: '', //
picker_claimTime: new Date(), //Picker
contents: "", //
addTime: "", //
//
editorConfig: {
//
autoHeightEnabled: false,
//
initialFrameHeight: 280,
//
initialFrameWidth: '100%',
//
//serverUrl: 'http://localhost:8080/JavaWebProject/ueditor1_4_3/jsp/controller.jsp',
}
}
},
mounted() {
},
created() {
/*查询所有招领信息初始化下拉Picker*/
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
});
this.claimId = this.$route.params.claimId; //id
//
getClaim(this.claimId).then(res => {
var claim = res.data;
this.claimId = claim.claimId; //id
this.lostFoundObj_lostFoundId = claim.lostFoundObj.lostFoundId; //
this.lostFoundObj_title = claim.lostFoundObj.title;
this.personName = claim.personName; //
this.claimTime = claim.claimTime; //
this.picker_claimTime = new Date(this.claimTime.replace(/-/g, '/'))
this.contents = claim.contents; //
this.addTime = claim.addTime; //
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmLostFoundObj(value,index) {
this.lostFoundObj_title = value; //
this.lostFoundObj_lostFoundId = this.lostFoundObjList[index].lostFoundId;
this.showLostFoundObjPicker = false;
},
onSubmit(claim) { //
updateClaim(claim).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmClaimTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.claimTime = year + "-" + month + "-" + day ;
this.showClaimTimePicker = false;
},
clearClaimTime() { //
this.claimTime='';
this.showClaimTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#claim {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,195 @@
<template>
<div class="home">
<div class="bgc"></div>
<location :locationInfo="locationInfo"></location>
<!--<scroll class="content" ref="scroll" top="66" >-->
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" >
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<home-swiper></home-swiper>
<div class="praiseList">
<template v-for="praise in praiseList">
<div class="praiseItem" :key="praise.praiseId" @click.stop="praiseDetailClick(`${praise.praiseId}`)">
<div class="content_view">
<div class="praiseText">
<div>招领信息{{praise.lostFoundObj.title}}</div>
<div>标题{{praise.title}}</div>
<div>表扬时间{{praise.addTime}}</div>
</div>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
</div>
</template>
<script>
import Scroll from '../../components/common/scroll/Scroll'
import Location from './childComps/Location'
import HomeSwiper from './childComps/HomeSwiper'
import { getShop } from '../../network/home'
import {getLocation, getDistance} from '../../common/utils'
import {queryPraise,deletePraise} from '../../network/Praise'
export default {
name: 'Home',
components: {
Scroll,
Location,
HomeSwiper
},
data() {
return {
praiseList: [], //
page: 1, //1
pullFlag: true, //
storeList: [],
locationInfo: "定位中...",
sticky: false,
position: {lng: 0, lat: 0}
}
},
created() {
this.$toast.loading()
this.getLocation()
},
methods: {
getShop() {
getShop().then(ret => {
let data = ret.data
for(let i in data) {
data[i].distance = getDistance(data[i].lng, data[i].lat, this.position.lng, this.position.lat)
}
function compare(property){
return function(a,b){
var value1 = a[property];
var value2 = b[property];
return value1 - value2;
}
}
data.sort(compare('distance'))
this.storeList = data
})
},
getLocation() {
// 1000ms
new Promise((resolve, reject) => {
let timer = setTimeout(() => {
reject()
},3000)
getLocation(ret => {
console.log('定位信息', ret)
if(ret) {
let address = ret.formattedAddress
address = address.replace(ret.addressComponent.province,"")
address = address.replace(ret.addressComponent.city,"")
address = address.replace(ret.addressComponent.district,"")
address = address.replace(ret.addressComponent.township,"")
address = address.replace(ret.addressComponent.streetNumber,"")
this.locationInfo = address
this.position.lng = ret.position.lng
this.position.lat = ret.position.lat
}
this.$toast.hide()
clearTimeout(timer)
resolve()
// this.$bus.$emit('aflocation')
})
}).then(() => {
this.$toast.hide()
}).catch(() => {
this.locationInfo = "设备不支持定位"
this.$toast.hide()
// this.$bus.$emit('aflocation')
})
//
this.praiseQuery("");
},
praiseDetailClick(praiseId) {
this.$router.push('/praise/detail/' + praiseId); //
},
praiseQuery(action) {
queryPraise(0,"","",this.page).then(res => {
//this.praiseList.push(...res.data)
this.praiseList = this.praiseList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
pullingDown() { //
this.page = 1;
this.praiseList = [];
this.pullFlag = false;
this.praiseQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.praiseQuery("UP");
},
},
activated() {
this.$refs.scroll.refresh()
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "../praise/PraiseList.css";
.home {
width: 100vw;
height: 100vh;
position: relative;
background-color: #54bf8e;
background-size: 100%;
}
.content {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 49px;
}
.bgc {
width: 375px;
height: 170px;
/*background: url(~assets/images/homebg.png) no-repeat;*/
background-size: 100%;
position: fixed;
top: 0;
}
</style>

@ -0,0 +1,90 @@
<template>
<div class="branch-store" v-if="storeList.length">
<branch-store-item key="test" :storeInfo="testStore" v-if="true"></branch-store-item>
<branch-store-item v-for="(item,index) in storeList" :key="index" :storeInfo="item"></branch-store-item>
</div>
<div class="wait" v-else>...</div>
</template>
<script>
import BranchStoreItem from './BranchStoreItem'
export default {
name: 'Branchstore',
components: {
BranchStoreItem
},
props: {
storeList: {
type: Array,
default() {
return []
}
}
},
data() {
return {
testStore: {
"img": [
"/public/images/shop/sinfo1.jpg",
"/public/images/shop/sinfo2.jpg",
"/public/images/shop/sinfo3.jpg"
],
"serTime": "00:00 - 23:59",
"tip": "测试测试测试测试测试测试测试",
"discounts": [
{
"attain": 0,
"discount": 0
}
],
"sold": 0,
"comment": 0,
"like": 0,
"shopId": "test",
"shopName": "测试店(有真实数据)",
"tell": "22088888",
"address": "上西天去咯",
"shopPic": "/public/images/shop/shop1.jpg",
"lng": "0",
"lat": "0",
"__v": 0,
"fulladdress": "完整地址"
}
}
}
}
</script>
<style scoped>
.branch-store {
width: 100%;
position: relative;
z-index: -2;
padding-bottom: 20px;
}
.branch-store::after {
content: '';
height: calc(100% + 300px);
width: 100%;
position: absolute;
top: 0;
left: 0;
z-index: -2;
background-color: #f3f3f3;
}
.wait {
margin-top: 200px;
text-align: center;
color: #fff;
}
.branch-store::before {
content: '';
height: 70px;
width: 100%;
position: absolute;
top: -70px;
background-color: #f3f3f3;
border-radius: 10px 10px 0 0 ;
}
</style>

@ -0,0 +1,113 @@
<template>
<div class="branch-store-item" @click="itemClick">
<div class="top">
<span class="name">{{storeInfo.shopName}}</span>
<span class="address">{{storeInfo.address}}</span>
<span class="sold">销量{{storeInfo.sold}}</span>
<img class="avatar" :src="storeInfo.shopPic"/>
</div>
<div class="bottom">
<span class="distance"><span class="icon">&nbsp;</span>距离 {{storeInfo.distance | distance}}</span>
<span class="serve"><span class="icon">&nbsp;</span>{{storeInfo.serTime}}</span>
<span class="tell"><span class="icon">&nbsp;</span>{{storeInfo.tell}}</span>
</div>
</div>
</template>
<script>
export default {
name: 'BranchStore',
props: {
storeInfo: {
type: Object,
default() {
return {}
}
}
},
methods: {
itemClick() {
this.$router.replace('shop/' + this.storeInfo.shopId)
}
},
filters: {
distance(km) {
if(!km) {
return '未知'
}
return km = km < 1 ? (km*1000).toFixed(0)+' m' : km.toFixed(2)+' km'
}
}
}
</script>
<style scoped>
.branch-store-item {
background-color: #fff;
border-radius: 5px;
margin: 10px;
box-shadow: 1px 1px 10px rgba(0, 0, 0, .1);
position: relative;
}
.top {
height: 96px;
margin: 0 20px;
border-bottom: 1px solid #d9d9d9;
}
.name {
position: absolute;
top: 20px;
font-size: 16px;
font-weight: 600;
}
.address {
position: absolute;
top: 50px;
font-size: 12px;
color: #888;
}
.sold {
position: absolute;
top: 70px;
font-size: 12px;
color: #888;
}
.bottom {
position: relative;
height: 46px;
}
.distance,
.star,
.serve,
.tell {
position: absolute;
font-size: 12px;
top: 50%;
transform: translateY(-50%);
color: #888;
}
.distance {
left: 20px;
}
.serve {
left: 50%;
transform: translate(-50%,-50%);
}
.tell {
right: 20px;
}
.icon {
font-family: 'icomoon';
vertical-align: top;
}
.avatar {
width: 66px;
height: 66px;
background-color: #f3f3f3;
position: absolute;
top: 20px;
right: 20px;
border-radius: 3px;
}
</style>

@ -0,0 +1,78 @@
<template>
<div class="swiper-container" :class="{hide: !show}">
<swiper v-if="list">
<swiper-item v-for="(item, index) in list" :key="index">
<img :src="item">
</swiper-item>
</swiper>
</div>
</template>
<script>
import Swiper from 'components/common/swiper/Swiper'
import SwiperItem from 'components/common/swiper/SwiperItem'
export default {
name: 'HomeSwiper',
components: {
Swiper,
SwiperItem
},
data() {
return {
show: true,
list: null
}
},
mounted() {
this.$bus.$on('aflocation', () => {
this.show = true
this.$bus.$off('aflocation')
})
},
created() {
let list = []
let swiperList = []
while(list.length <5 ) {
let index = Math.round(Math.random() * 10 + 1)
if(list.indexOf(index)!=-1) {
//
continue
}
list.push(index)
}
//console.log(list)
for(let i in list) {
swiperList.push(`/images/swiper/sw${list[i]}.jpg`)
}
this.list = swiperList
// let list = []
// for(let i = 0; i < 5 ; i++) {
// let index = Math.round(Math.random() * 10 + 1)
// list.push(`/public/images/swiper/sw${index}.jpg`)
// }
// this.list = list
}
}
</script>
<style>
.swiper-container {
margin: 10px;
height: 157px;
background-color: #fff;
border-radius: 10px;
/* background: url(~assets/images/sw1.png); */
/* background-size: cover; */
position: relative;
overflow: hidden;
}
.hide {
visibility: hidden;
}
img {
width: 100%;
/* height: 180px; */
}
</style>

@ -0,0 +1,46 @@
<template>
<div id="location">
<span class="icon"></span>
<span class="info">{{locationInfo}}</span>
</div>
</template>
<script>
export default {
name: 'Location',
props: {
locationInfo: {
type: String,
default: null
}
}
}
</script>
<style scoped>
#location {
width: 100%;
height: 66px;
/* background-color: #4fc08d; */
position: fixed;
}
.icon ,
.info {
position: absolute;
bottom: 20px;
font-size: 18px;
color: #fff;
}
.info {
left: 40px;
width: 170px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.icon {
font-family: 'icomoon';
font-size: 20px;
left: 14px;
}
</style>

@ -0,0 +1,151 @@
<template>
<div id="create-account">
<nav-bar class="nav">
<template v-slot:left>
<div class="back" @click="back"></div>
</template>
<template v-slot:center>创建账户</template>
</nav-bar>
<div class="info">
<div class="avatar" :style="{backgroundPosition: '0'+' '+(-offset)+'em'}"></div>
<input class="editName" type="text" maxlength="6" placeholder="请编辑用户名"
v-model.trim="nickName" v-if="isEdit" @click="focus" ref="in">
<div class="nickName" v-else>{{nickName}}</div>
<div class="check" v-if="isEdit" @click="toggle"></div>
<div class="edit" v-else @click="toggle"></div>
</div>
<avatar @avatar="avatarChange"></avatar>
<button class="register" @click="register"></button>
</div>
</template>
<script>
import NavBar from 'components/common/navbar/NavBar'
import Avatar from 'components/content/avatar/Avatar'
import {register} from 'network/login'
export default {
name: 'CreateAccount',
components: {
NavBar,
Avatar
},
data() {
return {
nickName: null,
isEdit: true,
offset: 0
}
},
methods: {
register() {
if(this.nickName) {
register(this.nickName, this.offset).then(ret => {
this.$toast.show("注册成功")
this.$router.replace('/home')
})
}else {
this.$toast.show('请填写用户名')
}
},
toggle() {
this.isEdit = !this.isEdit
},
focus() {
this.$refs.in.focus()
},
avatarChange(index) {
this.offset = index
},
back() {
this.$router.replace('/login')
}
}
}
</script>
<style scoped>
#create-account {
width: 100vw;
}
.nav {
background-color: #333;
color: #fff;
position: fixed;
top: 0;
z-index: 9;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
.info {
width: 100%;
height: 90px;
margin: 0 auto;
/* background-color: pink; */
margin-top: 60px;
position: relative;
}
.avatar {
font-size: 88px;
width: 88px;
height: 88px;
border-radius: 50%;
position: absolute;
top: 0;
left: 20px;
background: url(~assets/images/avatar.png);
background-size: 88px auto;
box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, .2);
}
.editName {
width: 120px;
position: absolute;
bottom: 0;
left: 50%;
transform: translate3d(-50%, 0, 0);
}
.nickName {
width: 120px;
position: absolute;
bottom: 0;
left: 50%;
transform: translate3d(-50%, 0, 0);
z-index: 2;
font-size: 20px;
border-bottom: 1px solid #000;
}
.edit,
.check {
width: 20px;
height: 20px;
position: absolute;
bottom: 0;
right: 100px;
font-family: 'icomoon';
color: #000;
font-size: 20px;
}
.register {
width: 80%;
height: 49px;
background-color: #333;
border: none;
display: block;
margin: 0 auto;
color: #fff;
border-radius: 4px;
font-size: 16px;
box-shadow: 0 1px 10px rgba(0, 0, 0, .5);
margin-top: 20px;
}
.editName {
background: none;
border-radius: 0;
border: none;
outline: none;
border-bottom: 1px solid #000;
font-size: 20px;
}
</style>

@ -0,0 +1,244 @@
<template>
<div id="login">
<div class="bg"></div>
<div class="box">
<nav-bar class="nav">
<template v-slot:left></template>
<template v-slot:center>注册登录</template>
</nav-bar>
<div class="content">
<div class="form">
<p>点击获取即可查看手机验证码</p>
<div class="label" @click="maskClick">
<label for="tell">手机号</label>
<input class="input1" type="text" id="tell" autocomplete="off"
ref="tell" maxlength="11" v-model="tell" @click="tellClick" @blur="blur">
</div>
<div class="label">
<label for="code">验证码</label>
<input class="input2" type="text" id="code" autocomplete="off"
ref="code" maxlength="4" v-model="code" @click="codeClick" @blur="blur">
<button class="getCode" @click="getCode" ref="send">获取验证码</button>
</div>
<button class="login" @click="login"></button>
</div>
</div>
</div>
</div>
</template>
<script>
import NavBar from 'components/common/navbar/NavBar'
import { requestCode, login} from 'network/login'
export default {
name: 'Login',
components: {
NavBar,
},
data() {
return {
isDisabled: true,
tell: '18888888888',
code: null,
timer: null
}
},
methods: {
maskClick(){
//this.$notify.error('使')
},
tellClick() {
this.$refs.tell.focus()
},
codeClick() {
this.$refs.code.focus()
},
blur() {
window.scroll(0, 0)
},
getCode() { //
let tell = this.$refs.tell.value
if(!tell) {
this.$toast.show('手机不能为空')
}else {
if(!(/^1[3456789]\d{9}$/.test(tell))){
this.$toast.show('手机格式错误')
return false;
}else {
//
requestCode(this.tell).then(ret => {
this.$notify.success(`验证码为:${ret.data}`)
})
//
this.$toast.show('验证码已发送')
this.$refs.send.setAttribute('disabled', true)
let count = 30
this.$refs.send.innerHTML = count-- +'s'
this.timer = setInterval(() => {
this.$refs.send.innerHTML = count-- +'s'
}, 1000);
setTimeout(()=> {
clearInterval(this.timer)
this.$refs.send.innerHTML = '获取验证码'
this.$refs.send.removeAttribute('disabled')
},30000)
}
}
},
login() { //
if(!(/^1[3456789]\d{9}$/.test(this.tell)) || !(/^\d{4}$/.test(this.code))) {
this.$toast.show('填写错误')
}else {
login(this.tell, this.code).then(ret => {
if(ret.code == 90006) {
this.$notify.error('验证码错误')
}else {
this.$notify.success(ret.msg)
//accessToken
var authToken = ret.data.authToken
localStorage.setItem("x-auth-token",authToken)
localStorage.setItem("username",this.tell)
if(ret.data.new_flag == 0) {
//
this.$router.replace('/home')
}else if(ret.data.new_flag == 1) {
//
this.$router.replace('/register')
}
}
})
}
}
},
destroyed() {
clearInterval(this.timer)
}
}
</script>
<style scoped>
#login {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
background-color: #f3f3f3;
}
.nav {
background-color: #54bf8e;
color: #fff;
}
.box {
width: 360px;
height: 442px;
position: absolute;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
z-index: 9;
}
.content {
width: 100%;
height: 100%;
background-color: #fff;
padding: 25px 25px 25px 25px;
box-shadow: 0 7px 25px rgba(0, 0, 0, .1);
border-radius: 5px;
}
.box::after {
content: '';
width: 320px;
height: 400px;
background-color: #fff;
position: absolute;
bottom: -6px;
left: 50%;
transform: translate3d(-50%, 0, 0);
z-index: -1;
border-radius: 0 0 2px 2px;
box-shadow: 0 0 25px rgba(0, 0, 0, .2);
}
.form {
width: 100%;
height: 100%;
}
p {
text-align: center;
font-size: 14px;
font-weight: 600;
margin: 20px 0;
}
.label {
width: 100%;
margin-bottom: 30px;
font-size: 14px;
}
.login {
width: 100%;
height: 48px;
padding: 15px;
font-size: 16px;
text-align: center;
font-weight: 600;
vertical-align: middle;
border: none;
background-color: #333;
color: #fff;
box-shadow: 0 2px 10px 1px rgba(0, 0, 0, .6);
border-radius: 5px;
}
label {
width: 100%;
height: 19px;
margin-bottom: 5px;
display: block;
font-weight: 600;
}
.input1,
.input2 {
height: 45px;
border: none;
background-color: #f3f3f3;
outline: none;
text-indent: 1.5em;
border-radius: 2px;
}
.input1 {
width: 100%;
}
.input2 {
width: 68%;
margin-right: 2%;
}
.getCode {
width: 30%;
background-color: #333;
color: #fff;
border: none;
height: 45px;
border-radius: 2px;
font-weight: 600;
}
.bg {
width: 100%;
height: 11%;
background: url(~assets/images/fuji.jpg);
background-size: cover;
}
button:disabled {
background-color: #f3f3f3;
color: #333;
}
</style>

@ -0,0 +1,134 @@
<template>
<div id="notice">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>添加站内通知</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field autosize clearable name="notice.title" v-model="title" label="标题:" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>内容</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body"></div>
</div>
</div>
<van-field v-show="false" name="notice.content" v-model="content" rows="5" label="内容" type="textarea" maxlength="8000" placeholder="请输入内容" show-word-limit />
<VueUeditorWrap v-model="content" :config="editorConfig" @ready="contentEditorReady" />
<van-field readonly name="notice.addTime" label="发布时间" :value="addTime" placeholder="选择发布时间" @click="showAddTimePicker = true" :rules="[{ required: true, message: '发布时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择发布时间" @confirm="onConfirmAddTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import VueUeditorWrap from 'vue-ueditor-wrap'
import { addNotice} from "../../network/Notice";
export default {
name: "NoticeAdd",
components: {
NavBar,
Scroll,
VueUeditorWrap
},
data() {
return {
title: "", //
content: "", //
showAddTimePicker:false, //Picker
addTime: '', //
picker_addTime: new Date(), //Picker
//
editorConfig: {
//
autoHeightEnabled: false,
//
initialFrameHeight: 280,
//
initialFrameWidth: '100%',
//
//serverUrl: 'http://localhost:8080/JavaWebProject/ueditor1_4_3/jsp/controller.jsp',
}
}
},
mounted() {
},
created() {
document.getElementById("tabbar").style.display = "flex";
},
methods: {
contentEditorReady(editorInstance) {
// ueditoreditorInstance.getContent()html
//this.evtHub.$emit('editor.data', editorInstance);
console.log("准备编辑器ok",editorInstance);
},
back() {
this.$router.go(-1);
},
onSubmit(notice) { //
addNotice(notice).then(res => {
console.log(res)
this.$notify.success('添加成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime='';
this.showAddTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#notice {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
</style>

@ -0,0 +1,158 @@
<template>
<div id="notice">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>站内通知详情</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<div class="main-box">
<div class="info-bar">
<span class="title2">&nbsp;通知id</span>
<span class="title3">{{noticeId}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;标题</span>
<span class="title3">{{title}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;内容:</span>
<span class="desc" v-html="content"> </span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;发布时间</span>
<span class="title3">{{addTime}}</span>
</div>
</div>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit" @click.stop="back">返回</van-button>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { getNotice } from "../../network/Notice";
export default {
name: "NoticeDetail",
components: {
NavBar,
Scroll,
},
data() {
return {
noticeId: "", //id
title: "", //
content: "", //
addTime: "", //
}
},
created() {
this.noticeId = this.$route.params.noticeId; //id
//
getNotice(this.noticeId).then(res => {
var notice = res.data;
this.title = notice.title;
this.content = notice.content;
this.addTime = notice.addTime;
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.replace('/notice/list')
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#notice {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.header {
background-color: #fff;
position: relative;
padding: 0 15px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.header p{
margin-top: 40px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
.main-box {
background-color: #fff;
margin: 10px 0;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.info-bar {
height: auto;
border-bottom: 1px solid #f3f3f3;
padding: 0 15px;
display: block;
clear:both;
}
.title2 {
width:35%;
line-height: 46px;
font-weight: 600;
font-family: 'icomoon';
}
.title3 {
width: auto;
height: 100%;
text-align: right;
line-height: 46px;
color: #3c3c3c;
float: right;
}
.desc {
width: 100%;
line-height: 25px;
color: #3c3c3c;
clear:both;
}
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
border-radius: 3px;
}
</style>

@ -0,0 +1,73 @@
.noticeList {
width: 100%;
height: auto;
flex-direction: column;
display: flex;
margin-top: 0px;
}
.noticeItem {
margin: 5px;
width: 98%;
height: auto;
border-top: 1px solid #ededed;
text-align: left;
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 5px;
position: relative;
}
.noticeItem .content_view {
display: flex;
flex-direction: row;
}
.noticeItem .noticeImg {
width: 30%;
text-align: right;
padding: 2px;
border-right: 1px solid #eee;
}
.noticeItem .noticeImg img {
width: 100%;
height: auto;
}
.noticeItem .noticeText {
width:70%;
display: flex;
flex-direction: column;
padding-left: 5px;
}
.noticeItem .noticeText div {
line-height: 25px;
height: auto;
}
.noticeItem .opt_view {
display:block;
width: 100%;
margin-top: 2px;
margin-bottom: 5px;
text-align: right;
}
.noticeQueryForm {
width: 100%;
height: auto;
}
.noticeQueryForm h3 {
text-align: center;
margin-top: 20px;
margin-bottom: 10px;
}
.noticeQueryForm .queryBtn {
text-align: right;
margin: 10px;
}

@ -0,0 +1,190 @@
<template>
<div id="notice">
<van-popup v-model="showQueryNoticeForm" closeable position="top" :style="{ height: 'auto' }">
<div class="noticeQueryForm">
<h3>站内通知查询</h3>
<van-field clearable v-model="title" label="标题:" placeholder="请输入标题" />
<van-field readonly label="发布时间" :value="addTime" placeholder="选择发布时间" @click="showAddTimePicker = true">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择发布时间" @confirm="onConfirmAddTime" />
<div class="queryBtn">
<van-button round size= small type="primary" @click="queryNotice"></van-button>
</div>
</div>
</van-popup>
<nav-bar class="nav" ref="nav" >
<template v-slot:left><van-icon name="plus" size="25" v-show="false" @click.stop="noticeAdd" /></template>
<template v-slot:center>站内通知列表</template>
<template v-slot:right><van-icon name="search" size="25" @click.stop="showQueryNoticeForm=true" /></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" @iscroll="contentScroll">
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<div class="noticeList">
<template v-for="notice in noticeList">
<div class="noticeItem" :key="notice.noticeId" @click.stop="noticeDetailClick(`${notice.noticeId}`)">
<div class="content_view">
<div class="noticeText">
<div>标题{{notice.title}}</div>
<div>发布时间{{notice.addTime}}</div>
</div>
</div>
<div class="opt_view" v-show="false">
<van-button round size= small type="primary" @click.stop="noticeEditClick(`${notice.noticeId}`)" >编辑</van-button>
<van-button round size= small type="warning" @click.stop="noticeDeleteClick(`${notice.noticeId}`)" style="margin-left:10px;">删除</van-button>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
<return-top @returnTop="returnTop" v-show="isReturnTop"></return-top>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ReturnTop from '../../components/common/returntop/ReturnTop'
import {queryNotice,deleteNotice} from '../../network/Notice'
export default {
name: 'NoticeList',
components: {
NavBar,
Scroll,
ReturnTop
},
data() {
return {
noticeList: [], //
title: "", //
addTime: "", //
showAddTimePicker: false, //Picker
picker_addTime: new Date(), //Picker
pullFlag: true, //
page: 1, //1
showQueryNoticeForm: false, //
isReturnTop: false,
}
},
created() {
//
this.noticeQuery("");
document.getElementById("tabbar").style.display = "flex";
},
methods: {
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime=''
this.showAddTimePicker=false;
},
noticeAdd() {
this.$router.push('/notice/add'); //
},
queryNotice() {
this.page = 1;
this.noticeList = [];
this.pullFlag = false;
this.showQueryNoticeForm = false;
this.noticeQuery("QUERY");
},
noticeQuery(action) {
queryNotice(this.title,this.addTime,this.page).then(res => {
//this.noticeList.push(...res.data)
this.noticeList = this.noticeList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
noticeDetailClick(noticeId) {
this.$router.push('/notice/detail/' + noticeId); //
},
noticeEditClick(noticeId) {
this.$router.push('/notice/modify/' + noticeId); //
},
noticeDeleteClick(noticeId) {
this.$dialog.confirm({
title: '删除站内通知:' + noticeId,
message: '确定删除吗?'
}).then(() => {
deleteNotice(noticeId).then(res => {
console.log(res)
this.noticeList.forEach(function(notice, index, arr) {
if(notice.noticeId == noticeId) arr.splice(index, 1);
});
});
});
},
pullingDown() { //
this.page = 1;
this.noticeList = [];
this.pullFlag = false;
this.noticeQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.noticeQuery("UP");
},
returnTop() {
this.$refs.scroll.scrollTo(0, 0)
},
//
contentScroll(position) {
this.isReturnTop = position.y < -800
},
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "NoticeList.css";
#notice {
height: 100vh;
width: 100vw;
position: relative;
}
</style>

@ -0,0 +1,152 @@
<template>
<div id="notice">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>编辑站内通知</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="notice.noticeId" v-model="noticeId" label="通知id" placeholder="请输入通知id" :rules="[{ required: true, message: '请填写通知id' }]" />
<van-field autosize clearable name="notice.title" v-model="title" label="标题:" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>内容</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body"></div>
</div>
</div>
<van-field v-show="false" name="notice.content" v-model="content" rows="5" label="内容" type="textarea" maxlength="8000" placeholder="请输入内容" show-word-limit />
<VueUeditorWrap v-model="content" :config="editorConfig" />
<van-field readonly name="notice.addTime" label="发布时间" :value="addTime" placeholder="选择发布时间" @click="showAddTimePicker = true" :rules="[{ required: true, message: '发布时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择发布时间" @confirm="onConfirmAddTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import VueUeditorWrap from 'vue-ueditor-wrap'
import { updateNotice} from "../../network/Notice";
import { getNotice } from "../../network/Notice";
export default {
name: "NoticeAdd",
components: {
NavBar,
Scroll,
VueUeditorWrap
},
data() {
return {
noticeId: "", //id
title: "", //
content: "", //
showAddTimePicker:false, //Picker
addTime: '', //
picker_addTime: new Date(), //Picker
//
editorConfig: {
//
autoHeightEnabled: false,
//
initialFrameHeight: 280,
//
initialFrameWidth: '100%',
//
//serverUrl: 'http://localhost:8080/JavaWebProject/ueditor1_4_3/jsp/controller.jsp',
}
}
},
mounted() {
},
created() {
this.noticeId = this.$route.params.noticeId; //id
//
getNotice(this.noticeId).then(res => {
var notice = res.data;
this.noticeId = notice.noticeId; //id
this.title = notice.title; //
this.content = notice.content; //
this.addTime = notice.addTime; //
this.picker_addTime = new Date(this.addTime.replace(/-/g, '/'))
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onSubmit(notice) { //
updateNotice(notice).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime='';
this.showAddTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#notice {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,136 @@
<template>
<div id="praise">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>添加表扬</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field v-show="false" clearable name="praise.lostFoundObj.lostFoundId" v-model="lostFoundObj_lostFoundId" label="招领信息:" />
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-picker v-show="showLostFoundObjPicker" show-toolbar :columns="lostFoundObjColumns" :default-index="1" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
<van-field autosize clearable name="praise.title" v-model="title" label="标题:" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
<van-field autosize clearable name="praise.contents" v-model="contents" label="表扬内容:" placeholder="请输入表扬内容" :rules="[{ required: true, message: '请填写表扬内容' }]" />
<van-field readonly name="praise.addTime" label="表扬时间" :value="addTime" placeholder="选择表扬时间" @click="showAddTimePicker = true" :rules="[{ required: true, message: '表扬时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择表扬时间" @confirm="onConfirmAddTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { queryAllLostFound } from '../../network/LostFound'
import { addPraise} from "../../network/Praise";
export default {
name: "PraiseAdd",
components: {
NavBar,
Scroll,
},
data() {
return {
lostFoundObjList: [], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: [], //Picker
title: "", //
contents: "", //
showAddTimePicker:false, //Picker
addTime: '', //
picker_addTime: new Date(), //Picker
}
},
mounted() {
},
created() {
/*查询所有招领信息初始化下拉Picker*/
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
if(this.lostFoundObjList.length > 0) {
var firstLostFoundObj = this.lostFoundObjList[0]; //
this.lostFoundObj_title = firstLostFoundObj.title;
this.lostFoundObj_lostFoundId = firstLostFoundObj.lostFoundId;
}
});
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmLostFoundObj(value,index) {
this.lostFoundObj_title = value; //
this.lostFoundObj_lostFoundId = this.lostFoundObjList[index].lostFoundId;
this.showLostFoundObjPicker = false;
},
onSubmit(praise) { //
addPraise(praise).then(res => {
console.log(res)
this.$notify.success('添加成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime='';
this.showAddTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#praise {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
</style>

@ -0,0 +1,166 @@
<template>
<div id="praise">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>表扬详情</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<div class="main-box">
<div class="info-bar">
<span class="title2">&nbsp;表扬id</span>
<span class="title3">{{praiseId}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;招领信息</span>
<span class="title3">{{lostFoundObj_title}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;标题</span>
<span class="title3">{{title}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;表扬内容</span>
<span class="title3">{{contents}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;表扬时间</span>
<span class="title3">{{addTime}}</span>
</div>
</div>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit" @click.stop="back">返回</van-button>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { getPraise } from "../../network/Praise";
export default {
name: "PraiseDetail",
components: {
NavBar,
Scroll,
},
data() {
return {
praiseId: "", //id
lostFoundObj_title: "", //
title: "", //
contents: "", //
addTime: "", //
}
},
created() {
this.praiseId = this.$route.params.praiseId; //id
//
getPraise(this.praiseId).then(res => {
var praise = res.data;
this.lostFoundObj_title = praise.lostFoundObj.title;
this.title = praise.title;
this.contents = praise.contents;
this.addTime = praise.addTime;
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
//this.$router.replace('/praise/list')
this.$router.go(-1)
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#praise {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.header {
background-color: #fff;
position: relative;
padding: 0 15px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.header p{
margin-top: 40px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
.main-box {
background-color: #fff;
margin: 10px 0;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.info-bar {
height: auto;
border-bottom: 1px solid #f3f3f3;
padding: 0 15px;
display: block;
clear:both;
}
.title2 {
width:35%;
line-height: 46px;
font-weight: 600;
font-family: 'icomoon';
}
.title3 {
width: auto;
height: 100%;
text-align: right;
line-height: 46px;
color: #3c3c3c;
float: right;
}
.desc {
width: 100%;
line-height: 25px;
color: #3c3c3c;
clear:both;
}
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
border-radius: 3px;
}
</style>

@ -0,0 +1,73 @@
.praiseList {
width: 100%;
height: auto;
flex-direction: column;
display: flex;
margin-top: 0px;
}
.praiseItem {
margin: 5px;
width: 98%;
height: auto;
border-top: 1px solid #ededed;
text-align: left;
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 5px;
position: relative;
}
.praiseItem .content_view {
display: flex;
flex-direction: row;
}
.praiseItem .praiseImg {
width: 30%;
text-align: right;
padding: 2px;
border-right: 1px solid #eee;
}
.praiseItem .praiseImg img {
width: 100%;
height: auto;
}
.praiseItem .praiseText {
width:70%;
display: flex;
flex-direction: column;
padding-left: 5px;
}
.praiseItem .praiseText div {
line-height: 25px;
height: auto;
}
.praiseItem .opt_view {
display:block;
width: 100%;
margin-top: 2px;
margin-bottom: 5px;
text-align: right;
}
.praiseQueryForm {
width: 100%;
height: auto;
}
.praiseQueryForm h3 {
text-align: center;
margin-top: 20px;
margin-bottom: 10px;
}
.praiseQueryForm .queryBtn {
text-align: right;
margin: 10px;
}

@ -0,0 +1,216 @@
<template>
<div id="praise">
<van-popup v-model="showQueryPraiseForm" closeable position="top" :style="{ height: 'auto' }">
<div class="praiseQueryForm">
<h3>表扬查询</h3>
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-popup v-model="showLostFoundObjPicker" position="bottom">
<van-picker show-toolbar :columns="lostFoundObjColumns" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
</van-popup>
<van-field clearable v-model="title" label="标题:" placeholder="请输入标题" />
<van-field readonly label="表扬时间" :value="addTime" placeholder="选择表扬时间" @click="showAddTimePicker = true">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择表扬时间" @confirm="onConfirmAddTime" />
<div class="queryBtn">
<van-button round size= small type="primary" @click="queryPraise"></van-button>
</div>
</div>
</van-popup>
<nav-bar class="nav" ref="nav" >
<template v-slot:left><van-icon name="plus" size="25" v-show="false" @click.stop="praiseAdd" /></template>
<template v-slot:center>表扬列表</template>
<template v-slot:right><van-icon name="search" size="25" @click.stop="showQueryPraiseForm=true" /></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" @iscroll="contentScroll">
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<div class="praiseList">
<template v-for="praise in praiseList">
<div class="praiseItem" :key="praise.praiseId" @click.stop="praiseDetailClick(`${praise.praiseId}`)">
<div class="content_view">
<div class="praiseText">
<div>招领信息{{praise.lostFoundObj.title}}</div>
<div>标题{{praise.title}}</div>
<div>表扬时间{{praise.addTime}}</div>
</div>
</div>
<div class="opt_view" v-show="false">
<van-button round size= small type="primary" @click.stop="praiseEditClick(`${praise.praiseId}`)" >编辑</van-button>
<van-button round size= small type="warning" @click.stop="praiseDeleteClick(`${praise.praiseId}`)" style="margin-left:10px;">删除</van-button>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
<return-top @returnTop="returnTop" v-show="isReturnTop"></return-top>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ReturnTop from '../../components/common/returntop/ReturnTop'
import {queryPraise,deletePraise} from '../../network/Praise'
import { queryAllLostFound } from '../../network/LostFound'
export default {
name: 'PraiseList',
components: {
NavBar,
Scroll,
ReturnTop
},
data() {
return {
praiseList: [], //
lostFoundObjList:[], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "不限制", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: ['不限制'], //Picker
title: "", //
addTime: "", //
showAddTimePicker: false, //Picker
picker_addTime: new Date(), //Picker
pullFlag: true, //
page: 1, //1
showQueryPraiseForm: false, //
isReturnTop: false,
}
},
created() {
//
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
});
//
this.praiseQuery("");
document.getElementById("tabbar").style.display = "flex";
},
methods: {
onConfirmLostFoundObj(value,index) { //
this.lostFoundObj_title = value;
if(index == 0) this.lostFoundObj_lostFoundId = 0;
else this.lostFoundObj_lostFoundId = this.lostFoundObjList[index-1].lostFoundId;
this.showLostFoundObjPicker = false;
},
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime=''
this.showAddTimePicker=false;
},
praiseAdd() {
this.$router.push('/praise/add'); //
},
queryPraise() {
this.page = 1;
this.praiseList = [];
this.pullFlag = false;
this.showQueryPraiseForm = false;
this.praiseQuery("QUERY");
},
praiseQuery(action) {
queryPraise(this.lostFoundObj_lostFoundId,this.title,this.addTime,this.page).then(res => {
//this.praiseList.push(...res.data)
this.praiseList = this.praiseList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
praiseDetailClick(praiseId) {
this.$router.push('/praise/detail/' + praiseId); //
},
praiseEditClick(praiseId) {
this.$router.push('/praise/modify/' + praiseId); //
},
praiseDeleteClick(praiseId) {
this.$dialog.confirm({
title: '删除表扬:' + praiseId,
message: '确定删除吗?'
}).then(() => {
deletePraise(praiseId).then(res => {
console.log(res)
this.praiseList.forEach(function(praise, index, arr) {
if(praise.praiseId == praiseId) arr.splice(index, 1);
});
});
});
},
pullingDown() { //
this.page = 1;
this.praiseList = [];
this.pullFlag = false;
this.praiseQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.praiseQuery("UP");
},
returnTop() {
this.$refs.scroll.scrollTo(0, 0)
},
//
contentScroll(position) {
this.isReturnTop = position.y < -800
},
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "PraiseList.css";
#praise {
height: 100vh;
width: 100vw;
position: relative;
}
</style>

@ -0,0 +1,156 @@
<template>
<div id="praise">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>编辑表扬</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="praise.praiseId" v-model="praiseId" label="表扬id" placeholder="请输入表扬id" :rules="[{ required: true, message: '请填写表扬id' }]" />
<van-field v-show="false" clearable name="praise.lostFoundObj.lostFoundId" v-model="lostFoundObj_lostFoundId" label="招领信息:" />
<van-field readonly clickable label="招领信息" :value="lostFoundObj_title" right-icon="arrow-down" placeholder="选择招领信息" @click="showLostFoundObjPicker = true" />
<van-picker v-show="showLostFoundObjPicker" show-toolbar :columns="lostFoundObjColumns" :default-index="1" @cancel="showLostFoundObjPicker = false" @confirm="onConfirmLostFoundObj" />
<van-field autosize clearable name="praise.title" v-model="title" label="标题:" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
<van-field autosize clearable name="praise.contents" v-model="contents" label="表扬内容:" placeholder="请输入表扬内容" :rules="[{ required: true, message: '请填写表扬内容' }]" />
<van-field readonly name="praise.addTime" label="表扬时间" :value="addTime" placeholder="选择表扬时间" @click="showAddTimePicker = true" :rules="[{ required: true, message: '表扬时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearAddTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showAddTimePicker" v-model="picker_addTime" type="date" @cancel="showAddTimePicker = false" title="选择表扬时间" @confirm="onConfirmAddTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { queryAllLostFound } from '../../network/LostFound'
import { updatePraise} from "../../network/Praise";
import { getPraise } from "../../network/Praise";
export default {
name: "PraiseAdd",
components: {
NavBar,
Scroll,
},
data() {
return {
praiseId: "", //id
lostFoundObjList: [], //
lostFoundObj_lostFoundId: 0, //id
lostFoundObj_title: "", //
showLostFoundObjPicker: false, //Picker
lostFoundObjColumns: [], //Picker
title: "", //
contents: "", //
showAddTimePicker:false, //Picker
addTime: '', //
picker_addTime: new Date(), //Picker
}
},
mounted() {
},
created() {
/*查询所有招领信息初始化下拉Picker*/
queryAllLostFound().then(res => {
this.lostFoundObjList = res.data;
for(var i=0;i<this.lostFoundObjList.length;i++) {
this.lostFoundObjColumns.push(this.lostFoundObjList[i].title)
}
});
this.praiseId = this.$route.params.praiseId; //id
//
getPraise(this.praiseId).then(res => {
var praise = res.data;
this.praiseId = praise.praiseId; //id
this.lostFoundObj_lostFoundId = praise.lostFoundObj.lostFoundId; //
this.lostFoundObj_title = praise.lostFoundObj.title;
this.title = praise.title; //
this.contents = praise.contents; //
this.addTime = praise.addTime; //
this.picker_addTime = new Date(this.addTime.replace(/-/g, '/'))
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmLostFoundObj(value,index) {
this.lostFoundObj_title = value; //
this.lostFoundObj_lostFoundId = this.lostFoundObjList[index].lostFoundId;
this.showLostFoundObjPicker = false;
},
onSubmit(praise) { //
updatePraise(praise).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmAddTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.addTime = year + "-" + month + "-" + day ;
this.showAddTimePicker = false;
},
clearAddTime() { //
this.addTime='';
this.showAddTimePicker=false;
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#praise {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,105 @@
<template>
<div class="about">
<nav-bar class="nav">
<template v-slot:left>
<div class="back" @click="back"></div>
</template>
<template v-slot:center>
关于系统
</template>
</nav-bar>
<scroll class="about-content">
<p>
XX互联创想科技有限公司是一家致力于互联网产品设计开发销售为一体的公司
</p>
<p>
公司一贯注重高新技术的不断探索与提升凭借优秀的研发团队丰富的行业经验积累自行研发出多款实用性很强的互联网产品对诸多企业的信息化建设从运营管理到盈利起到了不容忽视的作用
</p>
<p>
截止目前据不完全统计我们的产品在互联网上已经突破了数万次的下载与安装量不论是从产品自身的建设或者是从产品的售前和售后服务等我们都对其进行 严格把关从而获得了良好的用户口碑与相当优秀的客户好评率同时也积累了相当一部分的忠实客户这也是我们飞速发展的一个重要原因同时也是我们的宗旨和荣誉
</p>
<p>公司电话028-82939234</p>
<p>公司地址四川省成都市红星路二段10号</p>
</scroll>
</div>
</template>
<script>
import NavBar from 'components/common/navbar/NavBar'
import Scroll from 'components/common/scroll/Scroll'
export default {
name: 'About',
components: {
NavBar,
Scroll
},
data() {
return {
score: 0,
couponList: null,
flag: true,
}
},
methods: {
back() {
this.$router.replace('/profile')
},
},
created() {
}
}
</script>
<style scoped>
.about {
width: 100vw;
height: 100vh;
overflow-x: hidden;
position: relative;
}
.nav {
background-color: #54bf8e;
color: #fff;
}
.about-content {
}
.empty {
filter: grayscale(1);
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
.about-content {
position: absolute;
top: 44px;
left: 0;
right: 0;
bottom: 0;
background-color: #fff;
padding: 0px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.about-content p{
font-size: 12px;
margin-top: 10px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
</style>

@ -0,0 +1,186 @@
<template>
<div class="coupon-exchange">
<nav-bar class="nav">
<template v-slot:left>
<div class="back" @click="back"></div>
</template>
<template v-slot:center>
优惠券兑换
</template>
</nav-bar>
<scroll class="coupon-list">
<div class="score">可用积分{{score}}</div>
<div class="coupon-item" v-for="item in couponList" :key="item.iid" :class="{empty: item.rest <= 0}">
<span class="value"><span style="fontSize: 14px;">&yen;&nbsp;</span>{{item.value}}</span>
<span class="attain" v-if="item.attain == 0">使</span>
<span class="attain" v-else>&nbsp;{{item.attain}}&nbsp;</span>
<img class="coupon-img" src="~assets/images/coupon1.png" v-if="item.attain == 0">
<img class="coupon-img" src="~assets/images/coupon2.png" v-else>
<div class="op-block">
<span class="exchange-btn" @click="exchange(item.iid, item.score)" v-if="item.rest > 0">{{item.score}}&nbsp;<br/>兑换</span>
<span class="exchange-btn" v-else></span>
<span class="limit-rest">{{item.rest}}</span>
</div>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from 'components/common/navbar/NavBar'
import Scroll from 'components/common/scroll/Scroll'
export default {
name: 'CouponExchange',
components: {
NavBar,
Scroll
},
data() {
return {
score: 0,
couponList: null,
flag: true
}
},
methods: {
back() {
this.$router.replace('/profile')
},
formatList(list) {
let able = []
let disable = []
list.forEach(el => {
if(el.rest >0) {
able.push(el)
}else {
disable.push(el)
}
})
able.push(...disable)
this.couponList = able
},
getCouponMaster() {
},
getScore() {
},
exchange(iid, score) {
if(this.score < score) {
return this.$toast.show('积分不足!')
}
this.$dialog.confirm({
title: '优惠券兑换',
message: `确认使用 ${score} 积分兑换吗?`
}).then(() => {
if(this.flag) {
this.flag = false
exchangeCoupon(iid).then(res => {
if(res.errcode == 1002) {
this.$toast.show('被抢光了~')
}else if(res.errcode == 1001) {
this.$toast.show('兑换失败')
}else {
this.score -= score
this.$toast.show('兑换成功')
if(res.data) {
this.formatList(res.data)
}
}
this.flag = true
})
}
}).catch(() => {})
}
},
created() {
this.getCouponMaster()
this.getScore()
}
}
</script>
<style scoped>
.coupon-exchange {
width: 100vw;
height: 100vh;
overflow-x: hidden;
position: relative;
}
.nav {
background-color: #54bf8e;
color: #fff;
}
.coupon-list {
position: absolute;
top: 44px;
left: 0;
right: 0;
bottom: 0;
}
.empty {
filter: grayscale(1);
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
.coupon-img {
width: 100%;
}
.coupon-item {
margin: 5px 0;
padding: 0 10px;
position: relative;
}
span.value {
position: absolute;
left: 50%;
top: 20px;
transform: translate3d(-50%, 0, 0);
font-size: 24px;
color: #eb2f06;
}
span.attain {
position: absolute;
bottom: 30px;
left: 50%;
transform: translate3d(-50%, 0, 0);
color: #888;
font-size: 12px;
}
.op-block {
position: absolute;
height: calc(100% - 16px);
top: 6px;
right: 13px;
width: 90px;
}
span.exchange-btn {
font-size: 14px;
color: #333;
position: absolute;
white-space: nowrap;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
text-align: center;
line-height: 20px;
}
span.limit-rest {
position: absolute;
top: 0;
right: 0;
transform: translate3d(30%, -50%, 0);
font-size: 12px;
color: #FFF;
background-color: #eb2f06;
padding: 2px 5px 1px 5px;
border-radius: 10px;
}
.score {
height: 49px;
line-height: 49px;
text-align: center;
}
</style>

@ -0,0 +1,188 @@
<template>
<div class="info-list" v-if="profile">
<div class="info-item" @click.stop="lookingForAdd">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;发布寻物启事信息<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="lookingForList">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;我发布的寻物启事列表<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="lostFoundAdd">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;发布失物招领信息<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="lostFoundList">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;我发布的失物招领列表<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="claimList">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;失物认领列表<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="praiseList" style="display:none;">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;表扬信息列表<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="noticeList">
<div class="title">
<van-icon name="notes-o" color="red" />&nbsp;&nbsp;站内通知新闻<span class="title-r"><van-icon name="arrow" /></span>
</div>
<div class="content"><div class="info-box"></div></div>
</div>
<div class="info-item" @click.stop="modify">
<div class="title">
<van-icon name="edit" color="red" />&nbsp;&nbsp;修改个人信息<span class="title-r"><span class="coupon-btn" @click.stop="couponClick" style="display:none;">积分兑换</span></span>
</div>
<div class="content"><div class="info-box"> </div></div>
</div>
<div class="info-item" @click.stop="about">
<div class="title">
<van-icon name="info-o" color="red" />&nbsp;&nbsp;关于我们<span class="title-r"> </span>
</div>
<div class="content"><div class="info-box"> </div></div>
</div>
</div>
</template>
<script>
export default {
name: 'InfoList',
components: {
},
props: {
profile: {
type: Object,
default: null
}
},
methods: {
lookingForAdd(){
this.$router.push('/lookingFor/add')
},
lookingForList(){
this.$router.push('/lookingFor/userList')
},
lostFoundAdd() {
this.$router.push('/lostFound/add')
},
lostFoundList(){
this.$router.push('/lostFound/userList')
},
claimList(){
this.$router.push('/claim/list')
},
praiseList(){
this.$router.push('/praise/list')
},
noticeList(){
this.$router.push('/notice/list')
},
couponClick() {
this.$router.replace('/coupon')
},
about() {
this.$router.replace('/about')
},
modify() {
//
this.$router.replace('/userInfo/selfModify')
},
notOpen() {
this.$notify.error('暂未开放该功能')
}
}
}
</script>
<style scoped>
.info-list {
width: 360px;
background-color: #fff;
margin: 10px auto;
border-radius: 4px;
box-shadow: 0 0 6px 1px rgba(0, 0, 0, .1);
overflow: hidden;
}
.info-box {
background-color: #fff;
border-bottom: 1px solid #f3f3f3;
}
.coupon-btn {
padding: 8px;
background-color: #0a3d62;
font-size: 10px;
border-radius: 5px;
color: #fff;
vertical-align: top;
}
.score {
margin-right: 20px;
font-size: 12px;
}
.info-item {
width: 100%;
position: relative;
}
.title {
width: 100%;
height: 40px;
background-color: #fff;
font-size: 16px;
line-height: 40px;
padding: 0 10px;
}
.info-item .fold-icon {
position: absolute;
top: 0px;
right: 10px;
font-family: 'icomoon';
font-size: 20px;
}
.info-item .content {
width: 100%;
position: relative;
top: 0px;
bottom: 0px;
background-color: #f3f3f3;
}
.title-r {
float: right;
}
</style>

@ -0,0 +1,106 @@
<template>
<div class="profile">
<scroll class="content" v-if="profile" bottom="80">
<!-- 头部头像昵称 -->
<div class="head">
<div class="avatar">
<img :src="profile.userPhotoUrl" alt="">
</div>
<span class="nickName">{{profile.name}}</span>
</div>
<!-- 信息列表 -->
<info-list :profile="profile"></info-list>
<div class="logout" @click="logout">退</div>
</scroll>
</div>
</template>
<script>
import Scroll from 'components/common/scroll/Scroll'
import InfoList from './InfoList'
import {getUserInfo, logout} from '../../network/login'
export default {
name: 'Profile',
components: {
Scroll,
InfoList
},
data() {
return {
profile: null
}
},
created() {
getUserInfo().then(ret => {
this.profile = ret.data
})
},
methods: {
logout() {
this.$dialog.confirm({
title: '退出登录',
message: '确定退出吗?'
}).then(() => {
logout().then(ret => {
localStorage.clear()
this.$router.replace('/login')
})
}).catch(() => {})
},
}
}
</script>
<style scoped>
.content {
position: absolute;
top: 0;
left: 0;
right: 0px;
bottom: 49px;
}
.head {
width: 100%;
height: 120px;
background: url(~assets/images/profile.jpg);
background-size: cover;
position: relative;
}
.avatar {
width: 80px;
height: 80px;
background-color: rgba(0, 0, 0, .3);
border-radius: 5px;
position: absolute;
bottom: 10px;
left: 10px;
overflow: hidden;
box-shadow: 0px 0px 6px 1px rgba(255, 255, 255, 0.4);
}
.avatar img {
width: 100%;
height: 100%;
}
.head .nickName {
font-size: 20px;
position: absolute;
bottom: 10px;
left: 100px;
color: #fff;
}
.logout {
height: 49px;
background-color: #333;
color: #fff;
margin: 10px;
line-height: 49px;
text-align: center;
border-radius: 5px;
box-shadow: 0px 0px 10px 3px rgba(0, 0, 0, 0.26);
}
</style>

@ -0,0 +1,182 @@
<template>
<div id="userInfo">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>添加用户</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field clearable name="userInfo.user_name" v-model="user_name" label="手机账号:" placeholder="请输入手机账号" :rules="[{ required: true, message: '请填写手机账号' }]" />
<van-field autosize clearable name="userInfo.password" v-model="password" label="登录密码:" placeholder="请输入登录密码" :rules="[{ required: true, message: '请填写登录密码' }]" />
<van-field v-show="false" clearable name="userInfo.areaObj.areaId" v-model="areaObj_areaId" label="所在学院:" />
<van-field readonly clickable label="所在学院" :value="areaObj_areaName" right-icon="arrow-down" placeholder="选择所在学院" @click="showAreaObjPicker = true" />
<van-picker v-show="showAreaObjPicker" show-toolbar :columns="areaObjColumns" :default-index="1" @cancel="showAreaObjPicker = false" @confirm="onConfirmAreaObj" />
<van-field autosize clearable name="userInfo.name" v-model="name" label="姓名:" placeholder="请输入姓名" :rules="[{ required: true, message: '请填写姓名' }]" />
<van-field autosize clearable name="userInfo.sex" v-model="sex" label="性别:" placeholder="请输入性别" :rules="[{ required: true, message: '请填写性别' }]" />
<van-field v-show="false" clearable name="userInfo.userPhoto" v-model="userPhoto" label="学生照片:" :rules="[{ required: true, message: '学生照片地址不能为空' }]" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>学生照片</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body">
<!-- 图片上传 -->
<img-upload name="userPhoto" @uploadFinished="userPhotoUpload"></img-upload>
</div>
</div>
</div>
<van-field readonly name="userInfo.birthday" label="出生日期" :value="birthday" placeholder="选择出生日期" @click="showBirthdayPicker = true" :rules="[{ required: true, message: '出生日期' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearBirthday">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showBirthdayPicker" v-model="picker_birthday" type="date" @cancel="showBirthdayPicker = false" title="选择出生日期" @confirm="onConfirmBirthday" />
<van-field autosize clearable name="userInfo.telephone" v-model="telephone" label="联系电话:" placeholder="请输入联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
<van-field autosize clearable name="userInfo.address" v-model="address" label="家庭地址:" placeholder="请输入家庭地址" :rules="[{ required: true, message: '请填写家庭地址' }]" />
<van-field readonly name="userInfo.regTime" label="注册时间" :value="regTime" placeholder="选择注册时间" @click="showRegTimePicker = true" :rules="[{ required: true, message: '注册时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearRegTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showRegTimePicker" v-model="picker_regTime" type="date" @cancel="showRegTimePicker = false" title="选择注册时间" @confirm="onConfirmRegTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ImgUpload from '../../components/content/ImgUpload'
import { queryAllArea } from '../../network/Area'
import { addUserInfo} from "../../network/UserInfo";
export default {
name: "UserInfoAdd",
components: {
NavBar,
Scroll,
ImgUpload,
},
data() {
return {
user_name: "", //
password: "", //
areaObjList: [], //
areaObj_areaId: 0, //id
areaObj_areaName: "", //
showAreaObjPicker: false, //Picker
areaObjColumns: [], //Picker
name: "", //
sex: "", //
userPhoto: 'upload/NoImage.jpg', //
showBirthdayPicker:false, //Picker
birthday: '', //
picker_birthday: new Date(), //Picker
telephone: "", //
address: "", //
showRegTimePicker:false, //Picker
regTime: '', //
picker_regTime: new Date(), //Picker
}
},
mounted() {
},
created() {
/*查询所有所在学院初始化下拉Picker*/
queryAllArea().then(res => {
this.areaObjList = res.data;
for(var i=0;i<this.areaObjList.length;i++) {
this.areaObjColumns.push(this.areaObjList[i].areaName)
}
if(this.areaObjList.length > 0) {
var firstAreaObj = this.areaObjList[0]; //
this.areaObj_areaName = firstAreaObj.areaName;
this.areaObj_areaId = firstAreaObj.areaId;
}
});
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmAreaObj(value,index) {
this.areaObj_areaName = value; //
this.areaObj_areaId = this.areaObjList[index].areaId;
this.showAreaObjPicker = false;
},
onSubmit(userInfo) { //
addUserInfo(userInfo).then(res => {
console.log(res)
this.$notify.success('添加成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmBirthday(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.birthday = year + "-" + month + "-" + day ;
this.showBirthdayPicker = false;
},
clearBirthday() { //
this.birthday='';
this.showBirthdayPicker=false;
},
onConfirmRegTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.regTime = year + "-" + month + "-" + day ;
this.showRegTimePicker = false;
},
clearRegTime() { //
this.regTime='';
this.showRegTimePicker=false;
},
userPhotoUpload(name,data) { //
if(name == "userPhoto") {
this.userPhoto = data;
}
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#userInfo {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
</style>

@ -0,0 +1,194 @@
<template>
<div id="userInfo">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>用户详情</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<div class="main-box">
<div class="info-bar">
<span class="title2">&nbsp;手机账号</span>
<span class="title3">{{user_name}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;登录密码</span>
<span class="title3">{{password}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;所在学院</span>
<span class="title3">{{areaObj_areaName}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;姓名</span>
<span class="title3">{{name}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;性别</span>
<span class="title3">{{sex}}</span>
</div>
<div class="info-bar" style="height:140px;">
<span class="title2">&nbsp;学生照片</span>
<span class="title3"> <img class="avatar" :src="userPhotoUrl" style="width:auto;height: 100%;" /></span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;出生日期</span>
<span class="title3">{{birthday}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;联系电话</span>
<span class="title3">{{telephone}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;家庭地址</span>
<span class="title3">{{address}}</span>
</div>
<div class="info-bar">
<span class="title2">&nbsp;注册时间</span>
<span class="title3">{{regTime}}</span>
</div>
</div>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit" @click.stop="back">返回</van-button>
</div>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import { getUserInfo } from "../../network/UserInfo";
export default {
name: "UserInfoDetail",
components: {
NavBar,
Scroll,
},
data() {
return {
user_name: "", //
password: "", //
areaObj_areaName: "", //
name: "", //
sex: "", //
userPhotoUrl: '/upload/NoImage.jpg', //
birthday: "", //
telephone: "", //
address: "", //
regTime: "", //
}
},
created() {
this.user_name = this.$route.params.user_name; //
//
getUserInfo(this.user_name).then(res => {
var userInfo = res.data;
this.password = userInfo.password;
this.areaObj_areaName = userInfo.areaObj.areaName;
this.name = userInfo.name;
this.sex = userInfo.sex;
this.userPhotoUrl = "/" + userInfo.userPhoto;
this.birthday = userInfo.birthday;
this.telephone = userInfo.telephone;
this.address = userInfo.address;
this.regTime = userInfo.regTime;
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.replace('/userInfo/list')
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#userInfo {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.header {
background-color: #fff;
position: relative;
padding: 0 15px;
padding-bottom: 10px;
overflow-x: scroll;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.header p{
margin-top: 40px;
color: #3c3c3c;
line-height: 25px;
text-indent: 25px;
}
.main-box {
background-color: #fff;
margin: 10px 0;
box-shadow: 0 1px 6px rgba(0, 0, 0, .08);
}
.info-bar {
height: auto;
border-bottom: 1px solid #f3f3f3;
padding: 0 15px;
display: block;
clear:both;
}
.title2 {
width:35%;
line-height: 46px;
font-weight: 600;
font-family: 'icomoon';
}
.title3 {
width: auto;
height: 100%;
text-align: right;
line-height: 46px;
color: #3c3c3c;
float: right;
}
.desc {
width: 100%;
line-height: 25px;
color: #3c3c3c;
clear:both;
}
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
border-radius: 3px;
}
</style>

@ -0,0 +1,73 @@
.userInfoList {
width: 100%;
height: auto;
flex-direction: column;
display: flex;
margin-top: 0px;
}
.userInfoItem {
margin: 5px;
width: 98%;
height: auto;
border-top: 1px solid #ededed;
text-align: left;
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 5px;
position: relative;
}
.userInfoItem .content_view {
display: flex;
flex-direction: row;
}
.userInfoItem .userInfoImg {
width: 30%;
text-align: right;
padding: 2px;
border-right: 1px solid #eee;
}
.userInfoItem .userInfoImg img {
width: 100%;
height: auto;
}
.userInfoItem .userInfoText {
width:70%;
display: flex;
flex-direction: column;
padding-left: 5px;
}
.userInfoItem .userInfoText div {
line-height: 25px;
height: auto;
}
.userInfoItem .opt_view {
display:block;
width: 100%;
margin-top: 2px;
margin-bottom: 5px;
text-align: right;
}
.userInfoQueryForm {
width: 100%;
height: auto;
}
.userInfoQueryForm h3 {
text-align: center;
margin-top: 20px;
margin-bottom: 10px;
}
.userInfoQueryForm .queryBtn {
text-align: right;
margin: 10px;
}

@ -0,0 +1,247 @@
<template>
<div id="userInfo">
<van-popup v-model="showQueryUserInfoForm" closeable position="top" :style="{ height: 'auto' }">
<div class="userInfoQueryForm">
<h3>用户查询</h3>
<van-field clearable v-model="user_name" label="手机账号:" placeholder="请输入手机账号" />
<van-field readonly clickable label="所在学院" :value="areaObj_areaName" right-icon="arrow-down" placeholder="选择所在学院" @click="showAreaObjPicker = true" />
<van-popup v-model="showAreaObjPicker" position="bottom">
<van-picker show-toolbar :columns="areaObjColumns" @cancel="showAreaObjPicker = false" @confirm="onConfirmAreaObj" />
</van-popup>
<van-field clearable v-model="name" label="姓名:" placeholder="请输入姓名" />
<van-field readonly label="出生日期" :value="birthday" placeholder="选择出生日期" @click="showBirthdayPicker = true">
<template #button>
<van-button size="small" type="warning" @click.stop="clearBirthday">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showBirthdayPicker" v-model="picker_birthday" type="date" @cancel="showBirthdayPicker = false" title="选择出生日期" @confirm="onConfirmBirthday" />
<van-field clearable v-model="telephone" label="联系电话:" placeholder="请输入联系电话" />
<van-field readonly label="注册时间" :value="regTime" placeholder="选择注册时间" @click="showRegTimePicker = true">
<template #button>
<van-button size="small" type="warning" @click.stop="clearRegTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showRegTimePicker" v-model="picker_regTime" type="date" @cancel="showRegTimePicker = false" title="选择注册时间" @confirm="onConfirmRegTime" />
<div class="queryBtn">
<van-button round size= small type="primary" @click="queryUserInfo"></van-button>
</div>
</div>
</van-popup>
<nav-bar class="nav" ref="nav" >
<template v-slot:left><van-icon name="plus" size="25" v-show="false" @click.stop="userInfoAdd" /></template>
<template v-slot:center>用户列表</template>
<template v-slot:right><van-icon name="search" size="25" @click.stop="showQueryUserInfoForm=true" /></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" :isPullDown="true" @pullingDown="pullingDown" :isPullUp="true" @pullingUp="pullingUp" @iscroll="contentScroll">
<div class="ignore-pull-down1" ref="pull" v-show="pullFlag"></div>
<div class="ignore-pull-down2" ref="pull" v-show="!pullFlag">
<span class="ball1"></span><span class="ball2"></span><span class="ball3"></span>
</div>
<div class="userInfoList">
<template v-for="userInfo in userInfoList">
<div class="userInfoItem" :key="userInfo.user_name" @click.stop="userInfoDetailClick(`${userInfo.user_name}`)">
<div class="content_view">
<div class="userInfoImg">
<img v-lazy="'/' + userInfo.userPhoto">
</div>
<div class="userInfoText">
<div>手机账号{{userInfo.user_name}}</div>
<div>所在学院{{userInfo.areaObj.areaName}}</div>
<div>姓名{{userInfo.name}}</div>
<div>性别{{userInfo.sex}}</div>
<div>出生日期{{userInfo.birthday}}</div>
</div>
</div>
<div class="opt_view" v-show="false">
<van-button round size= small type="primary" @click.stop="userInfoEditClick(`${userInfo.user_name}`)" >编辑</van-button>
<van-button round size= small type="warning" @click.stop="userInfoDeleteClick(`${userInfo.user_name}`)" style="margin-left:10px;">删除</van-button>
</div>
</div>
</template>
</div>
<div class="block"></div>
</scroll>
<return-top @returnTop="returnTop" v-show="isReturnTop"></return-top>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ReturnTop from '../../components/common/returntop/ReturnTop'
import {queryUserInfo,deleteUserInfo} from '../../network/UserInfo'
import { queryAllArea } from '../../network/Area'
export default {
name: 'UserInfoList',
components: {
NavBar,
Scroll,
ReturnTop
},
data() {
return {
userInfoList: [], //
user_name: "", //
areaObjList:[], //
areaObj_areaId: 0, //id
areaObj_areaName: "不限制", //
showAreaObjPicker: false, //Picker
areaObjColumns: ['不限制'], //Picker
name: "", //
birthday: "", //
showBirthdayPicker: false, //Picker
picker_birthday: new Date(), //Picker
telephone: "", //
regTime: "", //
showRegTimePicker: false, //Picker
picker_regTime: new Date(), //Picker
pullFlag: true, //
page: 1, //1
showQueryUserInfoForm: false, //
isReturnTop: false,
}
},
created() {
//
queryAllArea().then(res => {
this.areaObjList = res.data;
for(var i=0;i<this.areaObjList.length;i++) {
this.areaObjColumns.push(this.areaObjList[i].areaName)
}
});
//
this.userInfoQuery("");
document.getElementById("tabbar").style.display = "flex";
},
methods: {
onConfirmAreaObj(value,index) { //
this.areaObj_areaName = value;
if(index == 0) this.areaObj_areaId = 0;
else this.areaObj_areaId = this.areaObjList[index-1].areaId;
this.showAreaObjPicker = false;
},
onConfirmBirthday(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.birthday = year + "-" + month + "-" + day ;
this.showBirthdayPicker = false;
},
clearBirthday() { //
this.birthday=''
this.showBirthdayPicker=false;
},
onConfirmRegTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.regTime = year + "-" + month + "-" + day ;
this.showRegTimePicker = false;
},
clearRegTime() { //
this.regTime=''
this.showRegTimePicker=false;
},
userInfoAdd() {
this.$router.push('/userInfo/add'); //
},
queryUserInfo() {
this.page = 1;
this.userInfoList = [];
this.pullFlag = false;
this.showQueryUserInfoForm = false;
this.userInfoQuery("QUERY");
},
userInfoQuery(action) {
queryUserInfo(this.user_name,this.areaObj_areaId,this.name,this.birthday,this.telephone,this.regTime,this.page).then(res => {
//this.userInfoList.push(...res.data)
this.userInfoList = this.userInfoList.concat(res.data.list)
if(action == "QUERY") {
this.$notify.success('查询成功~');
this.$refs.scroll.refresh();
}
if(action == "UP") { //
if(res.data.list.length < 10){
this.$notify.error('没有更多数据了~')
return;
}
this.$refs.scroll.refresh();
}
if(action == "DOWN") { //
this.$notify.success('刷新成功~');
this.$refs.scroll.finishPullDown();
this.$refs.scroll.refresh();
this.pullFlag = true
}
})
},
userInfoDetailClick(user_name) {
this.$router.push('/userInfo/detail/' + user_name); //
},
userInfoEditClick(user_name) {
this.$router.push('/userInfo/modify/' + user_name); //
},
userInfoDeleteClick(user_name) {
this.$dialog.confirm({
title: '删除用户:' + user_name,
message: '确定删除吗?'
}).then(() => {
deleteUserInfo(user_name).then(res => {
console.log(res)
this.userInfoList.forEach(function(userInfo, index, arr) {
if(userInfo.user_name == user_name) arr.splice(index, 1);
});
});
});
},
pullingDown() { //
this.page = 1;
this.userInfoList = [];
this.pullFlag = false;
this.userInfoQuery("DOWN");
},
pullingUp() { //
console.log("上拉加载")
this.page = this.page + 1;
this.$refs.scroll.finishPullUp();
this.userInfoQuery("UP");
},
returnTop() {
this.$refs.scroll.scrollTo(0, 0)
},
//
contentScroll(position) {
this.isReturnTop = position.y < -800
},
}
}
</script>
<style scoped>
@import "../../assets/css/list_base.css";
@import "UserInfoList.css";
#userInfo {
height: 100vh;
width: 100vw;
position: relative;
}
</style>

@ -0,0 +1,209 @@
<template>
<div id="userInfo">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>编辑用户</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="userInfo.user_name" v-model="user_name" label="手机账号:" placeholder="请输入手机账号" :rules="[{ required: true, message: '请填写手机账号' }]" />
<van-field autosize type="password" clearable name="userInfo.password" v-model="password" label="登录密码:" placeholder="请输入登录密码" :rules="[{ required: true, message: '请填写登录密码' }]" />
<van-field v-show="false" clearable name="userInfo.areaObj.areaId" v-model="areaObj_areaId" label="所在学院:" />
<van-field readonly clickable label="所在学院" :value="areaObj_areaName" right-icon="arrow-down" placeholder="选择所在学院" @click="showAreaObjPicker = true" />
<van-picker v-show="showAreaObjPicker" show-toolbar :columns="areaObjColumns" :default-index="1" @cancel="showAreaObjPicker = false" @confirm="onConfirmAreaObj" />
<van-field autosize clearable name="userInfo.name" v-model="name" label="姓名:" placeholder="请输入姓名" :rules="[{ required: true, message: '请填写姓名' }]" />
<van-field autosize clearable name="userInfo.sex" v-model="sex" label="性别:" placeholder="请输入性别" :rules="[{ required: true, message: '请填写性别' }]" />
<van-field v-show="false" clearable name="userInfo.userPhoto" v-model="userPhoto" label="学生照片:" :rules="[{ required: true, message: '学生照片地址不能为空' }]" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>学生照片</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body">
<img class="avatar" :src="userPhotoUrl"/>
<!-- 图片上传 -->
<img-upload name="userPhoto" @uploadFinished="userPhotoUpload"></img-upload>
</div>
</div>
</div>
<van-field readonly name="userInfo.birthday" label="出生日期" :value="birthday" placeholder="选择出生日期" @click="showBirthdayPicker = true" :rules="[{ required: true, message: '出生日期' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearBirthday">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showBirthdayPicker" v-model="picker_birthday" type="date" @cancel="showBirthdayPicker = false" title="选择出生日期" @confirm="onConfirmBirthday" />
<van-field autosize clearable name="userInfo.telephone" v-model="telephone" label="联系电话:" placeholder="请输入联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
<van-field autosize clearable name="userInfo.address" v-model="address" label="家庭地址:" placeholder="请输入家庭地址" :rules="[{ required: true, message: '请填写家庭地址' }]" />
<van-field readonly name="userInfo.regTime" label="注册时间" :value="regTime" placeholder="选择注册时间" @click="showRegTimePicker = true" :rules="[{ required: true, message: '注册时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearRegTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showRegTimePicker" v-model="picker_regTime" type="date" @cancel="showRegTimePicker = false" title="选择注册时间" @confirm="onConfirmRegTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ImgUpload from '../../components/content/ImgUpload'
import { queryAllArea } from '../../network/Area'
import { updateUserInfo} from "../../network/UserInfo";
import { getUserInfo } from "../../network/UserInfo";
export default {
name: "UserInfoAdd",
components: {
NavBar,
Scroll,
ImgUpload,
},
data() {
return {
user_name: "", //
password: "", //
areaObjList: [], //
areaObj_areaId: 0, //id
areaObj_areaName: "", //
showAreaObjPicker: false, //Picker
areaObjColumns: [], //Picker
name: "", //
sex: "", //
userPhoto: 'upload/NoImage.jpg', //
userPhotoUrl: '/upload/NoImage.jpg', //
showBirthdayPicker:false, //Picker
birthday: '', //
picker_birthday: new Date(), //Picker
telephone: "", //
address: "", //
showRegTimePicker:false, //Picker
regTime: '', //
picker_regTime: new Date(), //Picker
}
},
mounted() {
},
created() {
/*查询所有所在学院初始化下拉Picker*/
queryAllArea().then(res => {
this.areaObjList = res.data;
for(var i=0;i<this.areaObjList.length;i++) {
this.areaObjColumns.push(this.areaObjList[i].areaName)
}
});
this.user_name = this.$route.params.user_name; //
//
getUserInfo(this.user_name).then(res => {
var userInfo = res.data;
this.user_name = userInfo.user_name; //
this.password = userInfo.password; //
this.areaObj_areaId = userInfo.areaObj.areaId; //
this.areaObj_areaName = userInfo.areaObj.areaName;
this.name = userInfo.name; //
this.sex = userInfo.sex; //
this.userPhoto = userInfo.userPhoto; //
this.userPhotoUrl = "/" + userInfo.userPhoto;
this.birthday = userInfo.birthday; //
this.picker_birthday = new Date(this.birthday.replace(/-/g, '/'))
this.telephone = userInfo.telephone; //
this.address = userInfo.address; //
this.regTime = userInfo.regTime; //
this.picker_regTime = new Date(this.regTime.replace(/-/g, '/'))
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmAreaObj(value,index) {
this.areaObj_areaName = value; //
this.areaObj_areaId = this.areaObjList[index].areaId;
this.showAreaObjPicker = false;
},
onSubmit(userInfo) { //
updateUserInfo(userInfo).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmBirthday(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.birthday = year + "-" + month + "-" + day ;
this.showBirthdayPicker = false;
},
clearBirthday() { //
this.birthday='';
this.showBirthdayPicker=false;
},
onConfirmRegTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.regTime = year + "-" + month + "-" + day ;
this.showRegTimePicker = false;
},
clearRegTime() { //
this.regTime='';
this.showRegTimePicker=false;
},
userPhotoUpload(name,data) { //
if(name == "userPhoto") {
this.userPhoto = data;
}
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#userInfo {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,210 @@
<template>
<div id="userInfo">
<nav-bar class="nav">
<template v-slot:left><van-icon name="arrow-left" size="25" @click.stop="back" /></template>
<template v-slot:center>修改个人信息</template>
<template v-slot:right></template>
</nav-bar>
<scroll class="content" top="1" bottom="50" ref="scroll" style="padding: 0px 5px">
<van-form @submit="onSubmit">
<van-field readonly name="userInfo.user_name" v-model="user_name" label="手机账号:" placeholder="请输入手机账号" :rules="[{ required: true, message: '请填写手机账号' }]" />
<van-field autosize clearable type="password" name="userInfo.password" v-model="password" label="登录密码:" placeholder="请输入登录密码" :rules="[{ required: true, message: '请填写登录密码' }]" />
<van-field v-show="false" clearable name="userInfo.areaObj.areaId" v-model="areaObj_areaId" label="所在学院:" />
<van-field readonly clickable label="所在学院" :value="areaObj_areaName" right-icon="arrow-down" placeholder="选择所在学院" @click="showAreaObjPicker = true" />
<van-picker v-show="showAreaObjPicker" show-toolbar :columns="areaObjColumns" :default-index="1" @cancel="showAreaObjPicker = false" @confirm="onConfirmAreaObj" />
<van-field autosize clearable name="userInfo.name" v-model="name" label="姓名:" placeholder="请输入姓名" :rules="[{ required: true, message: '请填写姓名' }]" />
<van-field autosize clearable name="userInfo.sex" v-model="sex" label="性别:" placeholder="请输入性别" :rules="[{ required: true, message: '请填写性别' }]" />
<van-field v-show="false" clearable name="userInfo.userPhoto" v-model="userPhoto" label="学生照片:" :rules="[{ required: true, message: '学生照片地址不能为空' }]" />
<div class="van-cell van-field" style="pointer-events: auto;">
<div class="van-cell__title van-field__label"><span>学生照片</span></div>
<div class="van-cell__value van-field__value">
<div class="van-field__body">
<img class="avatar" :src="userPhotoUrl"/>
<!-- 图片上传 -->
<img-upload name="userPhoto" @uploadFinished="userPhotoUpload"></img-upload>
</div>
</div>
</div>
<van-field readonly name="userInfo.birthday" label="出生日期" :value="birthday" placeholder="选择出生日期" @click="showBirthdayPicker = true" :rules="[{ required: true, message: '出生日期' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearBirthday">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showBirthdayPicker" v-model="picker_birthday" type="date" @cancel="showBirthdayPicker = false" title="选择出生日期" @confirm="onConfirmBirthday" />
<van-field autosize clearable name="userInfo.telephone" v-model="telephone" label="联系电话:" placeholder="请输入联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
<van-field autosize clearable name="userInfo.address" v-model="address" label="家庭地址:" placeholder="请输入家庭地址" :rules="[{ required: true, message: '请填写家庭地址' }]" />
<van-field v-show="false" readonly name="userInfo.regTime" label="注册时间" :value="regTime" placeholder="选择注册时间" @click="showRegTimePicker = true" :rules="[{ required: true, message: '注册时间' }]">
<template #button>
<van-button size="small" type="warning" @click.stop="clearRegTime">清除</van-button>
</template>
</van-field>
<van-datetime-picker v-if="showRegTimePicker" v-model="picker_regTime" type="date" @cancel="showRegTimePicker = false" title="选择注册时间" @confirm="onConfirmRegTime" />
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">更新</van-button>
</div>
</van-form>
</scroll>
</div>
</template>
<script>
import NavBar from '../../components/common/navbar/NavBar'
import Scroll from '../../components/common/scroll/Scroll'
import ImgUpload from '../../components/content/ImgUpload'
import { queryAllArea } from '../../network/Area'
import { updateUserInfo} from "../../network/UserInfo";
import { getSelfUserInfo } from "../../network/UserInfo";
export default {
name: "UserInfoAdd",
components: {
NavBar,
Scroll,
ImgUpload,
},
data() {
return {
user_name: "", //
password: "", //
areaObjList: [], //
areaObj_areaId: 0, //id
areaObj_areaName: "", //
showAreaObjPicker: false, //Picker
areaObjColumns: [], //Picker
name: "", //
sex: "", //
userPhoto: 'upload/NoImage.jpg', //
userPhotoUrl: '/upload/NoImage.jpg', //
showBirthdayPicker:false, //Picker
birthday: '', //
picker_birthday: new Date(), //Picker
telephone: "", //
address: "", //
showRegTimePicker:false, //Picker
regTime: '', //
picker_regTime: new Date(), //Picker
}
},
mounted() {
},
created() {
/*查询所有所在学院初始化下拉Picker*/
queryAllArea().then(res => {
this.areaObjList = res.data;
for(var i=0;i<this.areaObjList.length;i++) {
this.areaObjColumns.push(this.areaObjList[i].areaName)
}
});
this.user_name = this.$route.params.user_name; //
//
getSelfUserInfo().then(res => {
var userInfo = res.data;
this.user_name = userInfo.user_name; //
this.password = userInfo.password; //
this.areaObj_areaId = userInfo.areaObj.areaId; //
this.areaObj_areaName = userInfo.areaObj.areaName;
this.name = userInfo.name; //
this.sex = userInfo.sex; //
this.userPhoto = userInfo.userPhoto; //
this.userPhotoUrl = "/" + userInfo.userPhoto;
this.birthday = userInfo.birthday; //
this.picker_birthday = new Date(this.birthday.replace(/-/g, '/'))
this.telephone = userInfo.telephone; //
this.address = userInfo.address; //
this.regTime = userInfo.regTime; //
this.picker_regTime = new Date(this.regTime.replace(/-/g, '/'))
})
document.getElementById("tabbar").style.display = "flex";
},
methods: {
back() {
this.$router.go(-1);
},
onConfirmAreaObj(value,index) {
this.areaObj_areaName = value; //
this.areaObj_areaId = this.areaObjList[index].areaId;
this.showAreaObjPicker = false;
},
onSubmit(userInfo) { //
updateUserInfo(userInfo).then(res => {
console.log(res)
this.$notify.success('更新成功~')
}).catch(error => { this.$notify.error(error)})
},
onConfirmBirthday(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.birthday = year + "-" + month + "-" + day ;
this.showBirthdayPicker = false;
},
clearBirthday() { //
this.birthday='';
this.showBirthdayPicker=false;
},
onConfirmRegTime(value) { //
var year = value.getFullYear();
var month = (value.getMonth()+1)<10?'0'+ (value.getMonth()+1): (value.getMonth()+1);
var day = value.getDate()<10?'0'+value.getDate():value.getDate();
this.regTime = year + "-" + month + "-" + day ;
this.showRegTimePicker = false;
},
clearRegTime() { //
this.regTime='';
this.showRegTimePicker=false;
},
userPhotoUpload(name,data) { //
if(name == "userPhoto") {
this.userPhoto = data;
}
},
},
}
</script>
<style scoped>
.nav {
background-color: #54bf8e;
color: #fff;
}
.back {
font-family: 'icomoon';
font-size: 30px;
}
#userInfo {
height: 100vh;
width: 100vw;
position: relative;
}
.content {
position: fixed;
top: 50px;
left: 0;
right: 0px;
bottom: 49px;
}
.van-dropdown-menu { width: 100%; }
.avatar {
width: 100px;
height: 100px;
background-color: #f3f3f3;
float: left;
top: 5px;
right: 5px;
border-radius: 3px;
margin-bottom: 26px;
}
</style>

@ -0,0 +1,44 @@
<template>
</template>
<script>
var data = {name: 'kindeng'};
observe(data);
data.name = 'dmq'; // kindeng --> dmq
function observe(data) {
if (!data || typeof data !== 'object') {
return;
}
//
Object.keys(data).forEach(function(key) {
defineReactive(data, key, data[key]);
});
};
function defineReactive(data, key, val) {
observe(val); //
Object.defineProperty(data, key, {
enumerable: true, //
configurable: false, // define
get: function() {
return val;
},
set: function(newVal) {
console.log('哈哈哈,监听到值变化了 ', val, ' --> ', newVal);
val = newVal;
}
});
}
export default {
}
</script>
<style>
</style>
Loading…
Cancel
Save