upload frontend
Signed-off-by: Puqns67 <me@puqns67.icu>
BIN
src/main/resources/static/fonts/FiraCode-Regular.woff2
Normal file
BIN
src/main/resources/static/fonts/LcdD.ttf
Normal file
BIN
src/main/resources/static/fonts/SmileySans-Oblique.otf.woff2
Normal file
BIN
src/main/resources/static/fonts/华文圆体-Regular.ttf
Normal file
45
src/main/resources/static/images/add_to_cart.svg
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 503.945 503.945" style="enable-background:new 0 0 503.945 503.945;" xml:space="preserve">
|
||||
<path style="fill:#18456D;" d="M455.173,345.073l48-152.8c1.6-6.4,0.8-12.8-3.2-18.4s-10.4-8.8-16.8-8.8h-462.4
|
||||
c-6.4,0-12.8,3.2-16.8,8.8s-4.8,12-3.2,18.4l48,152.8c0,3.2,0.8,5.6,2.4,8.8l20.8,66.4c2.4,8.8,10.4,14.4,20,14.4h320
|
||||
c8.8,0,16.8-5.6,20-14.4l20.8-66.4L455.173,345.073z M73.573,285.073h356.8l-12,37.6h-333.6L73.573,285.073z M455.173,206.673
|
||||
l-11.2,36.8h-383.2l-11.2-36.8H455.173z M107.173,400.273l-8.8-36.8h308l-8.8,36.8H107.173z" />
|
||||
<path style="fill:#0B3249;" d="M499.973,179.473c-4-5.6-10.4-8.8-16.8-8.8h-462.4c-6.4,0-12.8,3.2-16.8,8.8s-4.8,12-3.2,18.4
|
||||
l48,152.8c0,3.2,0.8,5.6,2.4,8.8l20.8,66.4c0.8,1.6,0.8,3.2,1.6,4c-2.4,2.4-4,5.6-4,8.8c0,7.2,5.6,12.8,12.8,12.8h337.6
|
||||
c7.2,0,12.8-5.6,12.8-12.8c0-3.2-1.6-6.4-4-8.8c0.8-1.6,1.6-2.4,1.6-4l20.8-66.4l2.4-8.8l48-152.8
|
||||
C504.773,192.273,503.973,185.073,499.973,179.473z M98.373,369.873h308l-8.8,36.8h-290.4L98.373,369.873z M419.173,328.273h-334.4
|
||||
l-12-37.6h356.8L419.173,328.273z M443.173,249.873h-382.4l-11.2-36.8h405.6L443.173,249.873z" />
|
||||
<path style="fill:#18456D;" d="M153.573,187.473c-7.2,7.2-19.2,7.2-26.4,0l-16.8-16.8c-7.2-7.2-7.2-19.2,0-26.4l84.8-86.4
|
||||
c7.2-7.2,19.2-7.2,26.4,0l16.8,16.8c7.2,7.2,7.2,19.2,0,26.4L153.573,187.473z" />
|
||||
<path style="fill:#1B5A89;" d="M131.973,165.873l85.6-85.6c6.4-6.4,7.2-16.8,1.6-24c-7.2-5.6-17.6-4.8-24,1.6l-85.6,85.6
|
||||
c-6.4,6.4-7.2,16.8-1.6,24C115.173,173.073,125.573,173.073,131.973,165.873z" />
|
||||
<path style="fill:#0B3249;" d="M156.773,140.273c9.6,9.6-12,47.2-21.6,57.6c-9.6,9.6-25.6,9.6-36,0c-9.6-9.6-9.6-25.6,0-36
|
||||
C109.573,152.273,147.173,130.673,156.773,140.273z" />
|
||||
<path style="opacity:0.2;fill:#83C9CC;enable-background:new ;" d="M155.173,179.473c-1.6,23.2-24,32.8-37.6,29.6
|
||||
s-25.6-16-25.6-29.6s11.2-25.6,25.6-25.6C131.173,154.673,155.973,165.873,155.173,179.473z" />
|
||||
<circle style="fill:#196A9B;" cx="117.573" cy="179.473" r="25.6" />
|
||||
<path style="fill:#1B5A89;" d="M135.173,161.873c9.6,9.6,9.6,25.6,0,36c-9.6,9.6-25.6,9.6-36,0" />
|
||||
<path style="fill:#1B5A89;" d="M350.373,187.473c7.2,7.2,19.2,7.2,26.4,0l16.8-16.8c7.2-7.2,7.2-19.2,0-26.4l-84.8-86.4
|
||||
c-7.2-7.2-19.2-7.2-26.4,0l-16.8,16.8c-7.2,7.2-7.2,19.2,0,26.4L350.373,187.473z" />
|
||||
<path style="fill:#18456D;" d="M371.973,165.873l-85.6-85.6c-6.4-6.4-7.2-16.8-1.6-24c7.2-5.6,17.6-4.8,24,1.6l85.6,85.6
|
||||
c6.4,6.4,7.2,16.8,1.6,24C388.773,173.073,378.373,173.073,371.973,165.873z" />
|
||||
<path style="fill:#0B3249;" d="M347.173,140.273c-9.6,9.6,12,47.2,21.6,57.6c9.6,9.6,25.6,9.6,36,0c9.6-9.6,9.6-25.6,0-36
|
||||
C394.373,152.273,356.773,130.673,347.173,140.273z" />
|
||||
<path style="opacity:0.2;fill:#83C9CC;enable-background:new ;" d="M348.773,179.473c1.6,23.2,24,32.8,37.6,29.6
|
||||
s25.6-16,25.6-29.6s-11.2-25.6-25.6-25.6C372.773,154.673,347.973,165.873,348.773,179.473z" />
|
||||
<circle style="fill:#1B5A89;" cx="386.373" cy="179.473" r="25.6" />
|
||||
<path style="fill:#196A9B;" d="M368.773,161.873c-9.6,9.6-9.6,25.6,0,36c9.6,9.6,25.6,9.6,36,0" />
|
||||
<path style="fill:#10AF58;" d="M195.973,310.673l47.2,47.2c4.8,4.8,12,4.8,16.8,0l47.2-47.2c4.8-4.8,4.8-12,0-16.8s-12-4.8-16.8,0
|
||||
l-27.2,27.2v-109.6c0-6.4-5.6-12-12-12s-12,5.6-12,12v109.6l-27.2-27.2c-2.4-2.4-5.6-3.2-8-3.2c-3.2,0-6.4,0.8-8,3.2
|
||||
C191.973,298.673,191.973,305.873,195.973,310.673z" />
|
||||
<path style="fill:#19BF55;" d="M212.773,293.873c-2.4-2.4-4.8-3.2-8-3.2l38.4,38.4c4.8,4.8,12,4.8,16.8,0l38.4-38.4
|
||||
c-3.2,0-5.6,0.8-8,3.2l-27.2,27.2v-28.8v-80.8c0-6.4-5.6-12-12-12s-12,5.6-12,12v80.8v28.8L212.773,293.873z" />
|
||||
<path style="fill:#19BF55;" d="M240.773,186.673c0-3.2,2.4-5.6,5.6-5.6h11.2c3.2,0,5.6,2.4,5.6,5.6l0,0c0,3.2-2.4,5.6-5.6,5.6
|
||||
h-11.2C243.173,192.273,240.773,189.873,240.773,186.673L240.773,186.673z" />
|
||||
<path style="fill:#19BF55;" d="M240.773,167.473c0-3.2,2.4-5.6,5.6-5.6h11.2c3.2,0,5.6,2.4,5.6,5.6l0,0c0,3.2-2.4,5.6-5.6,5.6
|
||||
h-11.2C243.173,173.073,240.773,170.673,240.773,167.473L240.773,167.473z" />
|
||||
<path style="fill:#19BF55;" d="M240.773,148.273c0-3.2,2.4-5.6,5.6-5.6h11.2c3.2,0,5.6,2.4,5.6,5.6l0,0c0,3.2-2.4,5.6-5.6,5.6
|
||||
h-11.2C243.173,153.873,240.773,151.473,240.773,148.273L240.773,148.273z" />
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
BIN
src/main/resources/static/images/favicon.ico
Normal file
After Width: | Height: | Size: 2.0 KiB |
18
src/main/resources/static/images/icon.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 495 495" style="enable-background:new 0 0 495 495;" xml:space="preserve">
|
||||
<polygon style="fill:#004FAC;" points="181.112,81.833 168.742,166.012 168.742,222.068 326.258,222.068 326.258,166.012
|
||||
313.888,81.833 " />
|
||||
<polygon style="fill:#005ECE;" points="446.663,81.833 313.888,81.833 326.258,166.012 326.258,222.068 483.774,222.068
|
||||
483.774,166.012 " />
|
||||
<polygon style="fill:#005ECE;" points="168.742,166.012 181.112,81.833 48.337,81.833 11.226,166.012 11.226,222.068
|
||||
168.742,222.068 " />
|
||||
<rect x="306.258" y="222.068" style="fill:#B3D8F4;" width="70.203" height="272.932" />
|
||||
<rect x="376.461" y="222.068" style="fill:#96C8EF;" width="70.203" height="272.932" />
|
||||
<rect x="48.337" y="222.068" style="fill:#B3D8F4;" width="138.96" height="196.779" />
|
||||
<rect x="187.297" y="222.068" style="fill:#96C8EF;" width="118.961" height="196.779" />
|
||||
<rect x="48.337" y="418.847" style="fill:#FF5023;" width="257.921" height="76.153" />
|
||||
<rect x="97.818" style="fill:#FF5023;" width="149.682" height="81.833" />
|
||||
<rect x="247.5" style="fill:#FF0C38;" width="149.682" height="81.833" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/main/resources/static/images/item/0.jpeg
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
src/main/resources/static/images/item/1.jpeg
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
src/main/resources/static/images/item/10.jpeg
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
src/main/resources/static/images/item/11.jpeg
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
src/main/resources/static/images/item/12.jpeg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
src/main/resources/static/images/item/13.jpeg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
src/main/resources/static/images/item/14.jpeg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
src/main/resources/static/images/item/2.jpeg
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
src/main/resources/static/images/item/3.jpeg
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
src/main/resources/static/images/item/4.jpeg
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
src/main/resources/static/images/item/5.jpeg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
src/main/resources/static/images/item/6.jpeg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
src/main/resources/static/images/item/7.jpeg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
src/main/resources/static/images/item/8.jpeg
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
src/main/resources/static/images/item/9.jpeg
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
src/main/resources/static/images/item/placeholder.png
Normal file
After Width: | Height: | Size: 10 KiB |
21
src/main/resources/static/images/pin.svg
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Pin" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
|
||||
<path d="M499.505,128.508l-72.045-72.045c-3.163-3.162-8.293-3.162-11.455,0c-3.163,3.164-3.163,8.293,0,11.456l72.045,72.044
|
||||
c10.2,10.201,10.2,27.222,0,37.422c-10.201,10.2-27.221,10.2-37.421-0.001L334.614,61.371c-10.2-10.199-10.2-27.22,0-37.419
|
||||
c10.2-10.201,27.221-10.201,37.421,0l23.986,23.984c3.163,3.162,8.293,3.163,11.455-0.001c3.163-3.163,3.163-8.293,0-11.455
|
||||
l-23.984-23.984C375.434,4.438,364.721,0,353.324,0c-11.396,0-22.108,4.438-30.167,12.495
|
||||
c-8.057,8.058-12.495,18.771-12.495,30.167c0,8.646,2.56,16.895,7.312,23.894L204.956,179.574
|
||||
c-3.392-1.254-6.81-2.441-10.263-3.52c-31.896-9.958-66.224-12.369-99.277-6.976c-6.383,1.041-9.004,9.14-4.423,13.723
|
||||
l95.046,95.046l-25.347,25.347c-3.163,3.165-3.163,8.293,0,11.456c3.163,3.162,8.293,3.162,11.455,0l25.347-25.347l25.203,25.202
|
||||
L58.708,478.495l-37.804,12.602l12.601-37.804l120.011-120.011c3.163-3.164,3.163-8.293,0-11.456
|
||||
c-3.163-3.162-8.293-3.162-11.455,0L20.697,443.19c-0.889,0.889-1.56,1.973-1.957,3.167L0.411,501.343
|
||||
c-2.069,6.207,4.033,12.317,10.246,10.246l54.987-18.329c1.192-0.397,2.277-1.067,3.167-1.957l165.341-165.341l95.047,95.046
|
||||
c4.583,4.583,12.681,1.954,13.723-4.424c5.394-33.054,2.981-67.384-6.976-99.277c-1.078-3.453-2.266-6.87-3.52-10.264
|
||||
l113.019-113.019c6.999,4.752,15.248,7.312,23.894,7.312c11.396,0,22.108-4.438,30.167-12.495
|
||||
c8.057-8.058,12.495-18.771,12.495-30.167S507.562,136.566,499.505,128.508z M328.895,397.793L114.206,183.106
|
||||
c57.916-4.625,115.622,16.339,156.985,57.703C312.557,282.174,333.52,339.867,328.895,397.793z M325.682,290.878
|
||||
c-10.603-22.743-25.188-43.678-43.034-61.525c-17.847-17.847-38.781-32.431-61.525-43.033L328.887,78.556l104.559,104.558
|
||||
L325.682,290.878z" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
45
src/main/resources/static/images/place_an_order.svg
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 503.945 503.945" style="enable-background:new 0 0 503.945 503.945;" xml:space="preserve">
|
||||
<path style="fill:#18456D;" d="M455.173,345.073l48-152.8c1.6-6.4,0.8-12.8-3.2-18.4s-10.4-8.8-16.8-8.8h-462.4
|
||||
c-6.4,0-12.8,3.2-16.8,8.8s-4.8,12-3.2,18.4l48,152.8c0,3.2,0.8,5.6,2.4,8.8l20.8,66.4c2.4,8.8,10.4,14.4,20,14.4h320
|
||||
c8.8,0,16.8-5.6,20-14.4l20.8-66.4L455.173,345.073z M73.573,285.073h356.8l-12,37.6h-333.6L73.573,285.073z M455.173,206.673
|
||||
l-11.2,36.8h-383.2l-11.2-36.8H455.173z M107.173,400.273l-8.8-36.8h308l-8.8,36.8H107.173z" />
|
||||
<path style="fill:#0B3249;" d="M499.973,179.473c-4-5.6-10.4-8.8-16.8-8.8h-462.4c-6.4,0-12.8,3.2-16.8,8.8s-4.8,12-3.2,18.4
|
||||
l48,152.8c0,3.2,0.8,5.6,2.4,8.8l20.8,66.4c0.8,1.6,0.8,3.2,1.6,4c-2.4,2.4-4,5.6-4,8.8c0,7.2,5.6,12.8,12.8,12.8h337.6
|
||||
c7.2,0,12.8-5.6,12.8-12.8c0-3.2-1.6-6.4-4-8.8c0.8-1.6,1.6-2.4,1.6-4l20.8-66.4l2.4-8.8l48-152.8
|
||||
C504.773,192.273,503.973,185.073,499.973,179.473z M98.373,369.873h308l-8.8,36.8h-290.4L98.373,369.873z M419.173,328.273h-334.4
|
||||
l-12-37.6h356.8L419.173,328.273z M443.173,249.873h-382.4l-11.2-36.8h405.6L443.173,249.873z" />
|
||||
<path style="fill:#18456D;" d="M153.573,187.473c-7.2,7.2-19.2,7.2-26.4,0l-16.8-16.8c-7.2-7.2-7.2-19.2,0-26.4l84.8-86.4
|
||||
c7.2-7.2,19.2-7.2,26.4,0l16.8,16.8c7.2,7.2,7.2,19.2,0,26.4L153.573,187.473z" />
|
||||
<path style="fill:#1B5A89;" d="M131.973,165.873l85.6-85.6c6.4-6.4,7.2-16.8,1.6-24c-7.2-5.6-17.6-4.8-24,1.6l-85.6,85.6
|
||||
c-6.4,6.4-7.2,16.8-1.6,24C115.173,173.073,125.573,173.073,131.973,165.873z" />
|
||||
<path style="fill:#0B3249;" d="M156.773,140.273c9.6,9.6-12,47.2-21.6,57.6c-9.6,9.6-25.6,9.6-36,0c-9.6-9.6-9.6-25.6,0-36
|
||||
C109.573,152.273,147.173,130.673,156.773,140.273z" />
|
||||
<path style="opacity:0.2;fill:#83C9CC;enable-background:new ;" d="M155.173,179.473c-1.6,23.2-24,32.8-37.6,29.6
|
||||
s-25.6-16-25.6-29.6s11.2-25.6,25.6-25.6C131.173,154.673,155.973,165.873,155.173,179.473z" />
|
||||
<circle style="fill:#196A9B;" cx="117.573" cy="179.473" r="25.6" />
|
||||
<path style="fill:#1B5A89;" d="M135.173,161.873c9.6,9.6,9.6,25.6,0,36c-9.6,9.6-25.6,9.6-36,0" />
|
||||
<path style="fill:#1B5A89;" d="M350.373,187.473c7.2,7.2,19.2,7.2,26.4,0l16.8-16.8c7.2-7.2,7.2-19.2,0-26.4l-84.8-86.4
|
||||
c-7.2-7.2-19.2-7.2-26.4,0l-16.8,16.8c-7.2,7.2-7.2,19.2,0,26.4L350.373,187.473z" />
|
||||
<path style="fill:#18456D;" d="M371.973,165.873l-85.6-85.6c-6.4-6.4-7.2-16.8-1.6-24c7.2-5.6,17.6-4.8,24,1.6l85.6,85.6
|
||||
c6.4,6.4,7.2,16.8,1.6,24C388.773,173.073,378.373,173.073,371.973,165.873z" />
|
||||
<path style="fill:#0B3249;" d="M347.173,140.273c-9.6,9.6,12,47.2,21.6,57.6c9.6,9.6,25.6,9.6,36,0c9.6-9.6,9.6-25.6,0-36
|
||||
C394.373,152.273,356.773,130.673,347.173,140.273z" />
|
||||
<path style="opacity:0.2;fill:#83C9CC;enable-background:new ;" d="M348.773,179.473c1.6,23.2,24,32.8,37.6,29.6
|
||||
s25.6-16,25.6-29.6s-11.2-25.6-25.6-25.6C372.773,154.673,347.973,165.873,348.773,179.473z" />
|
||||
<circle style="fill:#1B5A89;" cx="386.373" cy="179.473" r="25.6" />
|
||||
<path style="fill:#196A9B;" d="M368.773,161.873c-9.6,9.6-9.6,25.6,0,36c9.6,9.6,25.6,9.6,36,0" />
|
||||
<path style="fill:#FF8500;" d="M307.973,193.873l-48-47.2c-4.8-4.8-12-4.8-16.8,0l-47.2,47.2c-4.8,4.8-4.8,12,0,16.8s12,4.8,16.8,0
|
||||
l27.2-27.2v109.6c0,6.4,5.6,12,12,12s12-5.6,12-12v-109.6l27.2,27.2c2.4,2.4,5.6,3.2,8,3.2c3.2,0,6.4-0.8,8-3.2
|
||||
C311.973,205.873,311.973,198.673,307.973,193.873z" />
|
||||
<path style="fill:#FF5B00;" d="M291.173,210.673c2.4,2.4,4.8,3.2,8,3.2l-39.2-38.4c-4.8-4.8-12-4.8-16.8,0l-38.4,38.4
|
||||
c3.2,0,5.6-0.8,8-3.2l27.2-27.2v28.8v80.8c0,6.4,5.6,12,12,12c6.4,0,12-5.6,12-12v-80.8v-28.8L291.173,210.673z" />
|
||||
<path style="fill:#FF5B00;" d="M263.173,317.873c0,3.2-2.4,5.6-5.6,5.6h-11.2c-3.2,0-5.6-2.4-5.6-5.6l0,0c0-3.2,2.4-5.6,5.6-5.6
|
||||
h11.2C260.773,312.273,263.173,314.673,263.173,317.873L263.173,317.873z" />
|
||||
<path style="fill:#FF5B00;" d="M263.173,337.073c0,3.2-2.4,5.6-5.6,5.6h-11.2c-3.2,0-5.6-2.4-5.6-5.6l0,0c0-3.2,2.4-5.6,5.6-5.6
|
||||
h11.2C260.773,331.473,263.173,333.873,263.173,337.073L263.173,337.073z" />
|
||||
<path style="fill:#FF5B00;" d="M263.173,356.273c0,3.2-2.4,5.6-5.6,5.6h-11.2c-3.2,0-5.6-2.4-5.6-5.6l0,0c0-3.2,2.4-5.6,5.6-5.6
|
||||
h11.2C260.773,350.673,263.173,353.073,263.173,356.273L263.173,356.273z" />
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
10
src/main/resources/static/images/top.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" width="30.021px" height="30.021px" viewBox="0 0 30.021 30.021"
|
||||
style="enable-background:new 0 0 30.021 30.021;" xml:space="preserve">
|
||||
<path d="M29.069,22.276c-0.791,0.932-1.917,1.409-3.052,1.409c-0.913,0-1.834-0.312-2.587-0.949l-8.42-7.152l-8.42,7.151
|
||||
c-1.683,1.43-4.208,1.225-5.639-0.459c-1.43-1.686-1.224-4.208,0.46-5.64l11.01-9.351c1.493-1.269,3.686-1.269,5.178,0
|
||||
l11.011,9.351C30.294,18.068,30.499,20.591,29.069,22.276z" />
|
||||
</svg>
|
After Width: | Height: | Size: 800 B |
14
src/main/resources/static/resources/banner.json
Normal file
@ -0,0 +1,14 @@
|
||||
[
|
||||
{
|
||||
"Name": "排浊泡沫沐浴露",
|
||||
"Picture": "images/item/13.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "辣椒酱 风味豆豉油制辣椒",
|
||||
"Picture": "images/item/8.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "小麦漱口杯",
|
||||
"Picture": "images/item/5.jpeg"
|
||||
}
|
||||
]
|
790
src/main/resources/static/resources/item.json
Normal file
@ -0,0 +1,790 @@
|
||||
[
|
||||
{
|
||||
"Name": "电动牙刷",
|
||||
"Description": "高频震动磁悬浮马达,刷得干净,智能过压提醒,不伤牙龈,个性定制洁齿模式,满足多种口腔需求,无锈无金属刷头,清洁卫生高效",
|
||||
"Price": 159,
|
||||
"VipPrice": 149,
|
||||
"Tags": ["coupon", "price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["白色", "粉色", "蓝色"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/0.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "蓝牙耳机",
|
||||
"Description": "主动降噪无线蓝牙耳机",
|
||||
"Price": 1699,
|
||||
"VipPrice": null,
|
||||
"Tags": [],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "版本",
|
||||
"Contants": ["公开版", "快充套装", "个性定制版"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/1.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "花果香氛沐浴露套装",
|
||||
"Description": "主动降噪无线蓝牙耳机",
|
||||
"Price": 127,
|
||||
"VipPrice": 125,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "功效",
|
||||
"Contants": [
|
||||
"花果香氛三件套",
|
||||
"花果香氛三件套",
|
||||
"经典滋润三件套",
|
||||
"经典滋润三件套",
|
||||
"香氛美肌三件套",
|
||||
"香氛美肌三件套",
|
||||
"花香美肌三件套",
|
||||
"花香美肌三件套",
|
||||
"精油香氛三件套",
|
||||
"精油香氛三件套",
|
||||
"果萃香氛三件套",
|
||||
"果萃香氛三件套",
|
||||
"果萃滋润三件套",
|
||||
"果萃滋润三件套"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/2.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "台式机内存条",
|
||||
"Description": "【匠心淬炼,高性能超频内存】电镀镜面外观,不规则多层向切割技艺,呈现出折射RGB灯效。内存中的皇者!",
|
||||
"Price": 1699,
|
||||
"VipPrice": null,
|
||||
"Tags": [],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "频率",
|
||||
"Contants": ["3200Mhz", "3600Mhz", "3899MHz"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/3.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "无线蓝牙键盘",
|
||||
"Description": "办公键盘 超薄 带优联 深灰色 旗舰款",
|
||||
"Price": 799,
|
||||
"VipPrice": null,
|
||||
"Tags": [],
|
||||
"Options": [],
|
||||
"Picture": "images/item/4.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "小麦漱口杯",
|
||||
"Description": "创意 环保 小麦秸秆 洗漱杯子 漱口杯 牙杯",
|
||||
"Price": 20.76,
|
||||
"VipPrice": 18.9,
|
||||
"Tags": ["coupon", "price-break_discount"],
|
||||
"Options": [],
|
||||
"Picture": "images/item/5.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "飞天 酱香型白酒 53度 500ml",
|
||||
"Description": "单瓶装 收藏酒 陈年老酒",
|
||||
"Price": 4529,
|
||||
"VipPrice": null,
|
||||
"Tags": [],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "年份",
|
||||
"Contants": ["2010年", "2011年", "2012年"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/6.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "MX Vertical 人体工学鼠标",
|
||||
"Description": "【健康办公】人体工学鼠标,告别鼠标手!小手适用,柔软舒适!低噪点击,专注当下!",
|
||||
"Price": 569,
|
||||
"VipPrice": null,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "粉色", "白色"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/7.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "辣椒酱 风味豆豉油制辣椒 280g",
|
||||
"Description": null,
|
||||
"Price": 13.9,
|
||||
"VipPrice": 13.21,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [],
|
||||
"Picture": "images/item/8.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "食用油",
|
||||
"Description": "5S物理压榨 压榨一级 花生油 6.18L",
|
||||
"Price": 189.8,
|
||||
"VipPrice": null,
|
||||
"Tags": [],
|
||||
"Options": [],
|
||||
"Picture": "images/item/9.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "淡色拉格啤酒 450ml 整箱装",
|
||||
"Description": null,
|
||||
"Price": 49,
|
||||
"VipPrice": null,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "品种",
|
||||
"Contants": ["12听", "18听", "24听"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/10.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "运动鞋男鞋",
|
||||
"Description": "秋冬季 轻便减震 慢跑鞋 透气休闲 旅游鞋 跑步 鞋子男",
|
||||
"Price": 119,
|
||||
"VipPrice": null,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["曜石黑", "数字蓝", "宇宙灰", "烟灰", "皇冠金"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/11.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "外套男羊羔绒夹克",
|
||||
"Description": "加绒 加厚 上衣 男士 秋冬季新款 中青年 休闲 舒适 柔软 加厚 抗起球 休闲男装",
|
||||
"Price": 139,
|
||||
"VipPrice": null,
|
||||
"Tags": ["coupon"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "卡其色", "深灰色", "灰色", "军绿色"]
|
||||
},
|
||||
{
|
||||
"Name": "尺码",
|
||||
"Contants": ["M", "L", "XL", "2XL", "3XL", "4XL", "5XL"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/12.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "排浊泡沫沐浴露",
|
||||
"Description": "疏通毛孔 焕活肌肤",
|
||||
"Price": 64.9,
|
||||
"VipPrice": null,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "功效",
|
||||
"Contants": [
|
||||
"红石榴 啫喱款",
|
||||
"山茶花 啫喱款",
|
||||
"红石榴 泡沫款",
|
||||
"山茶花 泡沫款",
|
||||
"山茶花+红石榴 啫喱款",
|
||||
"山茶花+红石榴 泡沫款"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/13.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "狗玩具磨牙棒",
|
||||
"Description": "狗狗磨牙玩具",
|
||||
"Price": 26,
|
||||
"VipPrice": null,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/14.jpeg"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
},
|
||||
{
|
||||
"Name": "虚拟商品",
|
||||
"Description": "此商品的说明",
|
||||
"Price": 100,
|
||||
"VipPrice": 50,
|
||||
"Tags": ["price-break_discount"],
|
||||
"Options": [
|
||||
{
|
||||
"Name": "大小",
|
||||
"Contants": ["小号", "中号", "大号"]
|
||||
},
|
||||
{
|
||||
"Name": "颜色",
|
||||
"Contants": ["黑色", "白色", "灰色"]
|
||||
},
|
||||
{
|
||||
"Name": "语言",
|
||||
"Contants": ["英语", "中文", "日语"]
|
||||
}
|
||||
],
|
||||
"Picture": "images/item/placeholder.png"
|
||||
}
|
||||
]
|
1
src/main/resources/static/resources/recommend.json
Normal file
@ -0,0 +1 @@
|
||||
[1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14]
|
11
src/main/resources/static/scripts/back.js
Normal file
@ -0,0 +1,11 @@
|
||||
/**
|
||||
* back.js by Puqns_67
|
||||
*/
|
||||
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
Array.from(document.getElementsByClassName("back")).forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
window.location.replace(this.getAttribute("back_to"));
|
||||
});
|
||||
});
|
||||
});
|
33
src/main/resources/static/scripts/clock.js
Normal file
@ -0,0 +1,33 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
function genTime() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return new Date().toLocaleString(undefined, { hour12: false });
|
||||
});
|
||||
}
|
||||
function updateTime() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let nowTime = null;
|
||||
let clocks = Array.from(document.getElementsByClassName("CLOCK"));
|
||||
clocks.forEach((v) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (nowTime == null) {
|
||||
nowTime = yield genTime();
|
||||
}
|
||||
v.innerText = nowTime;
|
||||
}));
|
||||
});
|
||||
}
|
||||
window.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
console.info("[Clock] initializing");
|
||||
yield updateTime();
|
||||
window.setInterval(updateTime, 500);
|
||||
console.info("[Clock] initialization completed");
|
||||
}));
|
23
src/main/resources/static/scripts/edit.js
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* edit.js by Puqns_67
|
||||
*/
|
||||
|
||||
function getID(element) {
|
||||
return element.parentElement.parentElement.getAttribute("id");
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
let displayer = document.getElementById("Displayer");
|
||||
|
||||
Array.from(document.getElementsByClassName("update")).forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
displayer.src = `info.action?as=update.jsp&id=${getID(this)}`;
|
||||
});
|
||||
});
|
||||
|
||||
Array.from(document.getElementsByClassName("remove")).forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
displayer.src = `info.action?as=remove.jsp&id=${getID(this)}`;
|
||||
});
|
||||
});
|
||||
});
|
26
src/main/resources/static/scripts/footer.js
Normal file
@ -0,0 +1,26 @@
|
||||
let footer = null;
|
||||
|
||||
// 页面长度无法填满整个页面时挂起页尾
|
||||
function updatePinState() {
|
||||
let contextHight = (footer.hasAttribute("pined"))
|
||||
? document.body.clientHeight + footer.clientHeight
|
||||
: document.body.clientHeight;
|
||||
let result = contextHight < window.innerHeight;
|
||||
if (footer.hasAttribute("pined") != result)
|
||||
footer.toggleAttribute("pined", result);
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
console.info("[Footer] initializing");
|
||||
|
||||
// 初始化变量
|
||||
footer = document.getElementById("Footer");
|
||||
|
||||
// 在页面大小重置时更新挂起状态
|
||||
window.addEventListener("resize", updatePinState);
|
||||
|
||||
// 手动更新一次挂起状态
|
||||
updatePinState();
|
||||
|
||||
console.info("[Footer] initialization completed");
|
||||
});
|
86
src/main/resources/static/scripts/header.js
Normal file
@ -0,0 +1,86 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
function setPin(n, body, header) {
|
||||
if (body === undefined) {
|
||||
body = document.querySelector("body");
|
||||
}
|
||||
if (header === undefined) {
|
||||
header = document.getElementById("Header");
|
||||
}
|
||||
if (n) {
|
||||
console.info("[Header] Pining the header");
|
||||
body.toggleAttribute("headerPined", true);
|
||||
header.toggleAttribute("pined", true);
|
||||
}
|
||||
else {
|
||||
console.info("[Header] Unpining the header");
|
||||
body.removeAttribute("headerPined");
|
||||
header.removeAttribute("pined");
|
||||
}
|
||||
}
|
||||
window.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
console.info("[Header] initializing");
|
||||
let body = document.getElementsByTagName("body")[0];
|
||||
let header = document.getElementById("Header");
|
||||
// 初始化动画
|
||||
let lists = Array.from(header.getElementsByClassName("List"));
|
||||
lists.forEach((v) => {
|
||||
if (v.classList.contains("Button") || v.classList.contains("Link")) {
|
||||
let text = Array.from(v.getElementsByClassName("Text"));
|
||||
text.forEach((v) => {
|
||||
v.addEventListener("mouseenter", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
this.style.animationName = "BackgroundBlur";
|
||||
});
|
||||
});
|
||||
v.addEventListener("mouseleave", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
this.style.animationName = "BackgroundUnblur";
|
||||
});
|
||||
});
|
||||
v.addEventListener("animationend", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (this.style.animationName == "BackgroundBlur") {
|
||||
this.toggleAttribute("blured", true);
|
||||
}
|
||||
else {
|
||||
this.removeAttribute("blured");
|
||||
}
|
||||
this.style.animation = "";
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
// 初始化链接
|
||||
let links = Array.from(header.getElementsByClassName("Link"));
|
||||
links.forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!this.hasAttribute("this")) {
|
||||
let href = this.getAttribute("href");
|
||||
window.location.replace(href ? href : "index.jsp");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
// 初始化 PIN
|
||||
let pins = Array.from(document.getElementsByClassName("PIN"));
|
||||
pins.forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
setPin(this.toggleAttribute("checked"), body, header);
|
||||
});
|
||||
});
|
||||
setPin(v.hasAttribute("checked"), body, header);
|
||||
});
|
||||
console.info("[Header] initialization completed");
|
||||
}));
|
248
src/main/resources/static/scripts/index.js
Normal file
@ -0,0 +1,248 @@
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
import { getItems, getNextItem, hasNextItem, indexOf, loadItem, } from "./items.js";
|
||||
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
||||
// 源数据
|
||||
let rawBanners = [];
|
||||
// 图片与标题与选择器
|
||||
let BannerImageDisplayer;
|
||||
let BannerTitleDisplayer;
|
||||
let BannerSelectersDisplayer;
|
||||
let BannerSelecters = [];
|
||||
let Items;
|
||||
let LoadingDisplayer;
|
||||
let LoadingInfoDisplayer;
|
||||
// 变量
|
||||
let Modifyed = false;
|
||||
let LastetBanner = -1;
|
||||
let BannerIntervalID;
|
||||
let UpdatingItemFlag = false;
|
||||
let IsEnd = false;
|
||||
function switchBanner(bannerIndex = 0, isAuto = false) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
console.info(`[Index] switch banner to ${bannerIndex}`);
|
||||
// 替换图片与标题
|
||||
BannerImageDisplayer.src = rawBanners[bannerIndex].Picture;
|
||||
BannerTitleDisplayer.innerText = rawBanners[bannerIndex].Name;
|
||||
// 更改 Seleters 的状态
|
||||
BannerSelecters.forEach((v, i) => {
|
||||
i == bannerIndex
|
||||
? v.toggleAttribute("selected", true)
|
||||
: v.removeAttribute("selected");
|
||||
});
|
||||
// 记录状态
|
||||
LastetBanner = bannerIndex;
|
||||
Modifyed = !isAuto;
|
||||
});
|
||||
}
|
||||
function nextBanner() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
// 如果状态为手动修改则多暂停一会儿
|
||||
if (Modifyed) {
|
||||
window.clearInterval(BannerIntervalID);
|
||||
yield sleep(10000);
|
||||
Modifyed = false;
|
||||
BannerIntervalID = window.setInterval(nextBanner, 5000);
|
||||
}
|
||||
let newBannerIndex = LastetBanner + 1;
|
||||
if (newBannerIndex >= rawBanners.length) {
|
||||
newBannerIndex = 0;
|
||||
}
|
||||
yield switchBanner(newBannerIndex, true);
|
||||
});
|
||||
}
|
||||
function isContain(element) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
// 获取可视窗口的盖度
|
||||
let screenHeight = window.innerHeight ||
|
||||
document.documentElement.clientHeight ||
|
||||
document.body.clientHeight;
|
||||
// 元素偏移的高度减去滚动条滚动的高度后与可视窗口的盖度比较
|
||||
return (element.offsetTop - document.documentElement.scrollTop <= screenHeight);
|
||||
});
|
||||
}
|
||||
function updateItems() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
UpdatingItemFlag = true;
|
||||
do {
|
||||
let isNull = false;
|
||||
let section = document.createElement("div");
|
||||
for (var i = 0; i < 2; i++) {
|
||||
let item = yield getNextItem("INDEX");
|
||||
if (item == null) {
|
||||
LoadingDisplayer.style.display = "none";
|
||||
LoadingInfoDisplayer.innerText = "没有更多了";
|
||||
LoadingInfoDisplayer.style.display = "block";
|
||||
if (i == 0)
|
||||
isNull = true;
|
||||
IsEnd = true;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
let newItem = document.createElement("div");
|
||||
// 图片部分
|
||||
let newPictureDisplayer = document.createElement("div");
|
||||
let newImageElement = document.createElement("img");
|
||||
newImageElement.alt = item.Name;
|
||||
newImageElement.src = item.Picture;
|
||||
newPictureDisplayer.classList.add("Picture");
|
||||
newPictureDisplayer.append(newImageElement);
|
||||
// 价格文字部分
|
||||
let newPriceDisplayer = document.createElement("div");
|
||||
let newPriceText = document.createElement("span");
|
||||
newPriceText.innerText = `¥${item.Price}`;
|
||||
newPriceText.classList.add("Price");
|
||||
newPriceDisplayer.classList.add("Prices");
|
||||
newPriceDisplayer.append(newPriceText);
|
||||
if (item.VipPrice != null) {
|
||||
let newVipPriceText = document.createElement("span");
|
||||
newVipPriceText.classList.add("VipPrice");
|
||||
newVipPriceText.innerText = `¥${item.VipPrice}`;
|
||||
newPriceDisplayer.append(newVipPriceText);
|
||||
newPriceText.toggleAttribute("has_vip_price", true);
|
||||
}
|
||||
// 说明文字部分
|
||||
let newTextDisplayer = document.createElement("div");
|
||||
let newTitleDisplayer = document.createElement("div");
|
||||
let newTitleText = document.createElement("span");
|
||||
let newDescriptionText = document.createElement("span");
|
||||
if (item.Description)
|
||||
newDescriptionText.innerText = item.Description;
|
||||
newTitleText.innerText = item.Name;
|
||||
newDescriptionText.classList.add("Description");
|
||||
newTitleText.classList.add("Title");
|
||||
newTitleDisplayer.classList.add("TitlePrices");
|
||||
newTextDisplayer.classList.add("Descriptions");
|
||||
newTitleDisplayer.append(newTitleText, newPriceDisplayer);
|
||||
newTextDisplayer.append(newTitleDisplayer, newDescriptionText);
|
||||
// 按钮部分
|
||||
let newButtonDisplayer = document.createElement("div");
|
||||
let newOrderButton = document.createElement("div");
|
||||
let newCartButton = document.createElement("div");
|
||||
newCartButton.classList.add("Button", "AddToCart");
|
||||
newOrderButton.classList.add("Button", "PlaceAnOrder");
|
||||
newButtonDisplayer.classList.add("Buttons");
|
||||
newButtonDisplayer.append(newOrderButton, newCartButton);
|
||||
// 触发器
|
||||
newItem.addEventListener("click", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let ID = this.getAttribute("item_id");
|
||||
if (ID != null) {
|
||||
window.location.href = `item.jsp?item_id=${ID}`;
|
||||
}
|
||||
});
|
||||
});
|
||||
newItem.setAttribute("item_id", String(yield indexOf(item)));
|
||||
newItem.classList.add("Item");
|
||||
newItem.append(newPictureDisplayer, newTextDisplayer, newButtonDisplayer);
|
||||
section.append(newItem);
|
||||
}
|
||||
}
|
||||
if (!isNull) {
|
||||
section.classList.add("ItemSection");
|
||||
Items.append(section);
|
||||
}
|
||||
} while ((yield hasNextItem("INDEX")) &&
|
||||
(yield isContain(LoadingDisplayer)));
|
||||
UpdatingItemFlag = false;
|
||||
});
|
||||
}
|
||||
window.addEventListener("scroll", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
if (!IsEnd && !UpdatingItemFlag && (yield isContain(LoadingDisplayer)))
|
||||
yield updateItems();
|
||||
}));
|
||||
window.addEventListener("resize", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
if (!IsEnd && !UpdatingItemFlag && (yield isContain(LoadingDisplayer)))
|
||||
yield updateItems();
|
||||
}));
|
||||
window.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
console.info("[Index] initializing");
|
||||
let Contants = document.getElementById("Contents");
|
||||
let ContantsHeader = Contants.querySelector(".ContentHeader");
|
||||
Items = Contants.querySelector(".Items");
|
||||
let ContentFooter = Contants.querySelector(".ContentFooter");
|
||||
//
|
||||
// 滚动屏幕部分
|
||||
//
|
||||
rawBanners = yield window
|
||||
.fetch("resources/banner.json")
|
||||
.then((response) => __awaiter(void 0, void 0, void 0, function* () {
|
||||
if (response.ok) {
|
||||
return yield response.json();
|
||||
}
|
||||
else {
|
||||
console.warn(`[Index] Network request for banner.json failed with response ${response.status}: ${response.statusText}`);
|
||||
return [];
|
||||
}
|
||||
}));
|
||||
if (rawBanners.length != 0) {
|
||||
let Banner = ContantsHeader.querySelector(".RollingBanner");
|
||||
let Link = Banner.querySelector(".BannerImage");
|
||||
let Infos = Banner.querySelector(".Infos");
|
||||
BannerImageDisplayer = Link.querySelector("img");
|
||||
BannerTitleDisplayer = Infos.querySelector(".Title");
|
||||
BannerSelectersDisplayer = Infos.querySelector(".Selecter");
|
||||
rawBanners.forEach((_, i) => {
|
||||
let newSelecter = document.createElement("button");
|
||||
newSelecter.classList.add("Button");
|
||||
newSelecter.innerText = String(i + 1);
|
||||
newSelecter.addEventListener("click", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
yield switchBanner(Number(this.innerText) - 1);
|
||||
});
|
||||
});
|
||||
BannerSelectersDisplayer.append(newSelecter);
|
||||
BannerSelecters.push(newSelecter);
|
||||
});
|
||||
// 手动运行一次
|
||||
yield switchBanner(undefined, true);
|
||||
// 设置定时器
|
||||
BannerIntervalID = window.setInterval(nextBanner, 8000);
|
||||
}
|
||||
//
|
||||
// 推荐项目部分
|
||||
//
|
||||
yield loadItem();
|
||||
let rawItems = yield getItems();
|
||||
let rawRecommends = yield window
|
||||
.fetch("resources/recommend.json")
|
||||
.then((response) => __awaiter(void 0, void 0, void 0, function* () {
|
||||
if (response.ok) {
|
||||
return yield response.json();
|
||||
}
|
||||
else {
|
||||
console.warn(`[Index] Network request for recommend.json failed with response ${response.status}: ${response.statusText}`);
|
||||
return [];
|
||||
}
|
||||
}));
|
||||
let RecommendItemDisplayer = ContantsHeader.querySelector(".RecommendItems");
|
||||
rawRecommends.forEach((v) => {
|
||||
let newImageElement = document.createElement("img", {});
|
||||
let newPictureDisplayer = document.createElement("div");
|
||||
let newNameDisplayer = document.createElement("div");
|
||||
let newItem = document.createElement("div");
|
||||
newImageElement.src = rawItems[v].Picture;
|
||||
newImageElement.alt = rawItems[v].Name;
|
||||
newPictureDisplayer.classList.add("Picture");
|
||||
newPictureDisplayer.append(newImageElement);
|
||||
newNameDisplayer.innerText = rawItems[v].Name;
|
||||
newNameDisplayer.classList.add("Title");
|
||||
newItem.classList.add("Item");
|
||||
newItem.append(newPictureDisplayer, newNameDisplayer);
|
||||
RecommendItemDisplayer.append(newItem);
|
||||
});
|
||||
//
|
||||
// 内容自动加载部分
|
||||
//
|
||||
LoadingDisplayer = ContentFooter.querySelector(".Loading");
|
||||
LoadingInfoDisplayer = ContentFooter.querySelector(".Info");
|
||||
yield updateItems();
|
||||
console.info("[Index] initialization completed");
|
||||
}));
|
80
src/main/resources/static/scripts/item.js
Normal file
@ -0,0 +1,80 @@
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
import { getItem, loadItem } from "./items.js";
|
||||
let ID;
|
||||
let TheItem;
|
||||
window.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
let rawID = new URLSearchParams(window.location.search).get("item_id");
|
||||
if (rawID == null || rawID == "")
|
||||
window.location.replace("index.jsp");
|
||||
ID = Number(rawID);
|
||||
yield loadItem();
|
||||
let rawItem = yield getItem(ID);
|
||||
if (rawItem == null)
|
||||
window.location.replace("index.jsp");
|
||||
TheItem = rawItem;
|
||||
let ItemDisplayer = document.querySelector(".Item");
|
||||
let PictureDisplayer = ItemDisplayer.querySelector(".Picture");
|
||||
let InfoDisplayer = ItemDisplayer.querySelector(".Infos");
|
||||
// 图片部分
|
||||
let Image = PictureDisplayer.querySelector("img");
|
||||
Image.src = TheItem.Picture;
|
||||
// 说明文字部分
|
||||
let TitleDisplayer = InfoDisplayer.querySelector(".Title");
|
||||
let DescriptionDisplayer = InfoDisplayer.querySelector(".Description");
|
||||
let OptionDisplayer = InfoDisplayer.querySelector(".Options");
|
||||
TitleDisplayer.innerText = TheItem.Name;
|
||||
if (TheItem.Description != null)
|
||||
DescriptionDisplayer.innerText = TheItem.Description;
|
||||
// 价格文字部分
|
||||
let PriceDisplayer = InfoDisplayer.querySelector(".Prices");
|
||||
let Price = PriceDisplayer.querySelector(".Price");
|
||||
Price.innerText = `¥${TheItem.Price}`;
|
||||
if (TheItem.VipPrice != null) {
|
||||
let VipPrice = PriceDisplayer.querySelector(".VipPrice");
|
||||
VipPrice.innerText = `¥${TheItem.VipPrice}`;
|
||||
Price.toggleAttribute("has_vip_price", true);
|
||||
}
|
||||
// 选项部分
|
||||
TheItem.Options.forEach((v) => {
|
||||
let newOptionElement = document.createElement("div");
|
||||
let newOptionTitle = document.createElement("div");
|
||||
let newOptionSelecter = document.createElement("div");
|
||||
v.Contants.forEach((v, i) => {
|
||||
let newOption = document.createElement("div");
|
||||
newOption.innerHTML = v;
|
||||
newOption.classList.add("Option");
|
||||
if (i == 0)
|
||||
newOption.toggleAttribute("selected", true);
|
||||
newOptionSelecter.append(newOption);
|
||||
});
|
||||
newOptionTitle.innerText = v.Name;
|
||||
newOptionSelecter.classList.add("Contants");
|
||||
newOptionTitle.classList.add("Title");
|
||||
newOptionElement.classList.add("Option");
|
||||
newOptionElement.append(newOptionTitle, newOptionSelecter);
|
||||
OptionDisplayer.append(newOptionElement);
|
||||
});
|
||||
// 为选项添加点击事件
|
||||
Array.from(OptionDisplayer.children).forEach((v) => {
|
||||
let contants = v.querySelector(".Contants");
|
||||
Array.from(contants.children).forEach((v) => {
|
||||
v.addEventListener("click", function () {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
Array.from(this.parentElement
|
||||
.children).forEach((v) => {
|
||||
v.removeAttribute("selected");
|
||||
});
|
||||
this.toggleAttribute("selected", true);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}));
|
71
src/main/resources/static/scripts/items.js
Normal file
@ -0,0 +1,71 @@
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
const NextMap = new Map();
|
||||
let isItemLoaded = false;
|
||||
let Items = [];
|
||||
export function loadItem(force = false) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!force && isItemLoaded) {
|
||||
return;
|
||||
}
|
||||
Items = yield window.fetch("resources/item.json").then((response) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (response.ok) {
|
||||
return yield response.json();
|
||||
}
|
||||
else {
|
||||
console.warn(`[Index] Network request for item.json failed with response ${response.status}: ${response.statusText}`);
|
||||
return [];
|
||||
}
|
||||
}));
|
||||
isItemLoaded = true;
|
||||
});
|
||||
}
|
||||
export function getItem(ID) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return ID < Items.length ? Items[ID] : null;
|
||||
});
|
||||
}
|
||||
export function getItems() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return Items;
|
||||
});
|
||||
}
|
||||
export function indexOf(item) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return Items.indexOf(item);
|
||||
});
|
||||
}
|
||||
export function hasNextItem(ID) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!NextMap.has(ID))
|
||||
NextMap.set(ID, -1);
|
||||
let next = NextMap.get(ID) + 1;
|
||||
if (next < Items.length) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
export function getNextItem(ID) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (!NextMap.has(ID))
|
||||
NextMap.set(ID, -1);
|
||||
let next = NextMap.get(ID) + 1;
|
||||
if (next < Items.length) {
|
||||
NextMap.set(ID, next);
|
||||
return Items[next];
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
33
src/main/resources/static/scripts/lib/anime.min.js
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
2017 Julian Garnier
|
||||
Released under the MIT license
|
||||
*/
|
||||
var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(e,r,p){if(p.get||p.set)throw new TypeError("ES3 does not support getters and setters.");e!=Array.prototype&&e!=Object.prototype&&(e[r]=p.value)};$jscomp.getGlobal=function(e){return"undefined"!=typeof window&&window===e?e:"undefined"!=typeof global&&null!=global?global:e};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
|
||||
$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(e){return $jscomp.SYMBOL_PREFIX+(e||"")+$jscomp.symbolCounter_++};
|
||||
$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var r=0;return $jscomp.iteratorPrototype(function(){return r<e.length?{done:!1,value:e[r++]}:{done:!0}})};
|
||||
$jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.array=$jscomp.array||{};$jscomp.iteratorFromArray=function(e,r){$jscomp.initSymbolIterator();e instanceof String&&(e+="");var p=0,m={next:function(){if(p<e.length){var u=p++;return{value:r(u,e[u]),done:!1}}m.next=function(){return{done:!0,value:void 0}};return m.next()}};m[Symbol.iterator]=function(){return m};return m};
|
||||
$jscomp.polyfill=function(e,r,p,m){if(r){p=$jscomp.global;e=e.split(".");for(m=0;m<e.length-1;m++){var u=e[m];u in p||(p[u]={});p=p[u]}e=e[e.length-1];m=p[e];r=r(m);r!=m&&null!=r&&$jscomp.defineProperty(p,e,{configurable:!0,writable:!0,value:r})}};$jscomp.polyfill("Array.prototype.keys",function(e){return e?e:function(){return $jscomp.iteratorFromArray(this,function(e){return e})}},"es6-impl","es3");var $jscomp$this=this;
|
||||
(function(e,r){"function"===typeof define&&define.amd?define([],r):"object"===typeof module&&module.exports?module.exports=r():e.anime=r()})(this,function(){function e(a){if(!h.col(a))try{return document.querySelectorAll(a)}catch(c){}}function r(a,c){for(var d=a.length,b=2<=arguments.length?arguments[1]:void 0,f=[],n=0;n<d;n++)if(n in a){var k=a[n];c.call(b,k,n,a)&&f.push(k)}return f}function p(a){return a.reduce(function(a,d){return a.concat(h.arr(d)?p(d):d)},[])}function m(a){if(h.arr(a))return a;
|
||||
h.str(a)&&(a=e(a)||a);return a instanceof NodeList||a instanceof HTMLCollection?[].slice.call(a):[a]}function u(a,c){return a.some(function(a){return a===c})}function C(a){var c={},d;for(d in a)c[d]=a[d];return c}function D(a,c){var d=C(a),b;for(b in a)d[b]=c.hasOwnProperty(b)?c[b]:a[b];return d}function z(a,c){var d=C(a),b;for(b in c)d[b]=h.und(a[b])?c[b]:a[b];return d}function T(a){a=a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(a,c,d,k){return c+c+d+d+k+k});var c=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);
|
||||
a=parseInt(c[1],16);var d=parseInt(c[2],16),c=parseInt(c[3],16);return"rgba("+a+","+d+","+c+",1)"}function U(a){function c(a,c,b){0>b&&(b+=1);1<b&&--b;return b<1/6?a+6*(c-a)*b:.5>b?c:b<2/3?a+(c-a)*(2/3-b)*6:a}var d=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(a);a=parseInt(d[1])/360;var b=parseInt(d[2])/100,f=parseInt(d[3])/100,d=d[4]||1;if(0==b)f=b=a=f;else{var n=.5>f?f*(1+b):f+b-f*b,k=2*f-n,f=c(k,n,a+1/3),b=c(k,n,a);a=c(k,n,a-1/3)}return"rgba("+
|
||||
255*f+","+255*b+","+255*a+","+d+")"}function y(a){if(a=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a))return a[2]}function V(a){if(-1<a.indexOf("translate")||"perspective"===a)return"px";if(-1<a.indexOf("rotate")||-1<a.indexOf("skew"))return"deg"}function I(a,c){return h.fnc(a)?a(c.target,c.id,c.total):a}function E(a,c){if(c in a.style)return getComputedStyle(a).getPropertyValue(c.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase())||"0"}function J(a,c){if(h.dom(a)&&
|
||||
u(W,c))return"transform";if(h.dom(a)&&(a.getAttribute(c)||h.svg(a)&&a[c]))return"attribute";if(h.dom(a)&&"transform"!==c&&E(a,c))return"css";if(null!=a[c])return"object"}function X(a,c){var d=V(c),d=-1<c.indexOf("scale")?1:0+d;a=a.style.transform;if(!a)return d;for(var b=[],f=[],n=[],k=/(\w+)\((.+?)\)/g;b=k.exec(a);)f.push(b[1]),n.push(b[2]);a=r(n,function(a,b){return f[b]===c});return a.length?a[0]:d}function K(a,c){switch(J(a,c)){case "transform":return X(a,c);case "css":return E(a,c);case "attribute":return a.getAttribute(c)}return a[c]||
|
||||
0}function L(a,c){var d=/^(\*=|\+=|-=)/.exec(a);if(!d)return a;var b=y(a)||0;c=parseFloat(c);a=parseFloat(a.replace(d[0],""));switch(d[0][0]){case "+":return c+a+b;case "-":return c-a+b;case "*":return c*a+b}}function F(a,c){return Math.sqrt(Math.pow(c.x-a.x,2)+Math.pow(c.y-a.y,2))}function M(a){a=a.points;for(var c=0,d,b=0;b<a.numberOfItems;b++){var f=a.getItem(b);0<b&&(c+=F(d,f));d=f}return c}function N(a){if(a.getTotalLength)return a.getTotalLength();switch(a.tagName.toLowerCase()){case "circle":return 2*
|
||||
Math.PI*a.getAttribute("r");case "rect":return 2*a.getAttribute("width")+2*a.getAttribute("height");case "line":return F({x:a.getAttribute("x1"),y:a.getAttribute("y1")},{x:a.getAttribute("x2"),y:a.getAttribute("y2")});case "polyline":return M(a);case "polygon":var c=a.points;return M(a)+F(c.getItem(c.numberOfItems-1),c.getItem(0))}}function Y(a,c){function d(b){b=void 0===b?0:b;return a.el.getPointAtLength(1<=c+b?c+b:0)}var b=d(),f=d(-1),n=d(1);switch(a.property){case "x":return b.x;case "y":return b.y;
|
||||
case "angle":return 180*Math.atan2(n.y-f.y,n.x-f.x)/Math.PI}}function O(a,c){var d=/-?\d*\.?\d+/g,b;b=h.pth(a)?a.totalLength:a;if(h.col(b))if(h.rgb(b)){var f=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(b);b=f?"rgba("+f[1]+",1)":b}else b=h.hex(b)?T(b):h.hsl(b)?U(b):void 0;else f=(f=y(b))?b.substr(0,b.length-f.length):b,b=c&&!/\s/g.test(b)?f+c:f;b+="";return{original:b,numbers:b.match(d)?b.match(d).map(Number):[0],strings:h.str(a)||c?b.split(d):[]}}function P(a){a=a?p(h.arr(a)?a.map(m):m(a)):[];return r(a,
|
||||
function(a,d,b){return b.indexOf(a)===d})}function Z(a){var c=P(a);return c.map(function(a,b){return{target:a,id:b,total:c.length}})}function aa(a,c){var d=C(c);if(h.arr(a)){var b=a.length;2!==b||h.obj(a[0])?h.fnc(c.duration)||(d.duration=c.duration/b):a={value:a}}return m(a).map(function(a,b){b=b?0:c.delay;a=h.obj(a)&&!h.pth(a)?a:{value:a};h.und(a.delay)&&(a.delay=b);return a}).map(function(a){return z(a,d)})}function ba(a,c){var d={},b;for(b in a){var f=I(a[b],c);h.arr(f)&&(f=f.map(function(a){return I(a,
|
||||
c)}),1===f.length&&(f=f[0]));d[b]=f}d.duration=parseFloat(d.duration);d.delay=parseFloat(d.delay);return d}function ca(a){return h.arr(a)?A.apply(this,a):Q[a]}function da(a,c){var d;return a.tweens.map(function(b){b=ba(b,c);var f=b.value,e=K(c.target,a.name),k=d?d.to.original:e,k=h.arr(f)?f[0]:k,w=L(h.arr(f)?f[1]:f,k),e=y(w)||y(k)||y(e);b.from=O(k,e);b.to=O(w,e);b.start=d?d.end:a.offset;b.end=b.start+b.delay+b.duration;b.easing=ca(b.easing);b.elasticity=(1E3-Math.min(Math.max(b.elasticity,1),999))/
|
||||
1E3;b.isPath=h.pth(f);b.isColor=h.col(b.from.original);b.isColor&&(b.round=1);return d=b})}function ea(a,c){return r(p(a.map(function(a){return c.map(function(b){var c=J(a.target,b.name);if(c){var d=da(b,a);b={type:c,property:b.name,animatable:a,tweens:d,duration:d[d.length-1].end,delay:d[0].delay}}else b=void 0;return b})})),function(a){return!h.und(a)})}function R(a,c,d,b){var f="delay"===a;return c.length?(f?Math.min:Math.max).apply(Math,c.map(function(b){return b[a]})):f?b.delay:d.offset+b.delay+
|
||||
b.duration}function fa(a){var c=D(ga,a),d=D(S,a),b=Z(a.targets),f=[],e=z(c,d),k;for(k in a)e.hasOwnProperty(k)||"targets"===k||f.push({name:k,offset:e.offset,tweens:aa(a[k],d)});a=ea(b,f);return z(c,{children:[],animatables:b,animations:a,duration:R("duration",a,c,d),delay:R("delay",a,c,d)})}function q(a){function c(){return window.Promise&&new Promise(function(a){return p=a})}function d(a){return g.reversed?g.duration-a:a}function b(a){for(var b=0,c={},d=g.animations,f=d.length;b<f;){var e=d[b],
|
||||
k=e.animatable,h=e.tweens,n=h.length-1,l=h[n];n&&(l=r(h,function(b){return a<b.end})[0]||l);for(var h=Math.min(Math.max(a-l.start-l.delay,0),l.duration)/l.duration,w=isNaN(h)?1:l.easing(h,l.elasticity),h=l.to.strings,p=l.round,n=[],m=void 0,m=l.to.numbers.length,t=0;t<m;t++){var x=void 0,x=l.to.numbers[t],q=l.from.numbers[t],x=l.isPath?Y(l.value,w*x):q+w*(x-q);p&&(l.isColor&&2<t||(x=Math.round(x*p)/p));n.push(x)}if(l=h.length)for(m=h[0],w=0;w<l;w++)p=h[w+1],t=n[w],isNaN(t)||(m=p?m+(t+p):m+(t+" "));
|
||||
else m=n[0];ha[e.type](k.target,e.property,m,c,k.id);e.currentValue=m;b++}if(b=Object.keys(c).length)for(d=0;d<b;d++)H||(H=E(document.body,"transform")?"transform":"-webkit-transform"),g.animatables[d].target.style[H]=c[d].join(" ");g.currentTime=a;g.progress=a/g.duration*100}function f(a){if(g[a])g[a](g)}function e(){g.remaining&&!0!==g.remaining&&g.remaining--}function k(a){var k=g.duration,n=g.offset,w=n+g.delay,r=g.currentTime,x=g.reversed,q=d(a);if(g.children.length){var u=g.children,v=u.length;
|
||||
if(q>=g.currentTime)for(var G=0;G<v;G++)u[G].seek(q);else for(;v--;)u[v].seek(q)}if(q>=w||!k)g.began||(g.began=!0,f("begin")),f("run");if(q>n&&q<k)b(q);else if(q<=n&&0!==r&&(b(0),x&&e()),q>=k&&r!==k||!k)b(k),x||e();f("update");a>=k&&(g.remaining?(t=h,"alternate"===g.direction&&(g.reversed=!g.reversed)):(g.pause(),g.completed||(g.completed=!0,f("complete"),"Promise"in window&&(p(),m=c()))),l=0)}a=void 0===a?{}:a;var h,t,l=0,p=null,m=c(),g=fa(a);g.reset=function(){var a=g.direction,c=g.loop;g.currentTime=
|
||||
0;g.progress=0;g.paused=!0;g.began=!1;g.completed=!1;g.reversed="reverse"===a;g.remaining="alternate"===a&&1===c?2:c;b(0);for(a=g.children.length;a--;)g.children[a].reset()};g.tick=function(a){h=a;t||(t=h);k((l+h-t)*q.speed)};g.seek=function(a){k(d(a))};g.pause=function(){var a=v.indexOf(g);-1<a&&v.splice(a,1);g.paused=!0};g.play=function(){g.paused&&(g.paused=!1,t=0,l=d(g.currentTime),v.push(g),B||ia())};g.reverse=function(){g.reversed=!g.reversed;t=0;l=d(g.currentTime)};g.restart=function(){g.pause();
|
||||
g.reset();g.play()};g.finished=m;g.reset();g.autoplay&&g.play();return g}var ga={update:void 0,begin:void 0,run:void 0,complete:void 0,loop:1,direction:"normal",autoplay:!0,offset:0},S={duration:1E3,delay:0,easing:"easeOutElastic",elasticity:500,round:0},W="translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "),H,h={arr:function(a){return Array.isArray(a)},obj:function(a){return-1<Object.prototype.toString.call(a).indexOf("Object")},
|
||||
pth:function(a){return h.obj(a)&&a.hasOwnProperty("totalLength")},svg:function(a){return a instanceof SVGElement},dom:function(a){return a.nodeType||h.svg(a)},str:function(a){return"string"===typeof a},fnc:function(a){return"function"===typeof a},und:function(a){return"undefined"===typeof a},hex:function(a){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)},rgb:function(a){return/^rgb/.test(a)},hsl:function(a){return/^hsl/.test(a)},col:function(a){return h.hex(a)||h.rgb(a)||h.hsl(a)}},A=function(){function a(a,
|
||||
d,b){return(((1-3*b+3*d)*a+(3*b-6*d))*a+3*d)*a}return function(c,d,b,f){if(0<=c&&1>=c&&0<=b&&1>=b){var e=new Float32Array(11);if(c!==d||b!==f)for(var k=0;11>k;++k)e[k]=a(.1*k,c,b);return function(k){if(c===d&&b===f)return k;if(0===k)return 0;if(1===k)return 1;for(var h=0,l=1;10!==l&&e[l]<=k;++l)h+=.1;--l;var l=h+(k-e[l])/(e[l+1]-e[l])*.1,n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(.001<=n){for(h=0;4>h;++h){n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(0===n)break;var m=a(l,c,b)-k,l=l-m/n}k=l}else if(0===
|
||||
n)k=l;else{var l=h,h=h+.1,g=0;do m=l+(h-l)/2,n=a(m,c,b)-k,0<n?h=m:l=m;while(1e-7<Math.abs(n)&&10>++g);k=m}return a(k,d,f)}}}}(),Q=function(){function a(a,b){return 0===a||1===a?a:-Math.pow(2,10*(a-1))*Math.sin(2*(a-1-b/(2*Math.PI)*Math.asin(1))*Math.PI/b)}var c="Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),d={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],a],Out:[[.25,
|
||||
.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(b,c){return 1-a(1-b,c)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(b,c){return.5>b?a(2*b,c)/2:1-a(-2*b+2,c)/2}]},b={linear:A(.25,.25,.75,.75)},f={},e;for(e in d)f.type=e,d[f.type].forEach(function(a){return function(d,f){b["ease"+a.type+c[f]]=h.fnc(d)?
|
||||
d:A.apply($jscomp$this,d)}}(f)),f={type:f.type};return b}(),ha={css:function(a,c,d){return a.style[c]=d},attribute:function(a,c,d){return a.setAttribute(c,d)},object:function(a,c,d){return a[c]=d},transform:function(a,c,d,b,f){b[f]||(b[f]=[]);b[f].push(c+"("+d+")")}},v=[],B=0,ia=function(){function a(){B=requestAnimationFrame(c)}function c(c){var b=v.length;if(b){for(var d=0;d<b;)v[d]&&v[d].tick(c),d++;a()}else cancelAnimationFrame(B),B=0}return a}();q.version="2.2.0";q.speed=1;q.running=v;q.remove=
|
||||
function(a){a=P(a);for(var c=v.length;c--;)for(var d=v[c],b=d.animations,f=b.length;f--;)u(a,b[f].animatable.target)&&(b.splice(f,1),b.length||d.pause())};q.getValue=K;q.path=function(a,c){var d=h.str(a)?e(a)[0]:a,b=c||100;return function(a){return{el:d,property:a,totalLength:N(d)*(b/100)}}};q.setDashoffset=function(a){var c=N(a);a.setAttribute("stroke-dasharray",c);return c};q.bezier=A;q.easings=Q;q.timeline=function(a){var c=q(a);c.pause();c.duration=0;c.add=function(d){c.children.forEach(function(a){a.began=
|
||||
!0;a.completed=!0});m(d).forEach(function(b){var d=z(b,D(S,a||{}));d.targets=d.targets||a.targets;b=c.duration;var e=d.offset;d.autoplay=!1;d.direction=c.direction;d.offset=h.und(e)?b:L(e,b);c.began=!0;c.completed=!0;c.seek(d.offset);d=q(d);d.began=!0;d.completed=!0;d.duration>b&&(c.duration=d.duration);c.children.push(d)});c.seek(0);c.reset();c.autoplay&&c.restart();return c};return c};q.random=function(a,c){return Math.floor(Math.random()*(c-a+1))+a};return q});
|
1
src/main/resources/static/scripts/lib/explosion.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
"use strict";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color="#F00",a.radius=.1,a.alpha=.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++)e.animatables[t].target.draw()}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++)n.push(createParticule(e,t));anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:.1,duration:anime.random(1200,1800),easing:"easeOutExpo",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:"linear",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:"easeOutExpo",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(".fireworks");if(canvasEl){var ctx=canvasEl.getContext("2d"),numberOfParticules=30,pointerX=0,pointerY=0,tap="mousedown",colors=["#FF1461","#18FF92","#5A87FF","#FBF38C"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+"px",canvasEl.style.height=window.innerHeight+"px",canvasEl.getContext("2d").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){"sidebar"!==e.target.id&&"toggle-sidebar"!==e.target.id&&"A"!==e.target.nodeName&&"IMG"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener("resize",setCanvasSize,!1)}
|
1
src/main/resources/static/scripts/resources.js
Normal file
@ -0,0 +1 @@
|
||||
export {};
|
50
src/main/resources/static/scripts/top.js
Normal file
@ -0,0 +1,50 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
let topButtons;
|
||||
let lastScrollPosition = 0;
|
||||
let ticking = false;
|
||||
function setDisplay() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (window.innerHeight < lastScrollPosition) {
|
||||
topButtons.forEach((v) => {
|
||||
v.style.display = "";
|
||||
});
|
||||
}
|
||||
else {
|
||||
topButtons.forEach((v) => {
|
||||
v.style.display = "none";
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
window.addEventListener("scroll", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
lastScrollPosition = window.scrollY;
|
||||
if (!ticking) {
|
||||
window.requestAnimationFrame(() => __awaiter(void 0, void 0, void 0, function* () {
|
||||
yield setDisplay();
|
||||
// 设置 flag
|
||||
ticking = false;
|
||||
}));
|
||||
ticking = true;
|
||||
}
|
||||
}));
|
||||
window.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
console.info("[Top] initializing");
|
||||
topButtons = Array.from(document.getElementsByClassName("TOP"));
|
||||
topButtons.forEach((v) => {
|
||||
v.addEventListener("click", () => __awaiter(void 0, void 0, void 0, function* () {
|
||||
console.info("[Top] scrolling to top");
|
||||
window.scrollTo(window.innerWidth / 2, 0);
|
||||
}));
|
||||
});
|
||||
yield setDisplay();
|
||||
console.info("[Top] initialization completed");
|
||||
}));
|
14
src/main/resources/static/styles/clock.css
Normal file
@ -0,0 +1,14 @@
|
||||
@font-face {
|
||||
font-family: "LcdD";
|
||||
src: url("../fonts/LcdD.ttf");
|
||||
}
|
||||
|
||||
.CLOCK {
|
||||
width: 140px;
|
||||
color: rgb(0, 255, 90);
|
||||
text-align: center;
|
||||
font-family: "LcdD";
|
||||
border: 3px solid black;
|
||||
border-radius: 5px;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
92
src/main/resources/static/styles/edit.css
Normal file
@ -0,0 +1,92 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Contents {
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
}
|
||||
|
||||
#Contents > .Editor {
|
||||
flex: 4 0 0;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
width: auto;
|
||||
margin: 5px;
|
||||
padding: 5px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Title {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Result {
|
||||
color: wheat;
|
||||
border: 3px solid skyblue;
|
||||
border-spacing: 0;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Result td {
|
||||
white-space: nowrap;
|
||||
border: 1px solid cornflowerblue;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Result > thead {
|
||||
background-color: #044488;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Result > tbody {
|
||||
background-color: #008080;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Pages > * {
|
||||
color: wheat;
|
||||
margin-right: 3px;
|
||||
border: 3px solid skyblue;
|
||||
border-radius: 10px;
|
||||
background-color: cadetblue;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Pages > *:last-child {
|
||||
margin-right: inherit;
|
||||
}
|
||||
|
||||
#Contents > .Editor > .Pages > span {
|
||||
color: green;
|
||||
}
|
||||
|
||||
#Contents > .UserEditor {
|
||||
flex: 1 0 0;
|
||||
margin: 5px;
|
||||
padding: 5px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
#Contents > .UserEditor > .Displayer {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
@media (min-width: 1280px) {
|
||||
#Contents {
|
||||
width: 1280px;
|
||||
}
|
||||
}
|
60
src/main/resources/static/styles/error.css
Normal file
@ -0,0 +1,60 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Contents {
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ErrorInfo {
|
||||
flex-direction: column;
|
||||
width: 480px;
|
||||
margin: 5px;
|
||||
padding: 26px 48px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.ErrorTitle, .ErrorMessage, .ErrorRedirectMessage {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
color: wheat;
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
.ErrorTitle {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.ErrorRedirectButton {
|
||||
margin: 20px 15px;
|
||||
padding: 8px 0px;
|
||||
border: 3px solid skyblue;
|
||||
border-radius: 10px;
|
||||
font-size: 18px;
|
||||
background: aqua;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
#Contents {
|
||||
width: 640px;
|
||||
}
|
||||
}
|
44
src/main/resources/static/styles/footer.css
Normal file
@ -0,0 +1,44 @@
|
||||
#Footer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: 150px;
|
||||
width: 100%;
|
||||
border-top: 2px solid #3bfeff;
|
||||
background-image: linear-gradient(#489dff, #355ae8, #702CF5);
|
||||
}
|
||||
|
||||
#Footer[pined] {
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
#Footer div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Footer .Infos {
|
||||
flex: 1 0;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
align-items: flex-start;
|
||||
padding: 10px 50px 10px 50px;
|
||||
}
|
||||
|
||||
#Footer .Infos .Icon {
|
||||
height: 80px;
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
#Footer .Contents {
|
||||
flex-direction: column;
|
||||
padding-left: 15px;
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
#Footer .Links {
|
||||
flex: 1 0;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
align-items: flex-end;
|
||||
padding: 10px 50px 10px 50px;
|
||||
}
|
49
src/main/resources/static/styles/form.css
Normal file
@ -0,0 +1,49 @@
|
||||
.TabForm {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.TabForm > .TabTitle {
|
||||
margin: 20px 0px;
|
||||
font-weight: bold;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.TabForm > .TabFormItems {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.TabForm > .TabFormItems > .TabFormItem {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.TabForm > .TabFormItems > .TabFormItem > .ItemName {
|
||||
flex: 1 0 0;
|
||||
}
|
||||
|
||||
.TabForm > .TabFormItems > .TabFormItem > .ItemInput {
|
||||
flex: 1 0 0;
|
||||
margin-left: 20px;
|
||||
border-radius: 10px;
|
||||
border: 3px solid skyblue;
|
||||
}
|
||||
|
||||
.TabForm > .TabButtons > .TabButton {
|
||||
flex: 1;
|
||||
margin: 20px 15px;
|
||||
padding: 8px 0px;
|
||||
border: 3px solid skyblue;
|
||||
border-radius: 10px;
|
||||
font-size: 18px;
|
||||
background: unset;
|
||||
}
|
||||
|
||||
.TabForm > .TabButtons > .TabButton[type="reset"] {
|
||||
background: cornflowerblue;
|
||||
}
|
||||
|
||||
.TabForm > .TabButtons > .TabButton[type="submit"] {
|
||||
background: aqua;
|
||||
}
|
131
src/main/resources/static/styles/header.css
Normal file
@ -0,0 +1,131 @@
|
||||
@font-face {
|
||||
font-family: "SmileySans";
|
||||
src: url("../fonts/SmileySans-Oblique.otf.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@keyframes BackgroundBlur {
|
||||
from {
|
||||
border-radius: 0px;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
to {
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes BackgroundUnblur {
|
||||
from {
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
to {
|
||||
border-radius: 0px;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
body[headerPined] {
|
||||
padding-top: 58px;
|
||||
}
|
||||
|
||||
#Header {
|
||||
display: flex;
|
||||
height: 56px;
|
||||
width: 100%;
|
||||
flex-direction: row;
|
||||
border-bottom: 2px solid #3bfeff;
|
||||
background-image: linear-gradient(#355ae8, #489dff);
|
||||
}
|
||||
|
||||
#Header[pined] {
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
#Header .List {
|
||||
flex: 0 0 auto;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
color: wheat;
|
||||
}
|
||||
|
||||
#Header .List .Text {
|
||||
padding: 3px;
|
||||
animation-duration: 0.3s;
|
||||
}
|
||||
|
||||
#Header .List .Text[blured] {
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
#Header .Blank {
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
|
||||
#Header .Title {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
font-size: 32px;
|
||||
font-family: "SmileySans";
|
||||
}
|
||||
|
||||
#Header .Link .Text {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
#Header .Link[this] {
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
#Header .Button .Text {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#Header .SearchBar {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
#Header .SearchBar .InputBar {
|
||||
flex-grow: 1;
|
||||
|
||||
height: 30px;
|
||||
border: 2px solid #3bfeff;
|
||||
border-radius: 15px;
|
||||
background-image: linear-gradient(#489dff, #355ae8);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
#Header .Clock {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
#Header .PinHeader .PIN {
|
||||
padding: 10px;
|
||||
height: 25px;
|
||||
width: 25px;
|
||||
}
|
||||
|
||||
#Header .PinHeader .PIN {
|
||||
animation-duration: 0.3s;
|
||||
animation-name: BackgroundUnblur;
|
||||
|
||||
border-radius: 0px;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
#Header .PinHeader .PIN[checked] {
|
||||
animation-duration: 0.3s;
|
||||
animation-name: BackgroundBlur;
|
||||
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
}
|
267
src/main/resources/static/styles/index.css
Normal file
@ -0,0 +1,267 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Contents {
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.ContentHeader {
|
||||
height: 330px;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.ContentHeader * {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner {
|
||||
flex: 1 1;
|
||||
flex-direction: column;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .BannerImage {
|
||||
flex: 4 1;
|
||||
max-width: 100%;
|
||||
max-height: 260px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .BannerImage img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: 10px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .Infos {
|
||||
flex: 1 1;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .Infos .Title {
|
||||
flex: 2 1;
|
||||
font-family: "Normal";
|
||||
color: rgba(21, 255, 172, 0.8);
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .Infos .Selecter {
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 8px;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .Infos .Selecter .Button {
|
||||
flex: 1 1;
|
||||
width: 22px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
background: unset;
|
||||
border: unset;
|
||||
font-family: "Normal";
|
||||
color: rgba(0, 225, 145, 0.8);
|
||||
}
|
||||
|
||||
.ContentHeader .RollingBanner .Infos .Selecter .Button[selected] {
|
||||
background-color: rgba(0, 84, 181, 0.8);
|
||||
}
|
||||
|
||||
.ContentHeader .RecommendItems {
|
||||
flex: 2 1;
|
||||
|
||||
flex-wrap: wrap;
|
||||
overflow: hidden;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border-radius: 15px;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.ContentHeader .RecommendItems .Item {
|
||||
margin: 5px;
|
||||
width: 120px;
|
||||
height: 150px;
|
||||
border-radius: 15px;
|
||||
flex-direction: column;
|
||||
background-color: rgba(0, 84, 181, 0.8);
|
||||
}
|
||||
|
||||
.ContentHeader .RecommendItems .Item .Picture {
|
||||
flex: 3 1;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 5px;
|
||||
max-width: 100%;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.ContentHeader .RecommendItems .Item .Picture img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: 10px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ContentHeader .RecommendItems .Item .Title {
|
||||
flex: 1 1;
|
||||
flex-direction: column;
|
||||
align-items: start;
|
||||
justify-content: center;
|
||||
font-family: "Normal";
|
||||
text-decoration: none;
|
||||
color: rgba(21, 255, 172, 0.8);
|
||||
font-size: 12px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.Items {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.Items .ItemSection {
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item {
|
||||
flex: 1 0;
|
||||
flex-direction: row;
|
||||
margin: 5px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border-radius: 15px;
|
||||
height: 110px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Picture {
|
||||
height: 110px;
|
||||
width: 110px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Picture img {
|
||||
padding: 5px;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions {
|
||||
flex: 1 0;
|
||||
flex-direction: column;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions span {
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .TitlePrices {
|
||||
justify-content: space-between;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .TitlePrices .Title {
|
||||
color: rgb(220, 220, 255);
|
||||
font-size: 20px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .TitlePrices .Prices {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .TitlePrices .Prices .Price {
|
||||
color: red;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.Items
|
||||
.ItemSection
|
||||
.Item
|
||||
.Descriptions
|
||||
.TitlePrices
|
||||
.Prices
|
||||
.Price[has_vip_price] {
|
||||
color: gray;
|
||||
font-weight: lighter;
|
||||
font-style: italic;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .TitlePrices .Prices .VipPrice {
|
||||
color: gold;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Descriptions .Description {
|
||||
color: rgb(175, 175, 255);
|
||||
font-size: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Buttons {
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Buttons .Button {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-repeat: no-repeat;
|
||||
background-color: rgba(40, 150, 40, 0.2);
|
||||
border: 1px solid rgba(100, 255, 100, 0.8);
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Buttons .AddToCart {
|
||||
background-image: url("../images/add_to_cart.svg");
|
||||
}
|
||||
|
||||
.Items .ItemSection .Item .Buttons .PlaceAnOrder {
|
||||
background-image: url("../images/place_an_order.svg");
|
||||
}
|
||||
|
||||
.ContentFooter {
|
||||
height: 48px;
|
||||
margin: 5px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ContentFooter .Info {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (min-width: 1280px) {
|
||||
#Contents {
|
||||
width: 1280px;
|
||||
}
|
||||
}
|
141
src/main/resources/static/styles/item.css
Normal file
@ -0,0 +1,141 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Contents {
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.Item {
|
||||
flex-direction: row;
|
||||
width: auto;
|
||||
border-radius: 15px;
|
||||
margin: 5px;
|
||||
padding: 15px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
}
|
||||
|
||||
.Item .Picture {
|
||||
flex: 1 0;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.Item .Picture img {
|
||||
width: 400px;
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
.Item .Infos {
|
||||
flex: 1 0;
|
||||
margin: 10px;
|
||||
flex-direction: column;
|
||||
color: wheat;
|
||||
}
|
||||
|
||||
.Item .Infos > * {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
|
||||
.Item .Infos > .Title {
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
.Item .Infos .Description {
|
||||
font-size: 20px;
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
.Item .Infos .Prices {
|
||||
align-items: baseline;
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
.Item .Infos .Prices .VipPrice {
|
||||
color: gold;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.Item .Infos .Prices .Price {
|
||||
color: red;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.Item .Infos .Prices .Price[has_vip_price] {
|
||||
color: gray;
|
||||
font-size: 16px;
|
||||
font-weight: lighter;
|
||||
font-style: italic;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.Item .Infos .Options {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.Item .Infos .Options > .Option {
|
||||
flex-direction: row;
|
||||
margin: 5px 0px;
|
||||
border: 1px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.Item .Infos .Options > .Option .Title {
|
||||
font-weight: bold;
|
||||
padding: 0px 10px;
|
||||
border-radius: 5px 0px 0px 5px;
|
||||
background: green;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.Item .Infos .Options > .Option .Contants {
|
||||
flex-wrap: wrap;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.Item .Infos .Options > .Option .Contants .Option {
|
||||
font-size: 18px;
|
||||
padding: 0px 5px;
|
||||
align-items: center;
|
||||
background-color: #355ae8;
|
||||
}
|
||||
|
||||
.Item .Infos .Options > .Option .Contants .Option[selected] {
|
||||
font-weight: bold;
|
||||
background-color: #489dff;
|
||||
}
|
||||
|
||||
.Item .Infos .Buttons {
|
||||
justify-content: space-evenly;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.Item .Infos .Buttons .Button {
|
||||
width: 90px;
|
||||
padding: 10px 30px;
|
||||
border-radius: 15px;
|
||||
background-color: darkgreen;
|
||||
}
|
||||
|
||||
@media (min-width: 1280px) {
|
||||
#Contents {
|
||||
width: 1280px;
|
||||
}
|
||||
}
|
65
src/main/resources/static/styles/loading.css
Normal file
@ -0,0 +1,65 @@
|
||||
@keyframes loading-zoom-in {
|
||||
0% {
|
||||
transform: scale(0);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes loading-move {
|
||||
0% {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
100% {
|
||||
transform: translate(24px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes loading-zoom-out {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
100% {
|
||||
transform: scale(0);
|
||||
}
|
||||
}
|
||||
|
||||
.Loading {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 62px;
|
||||
height: 15px;
|
||||
}
|
||||
|
||||
.Loading div {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
border-radius: 50%;
|
||||
background: #3bfeff;
|
||||
border: 1px solid black;
|
||||
animation-duration: 0.6s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
.Loading div:nth-child(1) {
|
||||
left: 0px;
|
||||
animation-name: loading-zoom-in;
|
||||
}
|
||||
|
||||
.Loading div:nth-child(2) {
|
||||
left: 0px;
|
||||
animation-name: loading-move;
|
||||
}
|
||||
|
||||
.Loading div:nth-child(3) {
|
||||
left: 24px;
|
||||
animation-name: loading-move;
|
||||
}
|
||||
|
||||
.Loading div:nth-child(4) {
|
||||
left: 48px;
|
||||
animation-name: loading-zoom-out;
|
||||
}
|
9
src/main/resources/static/styles/remove.css
Normal file
@ -0,0 +1,9 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
h3, p {
|
||||
font: "Normal";
|
||||
color: wheat;
|
||||
}
|
9
src/main/resources/static/styles/success.css
Normal file
@ -0,0 +1,9 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
h2 {
|
||||
font: "Normal";
|
||||
color: wheat;
|
||||
}
|
13
src/main/resources/static/styles/top.css
Normal file
@ -0,0 +1,13 @@
|
||||
.TOP {
|
||||
position: fixed;
|
||||
right: 30px;
|
||||
bottom: 30px;
|
||||
height: 50px;
|
||||
width: 50px;
|
||||
border: 2px solid black;
|
||||
border-radius: 30px;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
background-image: url("../images/top.svg");
|
||||
}
|
27
src/main/resources/static/styles/update.css
Normal file
@ -0,0 +1,27 @@
|
||||
h3, label {
|
||||
color: wheat;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
form > div {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.i {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.i > input, select {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.formButton {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
41
src/main/resources/static/styles/user.css
Normal file
@ -0,0 +1,41 @@
|
||||
@font-face {
|
||||
font-family: "Normal";
|
||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
margin: auto;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#Contents {
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.TabForm {
|
||||
margin: 5px;
|
||||
padding: 26px 48px;
|
||||
background-color: rgba(0, 60, 130, 0.8);
|
||||
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.TabTitle, .TabFormItem > .ItemName {
|
||||
color: wheat;
|
||||
font-family: "Normal";
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
#Contents {
|
||||
width: 640px;
|
||||
}
|
||||
}
|
147
src/main/resources/templates/account.jsp
Normal file
@ -0,0 +1,147 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>账户 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/form.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/user.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" this><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<form class="TabForm" action="account.action" method="post">
|
||||
<div class="TabTitle">账户</div>
|
||||
|
||||
<input type="hidden" name="id" value="<s:property value="%{#AuthInfo.UserInfo.Id}" />" />
|
||||
|
||||
<div class="TabFormItems">
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="password_old">旧密码</label>
|
||||
<input class="ItemInput" id="password_old" type="password" name="password_old" placeholder="请输入旧密码以更新下列数据" required />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="username">用户名</label>
|
||||
<input class="ItemInput" id="username" type="text" name="username" placeholder="请输入新用户名" value="<s:property value="%{#AuthInfo.UserInfo.UserName}" />" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="password">新密码</label>
|
||||
<input class="ItemInput" id="password" type="password" name="password" placeholder="请输入新密码" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="passwrod">确认新密码</label>
|
||||
<input class="ItemInput" id="password_confirm" type="password" name="password_confirm" placeholder="请输入确认新密码" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="age">年龄</label>
|
||||
<input class="ItemInput" id="age" type="number" name="age" placeholder="请输入新年龄" value="<s:property value="%{#AuthInfo.UserInfo.Age}" />" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="email">邮箱</label>
|
||||
<input class="ItemInput" id="email" type="email" name="email" placeholder="请输入新邮箱" value="<s:property value="%{#AuthInfo.UserInfo.Email}" />" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<input class="ItemInput" id="gender_null" type="radio" name="gender" value="N" <s:if test="%{#AuthInfo.UserInfo.Gender == \"N\"}">checked</s:if> />
|
||||
<label class="ItemName" for="gender_null">未知</label>
|
||||
<input class="ItemInput"id="gender_male" type="radio" name="gender" value="M" <s:if test="%{#AuthInfo.UserInfo.Gender == \"M\"}">checked</s:if> />
|
||||
<label class="ItemName" for="gender_male">男性</label>
|
||||
<input class="ItemInput"id="gender_female" type="radio" name="gender" value="F" <s:if test="%{#AuthInfo.UserInfo.Gender == \"F\"}">checked</s:if> />
|
||||
<label class="ItemName" for="gender_female">女性</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="TabButtons">
|
||||
<button class="TabButton" type="submit">更新账户数据</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
96
src/main/resources/templates/activity.jsp
Normal file
@ -0,0 +1,96 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>活动 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<!-- 此处借用 item 页面的部分属性 -->
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/item.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" this>
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">此处由于时间不足,不完善,请见谅</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
163
src/main/resources/templates/edit.jsp
Normal file
@ -0,0 +1,163 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<s:action name="edit" var="EditInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<s:if test="%{!#AuthInfo.UserInfo.IsAdmin}">
|
||||
<meta http-equiv="refresh" content="0;url=index.jsp">
|
||||
</s:if>
|
||||
<title>编辑 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/edit.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/edit.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" this><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<div class="Editor">
|
||||
<div class="Title">
|
||||
<form class="Search" action="edit.jsp" method="post">
|
||||
<s:select name="type" list="#{'ALL': '搜索全部', 'ID': '以ID搜索', 'USERNAME': '以用户名搜索', 'CREATE_DATE': '以帐户注册时间搜索', 'LAST_LOGIN_DATE': '以最后登录时间搜索', 'AGE': '以年龄搜索', 'GENDER': '以性别搜索', 'EMAIL': '以邮箱搜索', 'IS_ADMIN': '以管理员状态搜索'}" value="%{#EditInfo.SearchType}" />
|
||||
<s:textfield name="search" placeholder="请在此处输入你想要搜索的内容..." value="%{#EditInfo.Search}" />
|
||||
<button type="submit">搜索</button>
|
||||
</form>
|
||||
|
||||
<button onclick="javascript:location.reload();">刷新</button>
|
||||
</div>
|
||||
|
||||
<table class="Result">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>ID</td>
|
||||
<td>用户名</td>
|
||||
<td>帐户创建时间</td>
|
||||
<td>最后登录时间</td>
|
||||
<td>年龄</td>
|
||||
<td>性别</td>
|
||||
<td>邮箱</td>
|
||||
<td>管理员</td>
|
||||
<td>操作</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<s:iterator value="%{#EditInfo.Users}" var="UserInfo">
|
||||
<tr id="<s:property value='#UserInfo.Id' />">
|
||||
<td><s:property value="#UserInfo.Id" /></td>
|
||||
<td><s:property value="#UserInfo.UserName" /></td>
|
||||
<td><s:property value="#UserInfo.CreateDate" /></td>
|
||||
<td><s:property value="#UserInfo.LastLoginDate" /></td>
|
||||
<td><s:property value="#UserInfo.AgePretty" /></td>
|
||||
<td><s:property value="#UserInfo.GenderPretty" /></td>
|
||||
<td><s:property value="#UserInfo.EmailPretty" /></td>
|
||||
<td><s:property value="#UserInfo.IsAdminPretty" /></td>
|
||||
<td>
|
||||
<button class="update">编辑</button>
|
||||
<button class="remove">删除</button>
|
||||
</td>
|
||||
</tr>
|
||||
</s:iterator>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="Pages">
|
||||
<a href="edit.jsp?page=0">首页</a>
|
||||
<s:iterator begin="%{#EditInfo.StartPage}" end="%{#EditInfo.StopPage}" var="PageNumber">
|
||||
<s:if test="%{#PageNumber == #EditInfo.NowPageStr}">
|
||||
<span>第 <s:property value="%{#PageNumber + 1}" /> 页</span>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<a href="edit.jsp?page=<s:property value="%{#PageNumber}" />">第 <s:property value="%{#PageNumber + 1}"/> 页</a>
|
||||
</s:else>
|
||||
</s:iterator>
|
||||
<a href="edit.jsp?page=<s:property value="%{#EditInfo.EndPage}" />">尾页</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="UserEditor">
|
||||
<iframe id="Displayer" class="Displayer" name="displayer"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
109
src/main/resources/templates/error.jsp
Normal file
@ -0,0 +1,109 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<s:if test="%{#ErrorRedirectTo != \"none\"}">
|
||||
<meta http-equiv="refresh" content="3;url=<s:property value="ErrorRedirectTo" />">
|
||||
</s:if>
|
||||
<title>出错啦! - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/error.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" this>
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<div class="ErrorInfo">
|
||||
<div class="ErrorTitle"><s:property value="ErrorFrom" />失败</div>
|
||||
|
||||
<div class="ErrorMessage">原因: <s:property value="ErrorMessage" /></div>
|
||||
|
||||
<s:if test="%{#ErrorRedirectTo != \"none\"}">
|
||||
<div class="ErrorRedirectMessage">将在三秒后跳转至页面: <s:property value="ErrorRedirectTo" /></div>
|
||||
<button class="ErrorRedirectButton" onclick="javascript:window.location.replace('<s:property value="ErrorRedirectTo" />')">点此立即跳转</button>
|
||||
</s:if>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,2 +1,33 @@
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">果蔬销售商城</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
@ -1,5 +1,58 @@
|
||||
<html>
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<title>{{title}}</title>
|
||||
<meta charset="UTF-8">
|
||||
<title>主页 - 67购物网站</title>
|
||||
<script type="text/javascript" src="scripts/header.js"></script>
|
||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="scripts/top.js"></script>
|
||||
<script type="module" src="scripts/resources.js"></script>
|
||||
<script type="module" src="scripts/items.js"></script>
|
||||
<script type="module" src="scripts/index.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="styles/loading.css">
|
||||
<link type="text/css" rel="stylesheet" href="styles/index.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="scripts/lib/anime.min.js"></script>
|
||||
<script async src="scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" this>
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text"/>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
{{#isLogined}}
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
{{#isAdmin}}
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
{{/isAdmin}}
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
{{/isLogined}}
|
||||
{{^isLogined}}
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
{{/isLogined}}
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="images/pin.svg" checked/>
|
||||
</div>
|
||||
</div>
|
||||
|
128
src/main/resources/templates/index.jsp
Normal file
@ -0,0 +1,128 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>主页 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="module" src="../static/scripts/resources.js"></script>
|
||||
<script type="module" src="../static/scripts/items.js"></script>
|
||||
<script type="module" src="../static/jss/index.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/loading.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/index.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" this>
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<!-- 内容头 -->
|
||||
<div class="ContentHeader">
|
||||
<!-- 滚动横幅 -->
|
||||
<div class="RollingBanner">
|
||||
<div class="BannerImage">
|
||||
<img />
|
||||
</div>
|
||||
<div class="Infos">
|
||||
<span class="Title"></span>
|
||||
<div class="Selecter"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 推荐商品集 -->
|
||||
<div class="RecommendItems"></div>
|
||||
</div>
|
||||
|
||||
<!-- 内容本身 -->
|
||||
<div class="Items"></div>
|
||||
|
||||
<!-- 内容为尾 -->
|
||||
<div class="ContentFooter">
|
||||
<div class="Loading">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<span class="Info">恭喜你找到了一个彩蛋!</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,5 +1,36 @@
|
||||
{{> header}}
|
||||
|
||||
<h1>{{title}}</h1>
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<!-- 内容头 -->
|
||||
<div class="ContentHeader">
|
||||
<!-- 滚动横幅 -->
|
||||
<div class="RollingBanner">
|
||||
<div class="BannerImage">
|
||||
<img />
|
||||
</div>
|
||||
<div class="Infos">
|
||||
<span class="Title"></span>
|
||||
<div class="Selecter"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 推荐商品集 -->
|
||||
<div class="RecommendItems"></div>
|
||||
</div>
|
||||
|
||||
<!-- 内容本身 -->
|
||||
<div class="Items"></div>
|
||||
|
||||
<!-- 内容为尾 -->
|
||||
<div class="ContentFooter">
|
||||
<div class="Loading">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<span class="Info">恭喜你找到了一个彩蛋!</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> footer}}
|
129
src/main/resources/templates/item.jsp
Normal file
@ -0,0 +1,129 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>商品 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<script type="module" src="../static/scripts/resources.js"></script>
|
||||
<script type="module" src="../static/scripts/items.js"></script>
|
||||
<script type="module" src="../static/scripts/item.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/item.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<div class="Item">
|
||||
<div class="Picture">
|
||||
<img />
|
||||
</div>
|
||||
<div class="Infos">
|
||||
<span class="Title"></span>
|
||||
<div class="Prices">
|
||||
<div class="VipPrice"></div>
|
||||
<div class="Price"></div>
|
||||
</div>
|
||||
<span class="Description"></span>
|
||||
<div class="Options">
|
||||
<div class="Option">
|
||||
<div class="Title">数量</div>
|
||||
<div class="Contants">
|
||||
<div class="Option" selected> 1 </div>
|
||||
<div class="Option"> 2 </div>
|
||||
<div class="Option"> 3 </div>
|
||||
<div class="Option"> 4 </div>
|
||||
<div class="Option"> 5 </div>
|
||||
<div class="Option"> 6 </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Buttons">
|
||||
<span class="Button">立即购买</span>
|
||||
<span class="Button">加入购物车</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
116
src/main/resources/templates/login.jsp
Normal file
@ -0,0 +1,116 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>登录 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/form.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/user.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" this><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" href="register.jsp"><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<form class="TabForm" action="login.action" method="post">
|
||||
<div class="TabTitle">登录</div>
|
||||
|
||||
<div class="TabFormItems">
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="username">用户名</label>
|
||||
<input class="ItemInput" id="username" type="text" name="username" placeholder="请输入用户名" required />
|
||||
</div>
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="password">密码</label>
|
||||
<input class="ItemInput" id="password" type="password" name="password" placeholder="请输入密码" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="TabButtons">
|
||||
<button class="TabButton" type="reset">重置</button>
|
||||
<button class="TabButton" type="submit">登录</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
141
src/main/resources/templates/register.jsp
Normal file
@ -0,0 +1,141 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<s:action name="auth" var="AuthInfo" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>注册 - 67购物网站</title>
|
||||
<script type="text/javascript" src="../static/scripts/header.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/clock.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/top.js"></script>
|
||||
<script type="text/javascript" src="../static/scripts/footer.js"></script>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/header.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/clock.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/top.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/footer.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/form.css">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/user.css">
|
||||
<!-- 外部小组件 -->
|
||||
<script src="../static/scripts/lib/anime.min.js"></script>
|
||||
<script async src="../static/scripts/lib/explosion.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 头部内容 -->
|
||||
<div id="Header">
|
||||
<div class="List Special Title">67购物网站</div>
|
||||
<div class="List Link" href="index.jsp">
|
||||
<span class="Text">首页</span>
|
||||
</div>
|
||||
<div class="List Link" href="activity.jsp">
|
||||
<span class="Text">活动</span>
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Special SearchBar">
|
||||
<input class="InputBar" type="text" />
|
||||
</div>
|
||||
<div class="List Blank"></div>
|
||||
<div class="List Button"><span class="Text">历史记录</span></div>
|
||||
<div class="List Button"><span class="Text">购物车</span></div>
|
||||
<s:if test="%{#AuthInfo.IsLogined}">
|
||||
<div class="List Button Link" href="logout.action"><span class="Text">注销</span></div>
|
||||
<s:if test="%{#AuthInfo.UserInfo.IsAdmin}">
|
||||
<div class="List Button Link" href="edit.jsp"><span class="Text">编辑</span></div>
|
||||
</s:if>
|
||||
<div class="List Button Link" href="account.jsp"><span class="Text">账户</span></div>
|
||||
</s:if>
|
||||
<s:else>
|
||||
<div class="List Button Link" href="login.jsp"><span class="Text">登录</span></div>
|
||||
<div class="List Button Link" this><span class="Text">注册</span></div>
|
||||
</s:else>
|
||||
<div class="List Special Clock">
|
||||
<span class="CLOCK"></span>
|
||||
</div>
|
||||
<div class="List Special PinHeader">
|
||||
<img class="PIN" src="../static/images/pin.svg" checked />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<div id="Contents">
|
||||
<form class="TabForm" action="register.action" method="post">
|
||||
<div class="TabTitle">注册</div>
|
||||
|
||||
<div class="TabFormItems">
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="username">用户名</label>
|
||||
<input class="ItemInput" id="username" type="text" name="username" placeholder="请输入用户名" required />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="password">密码</label>
|
||||
<input class="ItemInput" id="password" type="password" name="password" placeholder="请输入密码" required />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="passwrod">确认密码</label>
|
||||
<input class="ItemInput" id="password_confirm" type="password" name="password_confirm" placeholder="请输入确认密码" required />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="age">年龄</label>
|
||||
<input class="ItemInput" id="age" type="number" name="age" placeholder="请输入年龄" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<label class="ItemName" for="email">邮箱</label>
|
||||
<input class="ItemInput" id="email" type="email" name="email" placeholder="请输入邮箱" />
|
||||
</div>
|
||||
|
||||
<div class="TabFormItem">
|
||||
<input class="ItemInput" id="gender_null" type="radio" name="gender" value="N" checked />
|
||||
<label class="ItemName" for="gender_null">未知</label>
|
||||
<input class="ItemInput"id="gender_male" type="radio" name="gender" value="M" />
|
||||
<label class="ItemName" for="gender_male">男性</label>
|
||||
<input class="ItemInput"id="gender_female" type="radio" name="gender" value="F" />
|
||||
<label class="ItemName" for="gender_female">女性</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="TabButtons">
|
||||
<button class="TabButton" type="reset">重置</button>
|
||||
<button class="TabButton" type="submit">注册并登录</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 页尾内容 -->
|
||||
<div id="Footer">
|
||||
<div class="Infos">
|
||||
<div class="Icon"><img src="../static/images/icon.svg" /></div>
|
||||
<div class="Title">67购物网站</div>
|
||||
<div class="Contents">
|
||||
<span>只做高质量商品销售~</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Links">
|
||||
<div class="Title"></div>
|
||||
<div class="Contents"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 浮动内容 -->
|
||||
<div id="Floater">
|
||||
<!-- 回到顶层 -->
|
||||
<div class="TOP"></div>
|
||||
<canvas
|
||||
class="fireworks"
|
||||
style="
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
"
|
||||
></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
23
src/main/resources/templates/remove.jsp
Normal file
@ -0,0 +1,23 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>移除用户 - 67购物网站</title>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/remove.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form action="remove.action" method="post">
|
||||
<input type="hidden" name="id" value="<s:property value="UserInfo.Id" />" />
|
||||
|
||||
<h3>确定移除此用户?</h3>
|
||||
<p>用户名: <s:property value="UserInfo.UserName" /></p>
|
||||
|
||||
<button type="submit">确定</button>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
15
src/main/resources/templates/success.jsp
Normal file
@ -0,0 +1,15 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>成功 - 67购物网站</title>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/success.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h2>操作已完成!</h2>
|
||||
</body>
|
||||
</html>
|
27
src/main/resources/templates/update.jsp
Normal file
@ -0,0 +1,27 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="s" uri="/struts-tags" %>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>更新用户 - 67购物网站</title>
|
||||
<link type="image/x-icon" rel="icon" href="../static/images/favicon.ico">
|
||||
<link type="text/css" rel="stylesheet" href="../static/styles/update.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h3>更新此用户的信息</h3>
|
||||
<form action="update.action" method="post">
|
||||
<div class="i"><s:hidden name="id" value="%{UserInfo.Id}" /></div>
|
||||
<div class="i"><s:textfield name="username" label="用户名" value="%{UserInfo.UserName}" /></div>
|
||||
<div class="i"><s:password name="password" label="密码" /></div>
|
||||
<div class="i"><s:password name="password_confirm" label="确认密码" /></div>
|
||||
<div class="i"><s:textfield name="age" type="number" label="年龄" value="%{UserInfo.Age}" /></div>
|
||||
<div class="i"><s:textfield name="email" type="email" label="邮箱" value="%{UserInfo.Email}" /></div>
|
||||
<div class="i"><s:select name="gender" label="性别" list="#{'N': '未知', 'M':'男性', 'F': '女性'}" value="%{UserInfo.Gender}" /></div>
|
||||
<div><s:checkbox name="admin" label="管理员" value="%{UserInfo.IsAdmin}"/></div>
|
||||
<s:submit value="确定" />
|
||||
</form>
|
||||
</body>
|
||||
</html>
|