upload frontend

Signed-off-by: Puqns67 <me@puqns67.icu>
This commit is contained in:
Puqns67 2023-09-15 09:27:38 +08:00
parent e067f7c7ae
commit 88ebc71684
Signed by: Puqns67
GPG Key ID: 9669DF042554F536
69 changed files with 3782 additions and 4 deletions

Binary file not shown.

Binary file not shown.

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View 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

View 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

View 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

View File

@ -0,0 +1,14 @@
[
{
"Name": "排浊泡沫沐浴露",
"Picture": "images/item/13.jpeg"
},
{
"Name": "辣椒酱 风味豆豉油制辣椒",
"Picture": "images/item/8.jpeg"
},
{
"Name": "小麦漱口杯",
"Picture": "images/item/5.jpeg"
}
]

View 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"
}
]

View File

@ -0,0 +1 @@
[1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14]

View 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"));
});
});
});

View 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");
}));

View 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)}`;
});
});
});

View 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");
});

View 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");
}));

View 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");
}));

View 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);
});
});
});
});
}));

View 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;
}
});
}

View 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});

View 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)}

View File

@ -0,0 +1 @@
export {};

View 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");
}));

View 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);
}

View 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;
}
}

View 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;
}
}

View 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;
}

View 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;
}

View 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);
}

View 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;
}
}

View 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;
}
}

View 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;
}

View File

@ -0,0 +1,9 @@
@font-face {
font-family: "Normal";
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
}
h3, p {
font: "Normal";
color: wheat;
}

View File

@ -0,0 +1,9 @@
@font-face {
font-family: "Normal";
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
}
h2 {
font: "Normal";
color: wheat;
}

View 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");
}

View 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;
}

View 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;
}
}

View 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>

View 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>

View 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>

View 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>

View File

@ -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>

View File

@ -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>
<!-- 头部内容 -->
<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>

View 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>

View File

@ -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}}

View 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>&nbsp;1&nbsp;</div>
<div class="Option">&nbsp;2&nbsp;</div>
<div class="Option">&nbsp;3&nbsp;</div>
<div class="Option">&nbsp;4&nbsp;</div>
<div class="Option">&nbsp;5&nbsp;</div>
<div class="Option">&nbsp;6&nbsp;</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>

View 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>

View 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>

View 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>

View 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>

View 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>