update editor page
Signed-off-by: Puqns67 <me@puqns67.icu>
This commit is contained in:
parent
2f8246cfdf
commit
a5c0f4c35c
BIN
data/picture/2d0553b0-6333-44bd-adae-90e4546a0660
Normal file
BIN
data/picture/2d0553b0-6333-44bd-adae-90e4546a0660
Normal file
Binary file not shown.
After Width: | Height: | Size: 937 B |
4
pom.xml
4
pom.xml
@ -61,10 +61,6 @@
|
|||||||
<groupId>org.jetbrains.kotlin</groupId>
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
<artifactId>kotlin-stdlib</artifactId>
|
<artifactId>kotlin-stdlib</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
|
||||||
<artifactId>jackson-databind</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.module</groupId>
|
<groupId>com.fasterxml.jackson.module</groupId>
|
||||||
<artifactId>jackson-module-kotlin</artifactId>
|
<artifactId>jackson-module-kotlin</artifactId>
|
||||||
|
@ -32,7 +32,8 @@ class Account(private val repository: AccountRepository) {
|
|||||||
attributes: RedirectAttributes,
|
attributes: RedirectAttributes,
|
||||||
@CookieValue("TOKEN", required = false) token: String?,
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
@RequestParam("name") name: String,
|
@RequestParam("name") name: String,
|
||||||
@RequestParam("password") password: String
|
@RequestParam("password") password: String,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
): String {
|
): String {
|
||||||
if (this.getCurrentUser(token) != null) return error(attributes, "登录", "当前已登录账户")
|
if (this.getCurrentUser(token) != null) return error(attributes, "登录", "当前已登录账户")
|
||||||
val user = repository.findByName(name) ?: return error(attributes, "登录", "账户不存在", "/login")
|
val user = repository.findByName(name) ?: return error(attributes, "登录", "账户不存在", "/login")
|
||||||
@ -41,6 +42,7 @@ class Account(private val repository: AccountRepository) {
|
|||||||
user.updateLoginTime()
|
user.updateLoginTime()
|
||||||
repository.save(user)
|
repository.save(user)
|
||||||
updateToken(response, user.token)
|
updateToken(response, user.token)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
return "redirect:/"
|
return "redirect:/"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,15 +53,21 @@ class Account(private val repository: AccountRepository) {
|
|||||||
@CookieValue("TOKEN", required = false) token: String?,
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
@RequestParam("name") name: String,
|
@RequestParam("name") name: String,
|
||||||
@RequestParam("password") password: String,
|
@RequestParam("password") password: String,
|
||||||
|
@RequestParam("password_confirm") passwordConfirm: String,
|
||||||
@RequestParam("age", required = false) age: Int?,
|
@RequestParam("age", required = false) age: Int?,
|
||||||
@RequestParam("gender", required = false) gender: String?,
|
@RequestParam("gender", required = false) gender: String?,
|
||||||
@RequestParam("phone", required = false) phone: String?,
|
@RequestParam("phone", required = false) phone: String?,
|
||||||
@RequestParam("email", required = false) email: String?,
|
@RequestParam("email", required = false) email: String?,
|
||||||
@RequestParam("address", required = false) address: String?
|
@RequestParam("address", required = false) address: String?,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
): String {
|
): String {
|
||||||
if (this.getCurrentUser(token) != null) return error(attributes, "注册", "当前已登录账户")
|
if (this.getCurrentUser(token) != null) return error(attributes, "注册", "当前已登录账户")
|
||||||
val user = repository.save(User(name, password, age, gender, phone, email, address))
|
if (name.isBlank()) return error(attributes, "注册", "用户名不能为空", "/register")
|
||||||
|
if (password.isBlank()) return error(attributes, "注册", "密码不能为空", "/register")
|
||||||
|
if (password != passwordConfirm) return error(attributes, "更新", "密码与确认密码不相同", "/register")
|
||||||
|
val user = repository.save(User(name, password, age, gender, phone, email, address, false))
|
||||||
updateToken(response, user.token)
|
updateToken(response, user.token)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
return "redirect:/"
|
return "redirect:/"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,6 +93,7 @@ class Account(private val repository: AccountRepository) {
|
|||||||
user.update(name, password, age, gender, phone, email, address)
|
user.update(name, password, age, gender, phone, email, address)
|
||||||
repository.save(user)
|
repository.save(user)
|
||||||
updateToken(response, user.token)
|
updateToken(response, user.token)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
return "redirect:/account"
|
return "redirect:/account"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +103,7 @@ class Account(private val repository: AccountRepository) {
|
|||||||
@RequestParam("redirect", required = false) redirect: String?
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
): String {
|
): String {
|
||||||
updateToken(response, "", age = 0)
|
updateToken(response, "", age = 0)
|
||||||
redirect?.let { return it }
|
redirect?.let { return "redirect:/${it}" }
|
||||||
return "redirect:/"
|
return "redirect:/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,120 @@
|
|||||||
package team8.fruitable.controller.action
|
package team8.fruitable.controller.action
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value
|
||||||
import org.springframework.stereotype.Controller
|
import org.springframework.stereotype.Controller
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
import org.springframework.web.bind.annotation.*
|
||||||
|
import org.springframework.web.multipart.MultipartFile
|
||||||
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes
|
||||||
|
import team8.fruitable.controller.util.Util.Companion.error
|
||||||
|
import team8.fruitable.datebase.entity.Item
|
||||||
|
import team8.fruitable.datebase.entity.Tag
|
||||||
|
import team8.fruitable.datebase.entity.User
|
||||||
|
import team8.fruitable.datebase.repository.AccountRepository
|
||||||
|
import team8.fruitable.datebase.repository.ItemRepository
|
||||||
|
import team8.fruitable.datebase.repository.TagRepository
|
||||||
|
import java.io.File
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/action/edit/item")
|
@RequestMapping("/action/edit/item")
|
||||||
class ItemEditor {
|
class ItemEditor(
|
||||||
|
private val accountRepository: AccountRepository,
|
||||||
|
private val itemRepository: ItemRepository,
|
||||||
|
private val tagRepository: TagRepository
|
||||||
|
) {
|
||||||
|
@Value("\${data.picture}")
|
||||||
|
lateinit var pictureUploadPath: String
|
||||||
|
|
||||||
|
private fun getCurrentUser(token: String?): User? {
|
||||||
|
return token?.let(accountRepository::findByToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasAdminPermissions(user: User?): Boolean {
|
||||||
|
return user?.isAdmin ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasAdminPermissions(token: String?): Boolean {
|
||||||
|
return this.hasAdminPermissions(this.getCurrentUser(token))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun autoCreateTag(tags: List<String>): MutableList<Tag> {
|
||||||
|
val result: MutableList<Tag> = mutableListOf()
|
||||||
|
for (i in tags) {
|
||||||
|
val oldTag = tagRepository.findByName(i);
|
||||||
|
if (oldTag != null) {
|
||||||
|
result.add(oldTag)
|
||||||
|
} else {
|
||||||
|
val newTag = Tag(i)
|
||||||
|
tagRepository.save(newTag)
|
||||||
|
result.add(newTag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun autoCreateTag(tags: String): MutableList<Tag> {
|
||||||
|
return this.autoCreateTag(tags.split(" "))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun uploadPicture(file: MultipartFile): String {
|
||||||
|
val uuid = UUID.randomUUID().toString()
|
||||||
|
file.transferTo(File("${pictureUploadPath}${File.separator}${uuid}"))
|
||||||
|
return uuid
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
fun create(
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@RequestParam("name") name: String,
|
||||||
|
@RequestParam("price") price: Double,
|
||||||
|
@RequestParam("description", required = false) description: String?,
|
||||||
|
@RequestParam("picture") picture: MultipartFile,
|
||||||
|
@RequestParam("tag", required = false) tag: String?,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
if (!this.hasAdminPermissions(token)) return error(attributes, "创建商品", "账户无权限")
|
||||||
|
if (name.isBlank()) return error(attributes, "更新商品", "商品名不能为空")
|
||||||
|
if (price == 0.0) return error(attributes, "更新商品", "商品价格不能为0")
|
||||||
|
itemRepository.save(Item(name, price, description, uploadPicture(picture), tag?.let { this.autoCreateTag(it) }))
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=item"
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/update/{id}")
|
||||||
|
fun update(
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@PathVariable("id") id: Long,
|
||||||
|
@RequestParam("name") name: String,
|
||||||
|
@RequestParam("price") price: Double,
|
||||||
|
@RequestParam("description", required = false) description: String?,
|
||||||
|
@RequestParam("picture", required = false) picture: MultipartFile?,
|
||||||
|
@RequestParam("tag", required = false) tag: String?,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
if (!this.hasAdminPermissions(token)) return error(attributes, "更新商品", "账户无权限")
|
||||||
|
if (name.isBlank()) return error(attributes, "更新商品", "商品名不能为空")
|
||||||
|
if (price == 0.0) return error(attributes, "更新商品", "商品价格不能为0")
|
||||||
|
val item = itemRepository.findById(id).orElse(null) ?: return error(attributes, "更新商品", "未找到目标商品")
|
||||||
|
item.update(name, price, description, picture?.let { uploadPicture(it) }, tag?.let { this.autoCreateTag(it) })
|
||||||
|
itemRepository.save(item)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=item"
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/{id}")
|
||||||
|
fun delete(
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@PathVariable("id") id: Long,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
if (!this.hasAdminPermissions(token)) return error(attributes, "删除商品", "账户无权限")
|
||||||
|
val item = itemRepository.findById(id).orElse(null) ?: return error(attributes, "删除商品", "未找到目标商品")
|
||||||
|
item.update(isRemoved = true)
|
||||||
|
itemRepository.save(item)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=item"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,94 @@
|
|||||||
package team8.fruitable.controller.action
|
package team8.fruitable.controller.action
|
||||||
|
|
||||||
|
import jakarta.servlet.http.Cookie
|
||||||
|
import jakarta.servlet.http.HttpServletResponse
|
||||||
import org.springframework.stereotype.Controller
|
import org.springframework.stereotype.Controller
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
import org.springframework.web.bind.annotation.*
|
||||||
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes
|
||||||
|
import team8.fruitable.controller.util.Util.Companion.error
|
||||||
|
import team8.fruitable.datebase.entity.User
|
||||||
|
import team8.fruitable.datebase.repository.AccountRepository
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/action/edit/user")
|
@RequestMapping("/action/edit/user")
|
||||||
class UserEditor {
|
class UserEditor(private val accountRepository: AccountRepository) {
|
||||||
|
private fun getCurrentUser(token: String?): User? {
|
||||||
|
return token?.let(accountRepository::findByToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasAdminPermissions(user: User?): Boolean {
|
||||||
|
return user?.isAdmin ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasAdminPermissions(token: String?): Boolean {
|
||||||
|
return this.hasAdminPermissions(this.getCurrentUser(token))
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
fun create(
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@RequestParam("name") name: String,
|
||||||
|
@RequestParam("password") password: String,
|
||||||
|
@RequestParam("age", required = false) age: Int?,
|
||||||
|
@RequestParam("gender", required = false) gender: String?,
|
||||||
|
@RequestParam("phone", required = false) phone: String?,
|
||||||
|
@RequestParam("email", required = false) email: String?,
|
||||||
|
@RequestParam("address", required = false) address: String?,
|
||||||
|
@RequestParam("is_admin", required = false) isAdmin: Boolean?,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
if (!this.hasAdminPermissions(token)) return error(attributes, "创建用户", "账户无权限")
|
||||||
|
if (name.isBlank()) return error(attributes, "创建用户", "用户名不能为空", "/editor?use=user")
|
||||||
|
if (password.isBlank()) return error(attributes, "创建用户", "密码不能为空", "/editor?use=user")
|
||||||
|
accountRepository.save(User(name, password, age, gender, phone, email, address, isAdmin))
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=user"
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/update/{id}")
|
||||||
|
fun update(
|
||||||
|
response: HttpServletResponse,
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@PathVariable("id") id: Long,
|
||||||
|
@RequestParam("name") name: String,
|
||||||
|
@RequestParam("password") password: String,
|
||||||
|
@RequestParam("age", required = false) age: Int?,
|
||||||
|
@RequestParam("gender", required = false) gender: String?,
|
||||||
|
@RequestParam("phone", required = false) phone: String?,
|
||||||
|
@RequestParam("email", required = false) email: String?,
|
||||||
|
@RequestParam("address", required = false) address: String?,
|
||||||
|
@RequestParam("is_admin", required = false) isAdmin: Boolean?,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
val currentUser = this.getCurrentUser(token) ?: return error(attributes, "更新用户", "账户未登录")
|
||||||
|
if (!this.hasAdminPermissions(currentUser)) return error(attributes, "更新用户", "账户无权限")
|
||||||
|
val user = accountRepository.findById(id).orElse(null) ?: return error(attributes, "更新用户", "未找到此用户", "/editor?use=user")
|
||||||
|
user.update(name, password, age, gender, phone, email, address, isAdmin)
|
||||||
|
if (currentUser.id == id) {
|
||||||
|
val cookie = Cookie("TOKEN", user.token)
|
||||||
|
cookie.path = "/"
|
||||||
|
cookie.maxAge = 2678400
|
||||||
|
response.addCookie(cookie)
|
||||||
|
}
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=user"
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/{id}")
|
||||||
|
fun delete(
|
||||||
|
attributes: RedirectAttributes,
|
||||||
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
|
@PathVariable("id") id: Long,
|
||||||
|
@RequestParam("redirect", required = false) redirect: String?
|
||||||
|
): String {
|
||||||
|
val currentUser = this.getCurrentUser(token) ?: return error(attributes, "删除用户", "账户未登录")
|
||||||
|
if (!this.hasAdminPermissions(currentUser)) return error(attributes, "删除用户", "账户无权限")
|
||||||
|
if (currentUser.id == id) return error(attributes, "删除用户", "无法删除当前使用的账户", "/editor?use=user")
|
||||||
|
val user = accountRepository.findById(id).orElse(null) ?: return error(attributes, "删除用户", "未找到此用户", "/editor?use=user")
|
||||||
|
accountRepository.delete(user)
|
||||||
|
redirect?.let { return "redirect:/${it}" }
|
||||||
|
return "redirect:/editor?use=user"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,13 +11,17 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes
|
|||||||
import team8.fruitable.controller.util.Util
|
import team8.fruitable.controller.util.Util
|
||||||
import team8.fruitable.datebase.entity.User
|
import team8.fruitable.datebase.entity.User
|
||||||
import team8.fruitable.datebase.repository.AccountRepository
|
import team8.fruitable.datebase.repository.AccountRepository
|
||||||
|
import team8.fruitable.datebase.repository.ItemRepository
|
||||||
import team8.fruitable.datebase.repository.PagebleAccountRepository
|
import team8.fruitable.datebase.repository.PagebleAccountRepository
|
||||||
|
import team8.fruitable.datebase.repository.PagebleItemRepository
|
||||||
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
class Editor(
|
class Editor(
|
||||||
private val accountRepository: AccountRepository,
|
private val accountRepository: AccountRepository,
|
||||||
private val pagebleAccountRepository: PagebleAccountRepository
|
private val itemRepository: ItemRepository,
|
||||||
|
private val pagebleAccountRepository: PagebleAccountRepository,
|
||||||
|
private val pagebleItemRepository: PagebleItemRepository
|
||||||
) {
|
) {
|
||||||
private fun getCurrentUser(token: String?): User? {
|
private fun getCurrentUser(token: String?): User? {
|
||||||
return token?.let(accountRepository::findByToken)
|
return token?.let(accountRepository::findByToken)
|
||||||
@ -40,8 +44,8 @@ class Editor(
|
|||||||
"ALL" to "全部",
|
"ALL" to "全部",
|
||||||
"ID" to "ID",
|
"ID" to "ID",
|
||||||
"NAME" to "名称",
|
"NAME" to "名称",
|
||||||
"CREATE_DATE" to "注册时间",
|
"TIME_CREATE" to "注册时间",
|
||||||
"LAST_LOGIN_DATE" to "最后登录时间",
|
"TIME_LOGIN" to "最后登录时间",
|
||||||
"AGE" to "年龄",
|
"AGE" to "年龄",
|
||||||
"GENDER" to "性别",
|
"GENDER" to "性别",
|
||||||
"PHONE" to "手机号码",
|
"PHONE" to "手机号码",
|
||||||
@ -64,14 +68,31 @@ class Editor(
|
|||||||
attributes: RedirectAttributes,
|
attributes: RedirectAttributes,
|
||||||
@CookieValue("TOKEN", required = false) token: String?,
|
@CookieValue("TOKEN", required = false) token: String?,
|
||||||
@RequestParam("use", defaultValue = "user") use: String,
|
@RequestParam("use", defaultValue = "user") use: String,
|
||||||
|
@RequestParam("action", defaultValue = "nothing") action: String,
|
||||||
|
@RequestParam("target", required = false) target: Long?,
|
||||||
@RequestParam("search_type", required = false) searchType: String?,
|
@RequestParam("search_type", required = false) searchType: String?,
|
||||||
@RequestParam("search_content", required = false) searchContent: String?,
|
@RequestParam("search_content", required = false) searchContent: String?,
|
||||||
@RequestParam("page", required = false) page: Int?,
|
@RequestParam("page", required = false) page: Int?,
|
||||||
): String {
|
): String {
|
||||||
val user = this.getCurrentUser(token) ?: return Util.error(attributes, "更新", "账户未登录", "/login")
|
val user = this.getCurrentUser(token) ?: return Util.error(attributes, "更新", "账户未登录", "/login")
|
||||||
if (!this.hasAdminPermissions(user)) return Util.error(attributes, "编辑", "账户无权限编辑网站")
|
if (!this.hasAdminPermissions(user)) return Util.error(attributes, "编辑", "账户无权限编辑网站")
|
||||||
|
model["using"] = use
|
||||||
model["tabs"] = editorTabs
|
model["tabs"] = editorTabs
|
||||||
if (searchContent != null) model["searching"] = searchContent
|
if (searchContent != null) model["searching"] = searchContent
|
||||||
|
val pageRequested = PageRequest.of(page ?: 0, 15)
|
||||||
|
val data = when (use) {
|
||||||
|
"item" -> pagebleItemRepository.findAll(pageRequested)
|
||||||
|
else -> pagebleAccountRepository.findAll(pageRequested)
|
||||||
|
}
|
||||||
|
model["data"] = data
|
||||||
|
model["pages"] = (page ?: 0).let {
|
||||||
|
var result: Array<Pair<Boolean, Int>> = emptyArray()
|
||||||
|
for (i in (it - 5)..(it + 5)) {
|
||||||
|
if (i < 0 || i >= data.totalPages) continue
|
||||||
|
result += (i == it) to i
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
when (use) {
|
when (use) {
|
||||||
"item" -> {
|
"item" -> {
|
||||||
model["useItemEditor"] = true
|
model["useItemEditor"] = true
|
||||||
@ -81,9 +102,37 @@ class Editor(
|
|||||||
else -> {
|
else -> {
|
||||||
model["useUserEditor"] = true
|
model["useUserEditor"] = true
|
||||||
model["selects"] = editorSearchTypesForUser
|
model["selects"] = editorSearchTypesForUser
|
||||||
model["data"] = pagebleAccountRepository.findAll(PageRequest.of(page ?: 0, 10))
|
}
|
||||||
|
}
|
||||||
|
when (action) {
|
||||||
|
"creating" -> model["isCreating"] = true
|
||||||
|
"updating" -> model["isUpdating"] = true
|
||||||
|
"deleting" -> model["isDeleting"] = true
|
||||||
|
else -> model["isNothing"] = true
|
||||||
|
}
|
||||||
|
if (action == "updating" || action == "deleting") {
|
||||||
|
model["target"] = when (use) {
|
||||||
|
"item" -> {
|
||||||
|
target?.let {
|
||||||
|
itemRepository.findById(it)
|
||||||
|
.orElse(null) ?: return Util.error(attributes, "编辑", "无法找到目标商品")
|
||||||
|
} ?: return Util.error(attributes, "编辑", "目标商品为空")
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
val targetUser = target?.let {
|
||||||
|
accountRepository.findById(it)
|
||||||
|
.orElse(null) ?: return Util.error(attributes, "编辑", "无法找到目标用户")
|
||||||
|
} ?: return Util.error(attributes, "编辑", "目标用户为空")
|
||||||
|
if (action == "updating") when (targetUser.gender) {
|
||||||
|
"M" -> model["isGenderAsMale"] = true
|
||||||
|
"F" -> model["isGenderAsFemale"] = true
|
||||||
|
else -> model["isGenderAsUnknown"] = true
|
||||||
|
}
|
||||||
|
targetUser
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "editor"
|
return "editor"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import org.springframework.ui.Model
|
|||||||
import org.springframework.ui.set
|
import org.springframework.ui.set
|
||||||
import org.springframework.web.bind.annotation.CookieValue
|
import org.springframework.web.bind.annotation.CookieValue
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
import org.springframework.web.bind.annotation.RequestParam
|
|
||||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes
|
||||||
import team8.fruitable.controller.util.Util.Companion.error
|
import team8.fruitable.controller.util.Util.Companion.error
|
||||||
import team8.fruitable.datebase.entity.User
|
import team8.fruitable.datebase.entity.User
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package team8.fruitable.datebase.entity
|
package team8.fruitable.datebase.entity
|
||||||
|
|
||||||
import jakarta.persistence.*
|
import jakarta.persistence.*
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "items")
|
@Table(name = "items")
|
||||||
@ -10,15 +11,27 @@ class Item(
|
|||||||
@Column(name = "id", nullable = false)
|
@Column(name = "id", nullable = false)
|
||||||
var id: Long? = null,
|
var id: Long? = null,
|
||||||
|
|
||||||
@Column(name= "name", length = 32, nullable = false)
|
@Column(name = "name", length = 32, nullable = false)
|
||||||
var name: String? = null,
|
var name: String? = null,
|
||||||
|
|
||||||
@Column(name="price", nullable = false)
|
@Column(name = "price", nullable = false)
|
||||||
var price: Double? = null,
|
var price: Double? = null,
|
||||||
|
|
||||||
@Column(name="description", length=320, nullable = true)
|
@Column(name = "time_create", nullable = false)
|
||||||
|
var createTime: LocalDateTime = LocalDateTime.now(),
|
||||||
|
|
||||||
|
@Column(name = "time_edit", nullable = false)
|
||||||
|
var editTime: LocalDateTime = LocalDateTime.now(),
|
||||||
|
|
||||||
|
@Column(name = "description", length = 320, nullable = true)
|
||||||
var description: String? = null,
|
var description: String? = null,
|
||||||
|
|
||||||
|
@Column(name = "picture", length = 36, nullable = true)
|
||||||
|
var picture: String? = null,
|
||||||
|
|
||||||
|
@Column(name = "is_removed", nullable = false)
|
||||||
|
var isRemoved: Boolean? = false,
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "carts")
|
@JoinColumn(name = "carts")
|
||||||
var carted: User? = null,
|
var carted: User? = null,
|
||||||
@ -28,8 +41,48 @@ class Item(
|
|||||||
var ordered: Order? = null,
|
var ordered: Order? = null,
|
||||||
|
|
||||||
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "tagedItem")
|
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "tagedItem")
|
||||||
var tags: MutableList<Tag> = mutableListOf<Tag>(),
|
var tags: MutableList<Tag> = mutableListOf(),
|
||||||
|
|
||||||
@OneToOne(mappedBy = "item")
|
@OneToOne(mappedBy = "item")
|
||||||
var recommend: Recommend? = null,
|
var recommend: Recommend? = null,
|
||||||
)
|
) {
|
||||||
|
constructor(name: String, price: Double) : this() {
|
||||||
|
this.name = name
|
||||||
|
this.price = price
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
name: String,
|
||||||
|
price: Double,
|
||||||
|
description: String? = null,
|
||||||
|
picture: String? = null,
|
||||||
|
tags: MutableList<Tag>? = null,
|
||||||
|
isRemoved: Boolean? = null
|
||||||
|
) : this(name, price) {
|
||||||
|
if (!description.isNullOrBlank()) this.description = description
|
||||||
|
if (!picture.isNullOrBlank()) this.picture = picture
|
||||||
|
tags?.let { this.tags.addAll(it) }
|
||||||
|
isRemoved?.let { this.isRemoved = it }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun update(
|
||||||
|
name: String? = null,
|
||||||
|
price: Double? = null,
|
||||||
|
description: String? = null,
|
||||||
|
picture: String? = null,
|
||||||
|
tags: MutableList<Tag>? = null,
|
||||||
|
isRemoved: Boolean? = null
|
||||||
|
) {
|
||||||
|
if (!name.isNullOrBlank()) this.name = name
|
||||||
|
this.price = price?.let { if (it <= 0) null else it }
|
||||||
|
if (!description.isNullOrBlank()) this.description = description
|
||||||
|
if (!picture.isNullOrBlank()) this.picture = picture
|
||||||
|
tags?.let { this.tags.addAll(it) }
|
||||||
|
isRemoved?.let { this.isRemoved = it }
|
||||||
|
this.updateEditTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateEditTime() {
|
||||||
|
this.editTime = LocalDateTime.now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -16,4 +16,4 @@ class Recommend (
|
|||||||
|
|
||||||
@Column(name="description", length=32, nullable = false)
|
@Column(name="description", length=32, nullable = false)
|
||||||
var description: String? = null,
|
var description: String? = null,
|
||||||
)
|
)
|
||||||
|
@ -16,4 +16,8 @@ class Tag(
|
|||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "taged")
|
@JoinColumn(name = "taged")
|
||||||
var tagedItem: Item? = null
|
var tagedItem: Item? = null
|
||||||
)
|
) {
|
||||||
|
constructor(name: String) : this() {
|
||||||
|
this.name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package team8.fruitable.datebase.entity
|
package team8.fruitable.datebase.entity
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonView
|
|
||||||
import jakarta.persistence.*
|
import jakarta.persistence.*
|
||||||
import team8.fruitable.util.Util
|
import team8.fruitable.util.Util
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
@ -12,65 +11,47 @@ class User(
|
|||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column(name = "id", nullable = false)
|
@Column(name = "id", nullable = false)
|
||||||
@JsonView(UserView::class)
|
|
||||||
var id: Long? = null,
|
var id: Long? = null,
|
||||||
|
|
||||||
@Column(name = "name", length = 16, nullable = false)
|
@Column(name = "name", length = 16, nullable = false)
|
||||||
@JsonView(GuestView::class)
|
|
||||||
var name: String? = null,
|
var name: String? = null,
|
||||||
|
|
||||||
@Column(name = "password", length = 64, nullable = false)
|
@Column(name = "password", length = 64, nullable = false)
|
||||||
@JsonView(AdminView::class)
|
|
||||||
var password: String? = null,
|
var password: String? = null,
|
||||||
|
|
||||||
@Column(name = "time_create", nullable = false)
|
@Column(name = "time_create", nullable = false)
|
||||||
@JsonView(UserView::class)
|
|
||||||
var createTime: LocalDateTime = LocalDateTime.now(),
|
var createTime: LocalDateTime = LocalDateTime.now(),
|
||||||
|
|
||||||
@Column(name = "time_login", nullable = false)
|
@Column(name = "time_login", nullable = false)
|
||||||
@JsonView(UserView::class)
|
|
||||||
var loginTime: LocalDateTime = LocalDateTime.now(),
|
var loginTime: LocalDateTime = LocalDateTime.now(),
|
||||||
|
|
||||||
@Column(name = "token", length = 36)
|
@Column(name = "token", length = 36)
|
||||||
@JsonView(AdminView::class)
|
|
||||||
var token: String = UUID.randomUUID().toString(),
|
var token: String = UUID.randomUUID().toString(),
|
||||||
|
|
||||||
@Column(name = "age")
|
@Column(name = "age")
|
||||||
@JsonView(GuestView::class)
|
|
||||||
var age: Int? = null,
|
var age: Int? = null,
|
||||||
|
|
||||||
@Column(name = "gender", length = 1)
|
@Column(name = "gender", length = 1)
|
||||||
@JsonView(GuestView::class)
|
|
||||||
var gender: String? = null,
|
var gender: String? = null,
|
||||||
|
|
||||||
@Column(name = "phone", length = 11)
|
@Column(name = "phone", length = 11)
|
||||||
@JsonView(UserView::class)
|
|
||||||
var phone: String? = null,
|
var phone: String? = null,
|
||||||
|
|
||||||
@Column(name = "email", length = 64)
|
@Column(name = "email", length = 64)
|
||||||
@JsonView(GuestView::class)
|
|
||||||
var email: String? = null,
|
var email: String? = null,
|
||||||
|
|
||||||
@Column(name = "address", length = 64)
|
@Column(name = "address", length = 64)
|
||||||
@JsonView(UserView::class)
|
|
||||||
var address: String? = null,
|
var address: String? = null,
|
||||||
|
|
||||||
@Column(name = "is_admin", nullable = false)
|
@Column(name = "is_admin", nullable = false)
|
||||||
@JsonView(AdminView::class)
|
|
||||||
var isAdmin: Boolean = false,
|
var isAdmin: Boolean = false,
|
||||||
|
|
||||||
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "carted")
|
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "carted")
|
||||||
@JsonView(UserView::class)
|
|
||||||
var carts: MutableList<Item> = mutableListOf(),
|
var carts: MutableList<Item> = mutableListOf(),
|
||||||
|
|
||||||
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "user")
|
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY, mappedBy = "user")
|
||||||
@JsonView(UserView::class)
|
|
||||||
var orders: MutableList<Order> = mutableListOf()
|
var orders: MutableList<Order> = mutableListOf()
|
||||||
) {
|
) {
|
||||||
interface GuestView
|
|
||||||
interface UserView : GuestView
|
|
||||||
interface AdminView : UserView
|
|
||||||
|
|
||||||
constructor(name: String, password: String) : this() {
|
constructor(name: String, password: String) : this() {
|
||||||
this.name = name
|
this.name = name
|
||||||
this.password = this.genPassword(password)
|
this.password = this.genPassword(password)
|
||||||
@ -83,13 +64,15 @@ class User(
|
|||||||
gender: String?,
|
gender: String?,
|
||||||
phone: String?,
|
phone: String?,
|
||||||
email: String?,
|
email: String?,
|
||||||
address: String?
|
address: String?,
|
||||||
|
isAdmin: Boolean?
|
||||||
) : this(name, password) {
|
) : this(name, password) {
|
||||||
this.age = age
|
this.age = age?.let { if (it <= 0) null else it }
|
||||||
this.gender = gender
|
if (!gender.isNullOrBlank()) this.gender = gender
|
||||||
this.phone = phone
|
if (!phone.isNullOrBlank()) this.phone = phone
|
||||||
this.email = email
|
if (!email.isNullOrBlank()) this.email = email
|
||||||
this.address = address
|
if (!address.isNullOrBlank()) this.address = address
|
||||||
|
isAdmin?.let { this.isAdmin = it }
|
||||||
}
|
}
|
||||||
|
|
||||||
private final fun genPassword(password: String): String {
|
private final fun genPassword(password: String): String {
|
||||||
@ -108,11 +91,11 @@ class User(
|
|||||||
) {
|
) {
|
||||||
if (!name.isNullOrBlank()) this.name = name
|
if (!name.isNullOrBlank()) this.name = name
|
||||||
if (!password.isNullOrBlank()) this.updatePassword(password)
|
if (!password.isNullOrBlank()) this.updatePassword(password)
|
||||||
this.age = age
|
this.age = age?.let { if (it <= 0) null else it }
|
||||||
if (!gender.isNullOrBlank()) this.gender = gender
|
if (!gender.isNullOrBlank()) this.gender = gender
|
||||||
this.phone = phone
|
if (!phone.isNullOrBlank()) this.phone = phone
|
||||||
this.email = email
|
if (!email.isNullOrBlank()) this.email = email
|
||||||
this.address = address
|
if (!address.isNullOrBlank()) this.address = address
|
||||||
isAdmin?.let { this.isAdmin = it }
|
isAdmin?.let { this.isAdmin = it }
|
||||||
this.updateToken()
|
this.updateToken()
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package team8.fruitable.datebase.repository
|
package team8.fruitable.datebase.repository
|
||||||
|
|
||||||
import org.springframework.data.repository.CrudRepository
|
|
||||||
import org.springframework.data.repository.PagingAndSortingRepository
|
import org.springframework.data.repository.PagingAndSortingRepository
|
||||||
import team8.fruitable.datebase.entity.User
|
import team8.fruitable.datebase.entity.User
|
||||||
|
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package team8.fruitable.datebase.repository
|
||||||
|
|
||||||
|
import org.springframework.data.repository.PagingAndSortingRepository
|
||||||
|
import team8.fruitable.datebase.entity.Item
|
||||||
|
|
||||||
|
interface PagebleItemRepository : PagingAndSortingRepository<Item, Long> {
|
||||||
|
fun findByName(name: String): Item?
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package team8.fruitable.datebase.repository
|
||||||
|
|
||||||
|
import org.springframework.data.repository.CrudRepository
|
||||||
|
import team8.fruitable.datebase.entity.Tag
|
||||||
|
|
||||||
|
interface TagRepository : CrudRepository<Tag, Long> {
|
||||||
|
fun findByName(name: String): Tag?
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
debug: true
|
||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:mariadb://localhost:3306/fruitable
|
url: jdbc:mariadb://localhost:3306/fruitable
|
||||||
@ -12,3 +13,5 @@ server:
|
|||||||
encoding:
|
encoding:
|
||||||
charset: UTF-8
|
charset: UTF-8
|
||||||
force-response: true
|
force-response: true
|
||||||
|
data:
|
||||||
|
picture: /home/puqns67/IdeaProjects/fruitable/data/picture
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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)}`;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
11
src/main/resources/static/scripts/lib/less.min.js
vendored
Normal file
11
src/main/resources/static/scripts/lib/less.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/main/resources/static/static
Symbolic link
1
src/main/resources/static/static
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../../data
|
@ -1,92 +0,0 @@
|
|||||||
@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%;
|
|
||||||
height: 500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Title {
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Editors {
|
|
||||||
flex: 4 0 0;
|
|
||||||
flex-direction: row;
|
|
||||||
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 > .Editors > .ResultPanel {
|
|
||||||
color: wheat;
|
|
||||||
border: 3px solid skyblue;
|
|
||||||
border-spacing: 0;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Editors > .ResultPanel td {
|
|
||||||
white-space: nowrap;
|
|
||||||
border: 1px solid cornflowerblue;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Editors > .ResultPanel > thead {
|
|
||||||
background-color: #044488;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Editors > .ResultPanel > tbody {
|
|
||||||
background-color: #008080;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Editors > .EditPanel {
|
|
||||||
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 > .Editors > .EditPanel > .Panel {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Pages > * {
|
|
||||||
color: wheat;
|
|
||||||
margin-right: 3px;
|
|
||||||
border: 3px solid skyblue;
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: cadetblue;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Pages > *:last-child {
|
|
||||||
margin-right: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
#Contents > .Pages > span {
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 1280px) {
|
|
||||||
#Contents {
|
|
||||||
width: 1280px;
|
|
||||||
}
|
|
||||||
}
|
|
96
src/main/resources/static/styles/edit.less
Normal file
96
src/main/resources/static/styles/edit.less
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
@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%;
|
||||||
|
height: 500px;
|
||||||
|
|
||||||
|
> .Title {
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
color: wheat;
|
||||||
|
background-color: rgba(0, 60, 130, 0.8);
|
||||||
|
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||||
|
border-spacing: 0;
|
||||||
|
border-radius: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .Editors {
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
justify-content: center;
|
||||||
|
margin: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
color: wheat;
|
||||||
|
background-color: rgba(0, 60, 130, 0.8);
|
||||||
|
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||||
|
border-spacing: 0;
|
||||||
|
border-radius: 15px;
|
||||||
|
font-family: "Normal", system-ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .ResultPanel {
|
||||||
|
flex: 2 auto;
|
||||||
|
|
||||||
|
td {
|
||||||
|
border: 1px solid cornflowerblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
> thead {
|
||||||
|
background-color: #044488;
|
||||||
|
}
|
||||||
|
|
||||||
|
> tbody {
|
||||||
|
background-color: #008080;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .EditPanel {
|
||||||
|
flex: 1 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .Pages {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
color: wheat;
|
||||||
|
background-color: rgba(0, 60, 130, 0.8);
|
||||||
|
border: 3px solid rgba(0, 120, 255, 0.8);
|
||||||
|
border-spacing: 0;
|
||||||
|
border-radius: 15px;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
color: wheat;
|
||||||
|
margin-right: 3px;
|
||||||
|
border: 3px solid skyblue;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: cadetblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
> *:last-child {
|
||||||
|
margin-right: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
> span {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: "Normal";
|
|
||||||
src: url("../fonts/华文圆体-Regular.ttf") format("ttf");
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font: "Normal";
|
|
||||||
color: wheat;
|
|
||||||
}
|
|
@ -3,25 +3,25 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>账户 - 67购物网站</title>
|
<title>账户 - 67购物网站</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="text/javascript" src="scripts/footer.js"></script>
|
<script type="text/javascript" src="/scripts/footer.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.css">
|
<link type="text/css" rel="stylesheet" href="/styles/footer.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/form.css">
|
<link type="text/css" rel="stylesheet" href="/styles/form.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/user.css">
|
<link type="text/css" rel="stylesheet" href="/styles/user.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
@ -38,7 +38,7 @@
|
|||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="name">用户名</label>
|
<label class="ItemName" for="name">用户名</label>
|
||||||
<input class="ItemInput" id="name" type="text" name="name" placeholder="请输入新用户名"
|
<input class="ItemInput" id="name" type="text" name="name" placeholder="请输入新用户名"
|
||||||
value="{{ user.name }}"/>
|
value="{{user.name}}"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
@ -55,36 +55,36 @@
|
|||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="age">年龄</label>
|
<label class="ItemName" for="age">年龄</label>
|
||||||
<input class="ItemInput" id="age" type="number" name="age" placeholder="请输入新年龄"
|
<input class="ItemInput" id="age" type="number" name="age" placeholder="请输入新年龄"
|
||||||
{{# user.age }}value="{{ user.age }}"{{/user.age}}/>
|
{{#user.age}}value="{{user.age}}"{{/user.age}}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="phone">手机号码</label>
|
<label class="ItemName" for="phone">手机号码</label>
|
||||||
<input class="ItemInput" id="phone" type="tel" name="phone" placeholder="请输入新手机号"
|
<input class="ItemInput" id="phone" type="tel" name="phone" placeholder="请输入新手机号"
|
||||||
{{# user.phone }}value="{{ user.phone }}{{/ user.phone }}"/>
|
{{#user.phone}}value="{{user.phone}}{{/user.phone}}"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="email">邮箱</label>
|
<label class="ItemName" for="email">邮箱</label>
|
||||||
<input class="ItemInput" id="email" type="email" name="email" placeholder="请输入新邮箱"
|
<input class="ItemInput" id="email" type="email" name="email" placeholder="请输入新邮箱"
|
||||||
{{# user.email }}value="{{ user.email }}"{{/ user.email }}/>
|
{{#user.email}}value="{{user.email}}"{{/user.email}}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="address">地址</label>
|
<label class="ItemName" for="address">地址</label>
|
||||||
<input class="ItemInput" id="address" type="text" name="address" placeholder="请输入新地址"
|
<input class="ItemInput" id="address" type="text" name="address" placeholder="请输入新地址"
|
||||||
{{# user.address }}value="{{ user.address }}"{{/ user.address }}/>
|
{{#user.address}}value="{{user.address}}"{{/user.address}}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<input class="ItemInput" id="gender_null" type="radio" name="gender" value="N"
|
<input class="ItemInput" id="gender_null" type="radio" name="gender" value="N"
|
||||||
{{# isGenderAsUnknown }}checked{{/ isGenderAsUnknown }} />
|
{{#isGenderAsUnknown}}checked{{/isGenderAsUnknown}} />
|
||||||
<label class="ItemName" for="gender_null">未知</label>
|
<label class="ItemName" for="gender_null">未知</label>
|
||||||
<input class="ItemInput" id="gender_male" type="radio" name="gender" value="M"
|
<input class="ItemInput" id="gender_male" type="radio" name="gender" value="M"
|
||||||
{{# isGenderAsMale }}checked{{/ isGenderAsMale }} />
|
{{#isGenderAsMale}}checked{{/isGenderAsMale}} />
|
||||||
<label class="ItemName" for="gender_male">男性</label>
|
<label class="ItemName" for="gender_male">男性</label>
|
||||||
<input class="ItemInput" id="gender_female" type="radio" name="gender" value="F"
|
<input class="ItemInput" id="gender_female" type="radio" name="gender" value="F"
|
||||||
{{# isGenderAsFemale }}checked{{/ isGenderAsFemale }} />
|
{{#isGenderAsFemale}}checked{{/isGenderAsFemale}} />
|
||||||
<label class="ItemName" for="gender_female">女性</label>
|
<label class="ItemName" for="gender_female">女性</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -95,7 +95,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -3,35 +3,56 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>编辑 - 在线果蔬商城</title>
|
<title>编辑 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="text/javascript" src="scripts/footer.js"></script>
|
<script type="text/javascript" src="/scripts/footer.js"></script>
|
||||||
<script type="text/javascript" src="scripts/edit.js"></script>
|
<link type="image/x-icon" rel="icon" href="/images/favicon.ico">
|
||||||
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.css">
|
<link type="text/css" rel="stylesheet" href="/styles/footer.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/styles/form.css">
|
||||||
<!-- 页面特定的样式表 -->
|
<!-- 页面特定的样式表 -->
|
||||||
<link type="text/css" rel="stylesheet" href="styles/edit.css">
|
<link type="text/css" rel="stylesheet/less" href="/styles/edit.less">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/less.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
|
<!-- 实现更新与删除选项 -->
|
||||||
|
<script>
|
||||||
|
function getID(element) {
|
||||||
|
return element.parentElement.parentElement.getAttribute("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("DOMContentLoaded", () => {
|
||||||
|
Array.from(document.getElementsByClassName("update")).forEach((v) => {
|
||||||
|
v.addEventListener("click", function () {
|
||||||
|
window.location.replace(`/editor?use={{using}}&action=updating&target=${getID(this)}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Array.from(document.getElementsByClassName("remove")).forEach((v) => {
|
||||||
|
v.addEventListener("click", function () {
|
||||||
|
window.location.replace(`/editor?use={{using}}&action=deleting&target=${getID(this)}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
<div class="Title">
|
<div class="Title">
|
||||||
<div class="Tabs">
|
<div class="Tabs">
|
||||||
{{# tabs }}
|
{{#tabs}}
|
||||||
<a href="/editor?use={{ first }}">{{ second }}</a>
|
<a href="/editor?use={{first}}">{{second}}</a>
|
||||||
{{/ tabs }}
|
{{/tabs}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form class="Search" action="/editor" method="post">
|
<form class="Search" action="/editor" method="post">
|
||||||
@ -39,15 +60,15 @@
|
|||||||
<label>
|
<label>
|
||||||
以
|
以
|
||||||
<select name="search_type">
|
<select name="search_type">
|
||||||
{{# selects }}
|
{{#selects}}
|
||||||
<option value="{{ first }}">{{ second }}</option>
|
<option value="{{first}}">{{second}}</option>
|
||||||
{{/ selects }}
|
{{/selects}}
|
||||||
</select>
|
</select>
|
||||||
搜索
|
搜索
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<input name="search_content" placeholder="请在此处输入你想要搜索的内容..."
|
<input name="search_content" placeholder="请在此处输入你想要搜索的内容..."
|
||||||
{{# searching }}value="{{ searching }}"{{/ searching }}/>
|
{{#searching}}value="{{searching}}"{{/searching}}/>
|
||||||
</label>
|
</label>
|
||||||
<button type="submit">搜索</button>
|
<button type="submit">搜索</button>
|
||||||
</form>
|
</form>
|
||||||
@ -56,16 +77,27 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="Editors">
|
<div class="Editors">
|
||||||
{{# useUserEditor }}
|
{{#useUserEditor}}
|
||||||
{{> editor/user }}
|
{{>editor/user}}
|
||||||
{{/ useUserEditor }}
|
{{/useUserEditor}}
|
||||||
{{# useItemEditor }}
|
{{#useItemEditor}}
|
||||||
{{> editor/item }}
|
{{>editor/item}}
|
||||||
{{/ useItemEditor }}
|
{{/useItemEditor}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="Pages">
|
||||||
|
{{#pages}}
|
||||||
|
{{#first}}
|
||||||
|
<span>第 {{second}} 页</span>
|
||||||
|
{{/first}}
|
||||||
|
{{^first}}
|
||||||
|
<a href="/editor?use={{using}}&page={{second}}">第 {{second}} 页</a>
|
||||||
|
{{/first}}
|
||||||
|
{{/pages}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -2,38 +2,125 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td>ID</td>
|
<td>ID</td>
|
||||||
<td>用户名</td>
|
<td>商品名</td>
|
||||||
<td>帐户创建时间</td>
|
<td>创建时间</td>
|
||||||
<td>最后登录时间</td>
|
<td>更新时间</td>
|
||||||
<td>年龄</td>
|
<td>价格</td>
|
||||||
<td>性别</td>
|
<td>标签</td>
|
||||||
<td>邮箱</td>
|
|
||||||
<td>管理员</td>
|
|
||||||
<td>操作</td>
|
<td>操作</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{# Users }}
|
{{#data}}
|
||||||
<tr id="{{ Id }}">
|
<tr id="{{id}}">
|
||||||
<td>{{ Id }}</td>
|
<td>{{id}}</td>
|
||||||
<td>{{ UserName }}</td>
|
<td>{{name}}</td>
|
||||||
<td>{{ CreateDate }}</td>
|
<td>{{createTime}}</td>
|
||||||
<td>{{ LastLoginDate }}</td>
|
<td>{{editTime}}</td>
|
||||||
<td>{{ Age }}</td>
|
<td>{{price}}</td>
|
||||||
<td>{{ Gender }}</td>
|
<td>{{tags}}</td>
|
||||||
<td>{{ Phone }}</td>
|
|
||||||
<td>{{ Email }}</td>
|
|
||||||
<td>{{ Address }}</td>
|
|
||||||
<td>{{ IsAdmin }}</td>
|
|
||||||
<td>
|
<td>
|
||||||
<button class="update">编辑</button>
|
<button class="update">编辑</button>
|
||||||
<button class="remove">删除</button>
|
<button class="remove">删除</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/ Users }}
|
{{/data}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div class="EditPanel">
|
<div class="EditPanel">
|
||||||
<!-- <iframe id="Panel" class="Panel" name="panel"></iframe>-->
|
{{#isNothing}}
|
||||||
|
<form class="TabForm" action="/editor" method="post">
|
||||||
|
<h2>请在左侧列表中选择需要进行的操作!</h2>
|
||||||
|
<input type="hidden" name="use" value="item"/>
|
||||||
|
<input type="hidden" name="action" value="creating"/>
|
||||||
|
<button type="submit">或者点击此处新建一个商品!</button>
|
||||||
|
</form>
|
||||||
|
{{/isNothing}}
|
||||||
|
|
||||||
|
{{#isCreating}}
|
||||||
|
<form class="TabForm" action="/action/edit/item/create" method="post" enctype="multipart/form-data">
|
||||||
|
<div class="TabTitle">新建商品</div>
|
||||||
|
|
||||||
|
<div class="TabFormItems">
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="name">商品名</label>
|
||||||
|
<input class="ItemInput" id="name" type="text" name="name" placeholder="请输入商品名" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="price">价格</label>
|
||||||
|
<input class="ItemInput" id="price" type="number" name="price" placeholder="请输入价格" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="description">详情</label>
|
||||||
|
<input class="ItemInput" id="description" type="text" name="description" placeholder="请输入详情"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="tag">标签</label>
|
||||||
|
<input class="ItemInput" id="tag" type="text" name="tag" placeholder="请输入标签,以空格隔开!"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="picture">图片</label>
|
||||||
|
<input class="ItemInput" id="picture" type="file" name="picture" placeholder="请选择图片" required/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabButtons">
|
||||||
|
<button class="TabButton" type="reset">重置</button>
|
||||||
|
<button class="TabButton" type="submit">创建</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{/isCreating}}
|
||||||
|
|
||||||
|
{{#isUpdating}}
|
||||||
|
<form class="TabForm" action="/action/edit/item/update/{{target.id}}" method="post" enctype="multipart/form-data">
|
||||||
|
<div class="TabTitle">更新商品详情</div>
|
||||||
|
|
||||||
|
<div class="TabFormItems">
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="name">商品名</label>
|
||||||
|
<input class="ItemInput" id="name" type="text" name="name" placeholder="请输入商品名"
|
||||||
|
{{#target.name}}value="{{target.name}}"{{/target.name}} required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="price">价格</label>
|
||||||
|
<input class="ItemInput" id="price" type="number" name="price" placeholder="请输入价格"
|
||||||
|
{{#target.price}}value="{{target.price}}"{{/target.price}} required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="description">详情</label>
|
||||||
|
<input class="ItemInput" id="description" type="text" name="description" placeholder="请输入详情"
|
||||||
|
{{#target.description}}value="{{target.description}}"{{/target.description}}/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="tag">标签</label>
|
||||||
|
<input class="ItemInput" id="tag" type="text" name="tag" placeholder="请输入标签,以空格隔开!"
|
||||||
|
{{#target.tags}}value="{{target.tags}}"{{/target.tags}}/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="picture">图片</label>
|
||||||
|
<input class="ItemInput" id="picture" type="file" name="picture" placeholder="请选择图片"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabButtons">
|
||||||
|
<button class="TabButton" type="submit">更新</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{/isUpdating}}
|
||||||
|
|
||||||
|
{{#isDeleting}}
|
||||||
|
<form class="TabForm" action="/action/edit/item/delete/{{target.id}}" method="post">
|
||||||
|
<h2>确定要删除商品 {{target.name}} 吗?</h2>
|
||||||
|
<button class="TabButton" type="submit">删除</button>
|
||||||
|
</form>
|
||||||
|
{{/isDeleting}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,27 +15,175 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{# data }}
|
{{#data}}
|
||||||
<tr id="{{ id }}">
|
<tr id="{{id}}">
|
||||||
<td>{{ id }}</td>
|
<td>{{id}}</td>
|
||||||
<td>{{ name }}</td>
|
<td>{{name}}</td>
|
||||||
<td>{{ createTime }}</td>
|
<td>{{createTime}}</td>
|
||||||
<td>{{ loginTime }}</td>
|
<td>{{loginTime}}</td>
|
||||||
<td>{{# age }}{{ age }}{{/ age }}</td>
|
<td>{{#age}}{{age}}{{/age}}</td>
|
||||||
<td>{{# gender }}{{ gender }}{{/ gender }}</td>
|
<td>{{#gender}}{{gender}}{{/gender}}</td>
|
||||||
<td>{{# phone }}{{ phone }}{{/ phone }}</td>
|
<td>{{#phone}}{{phone}}{{/phone}}</td>
|
||||||
<td>{{# email }}{{ email }}{{/ email }}</td>
|
<td>{{#email}}{{email}}{{/email}}</td>
|
||||||
<td>{{# address }}{{ address }}{{/ address }}</td>
|
<td>{{#address}}{{address}}{{/address}}</td>
|
||||||
<td>{{# isAdmin }}是{{/ isAdmin }}{{^ isAdmin }}否{{/ isAdmin }}</td>
|
<td>{{#isAdmin}}是{{/isAdmin}}{{^isAdmin}}否{{/isAdmin}}</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="update">编辑</button>
|
<button class="update">编辑</button>
|
||||||
<button class="remove">删除</button>
|
<button class="remove">删除</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/ data }}
|
{{/data}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div class="EditPanel">
|
<div class="EditPanel">
|
||||||
<!-- <iframe id="Panel" class="Panel" name="panel"></iframe>-->
|
{{#isNothing}}
|
||||||
|
<form class="TabForm" action="/editor" method="post">
|
||||||
|
<h2>请在左侧列表中选择需要进行的操作!</h2>
|
||||||
|
<input type="hidden" name="use" value="user"/>
|
||||||
|
<input type="hidden" name="action" value="creating"/>
|
||||||
|
<button type="submit">或者点击此处新建一个用户!</button>
|
||||||
|
</form>
|
||||||
|
{{/isNothing}}
|
||||||
|
|
||||||
|
{{#isCreating}}
|
||||||
|
<form class="TabForm" action="/action/edit/user/create" method="post">
|
||||||
|
<div class="TabTitle">新建用户</div>
|
||||||
|
|
||||||
|
<div class="TabFormItems">
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="name">用户名</label>
|
||||||
|
<input class="ItemInput" id="name" type="text" name="name" 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="password_confirm">确认密码</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="phone">手机号码</label>
|
||||||
|
<input class="ItemInput" id="phone" type="text" name="phone" 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">
|
||||||
|
<label class="ItemName" for="address">地址</label>
|
||||||
|
<input class="ItemInput" id="address" type="text" name="address" 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 class="TabFormItem">
|
||||||
|
<input class="ItemInput" id="admin_false" type="radio" name="is_admin" value="false" checked/>
|
||||||
|
<label class="ItemName" for="admin_false">非管理员</label>
|
||||||
|
<input class="ItemInput" id="gender_male" type="radio" name="is_admin" value="true"/>
|
||||||
|
<label class="ItemName" for="gender_male">为管理员</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabButtons">
|
||||||
|
<button class="TabButton" type="reset">重置</button>
|
||||||
|
<button class="TabButton" type="submit">创建</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{/isCreating}}
|
||||||
|
|
||||||
|
{{#isUpdating}}
|
||||||
|
<form class="TabForm" action="/action/edit/user/update/{{target.id}}" method="post">
|
||||||
|
<div class="TabTitle">更新用户数据</div>
|
||||||
|
|
||||||
|
<div class="TabFormItems">
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="name">用户名</label>
|
||||||
|
<input class="ItemInput" id="name" type="text" name="name" placeholder="请输入新用户名"
|
||||||
|
value="{{target.name}}"/>
|
||||||
|
</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="age">年龄</label>
|
||||||
|
<input class="ItemInput" id="age" type="number" name="age" placeholder="请输入新年龄"
|
||||||
|
{{#target.age}}value="{{target.age}}"{{/target.age}}/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="phone">手机号码</label>
|
||||||
|
<input class="ItemInput" id="phone" type="tel" name="phone" placeholder="请输入新手机号"
|
||||||
|
{{#target.phone}}value="{{target.phone}}{{/target.phone}}"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="email">邮箱</label>
|
||||||
|
<input class="ItemInput" id="email" type="email" name="email" placeholder="请输入新邮箱"
|
||||||
|
{{#target.email}}value="{{target.email}}"{{/target.email}}/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<label class="ItemName" for="address">地址</label>
|
||||||
|
<input class="ItemInput" id="address" type="text" name="address" placeholder="请输入新地址"
|
||||||
|
{{#target.address}}value="{{target.address}}"{{/target.address}}/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<input class="ItemInput" id="gender_null" type="radio" name="gender" value="N"
|
||||||
|
{{#isGenderAsUnknown}}checked{{/isGenderAsUnknown}} />
|
||||||
|
<label class="ItemName" for="gender_null">未知</label>
|
||||||
|
<input class="ItemInput" id="gender_male" type="radio" name="gender" value="M"
|
||||||
|
{{#isGenderAsMale}}checked{{/isGenderAsMale}} />
|
||||||
|
<label class="ItemName" for="gender_male">男性</label>
|
||||||
|
<input class="ItemInput" id="gender_female" type="radio" name="gender" value="F"
|
||||||
|
{{#isGenderAsFemale}}checked{{/isGenderAsFemale}} />
|
||||||
|
<label class="ItemName" for="gender_female">女性</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabFormItem">
|
||||||
|
<input class="ItemInput" id="admin_false" type="radio" name="is_admin" value="false"
|
||||||
|
{{^target.isAdmin}}checked{{/target.isAdmin}} />
|
||||||
|
<label class="ItemName" for="admin_false">非管理员</label>
|
||||||
|
<input class="ItemInput" id="gender_male" type="radio" name="is_admin" value="true"
|
||||||
|
{{#target.isAdmin}}checked{{/target.isAdmin}} />
|
||||||
|
<label class="ItemName" for="gender_male">为管理员</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="TabButtons">
|
||||||
|
<button class="TabButton" type="submit">更新</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{/isUpdating}}
|
||||||
|
|
||||||
|
{{#isDeleting}}
|
||||||
|
<form class="TabForm" action="/action/edit/user/delete/{{target.id}}" method="post">
|
||||||
|
<h2>确定要删除用户 {{target.name}} 吗?</h2>
|
||||||
|
<button class="TabButton" type="submit">删除</button>
|
||||||
|
</form>
|
||||||
|
{{/isDeleting}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,44 +3,44 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>错误 - 在线果蔬商城</title>
|
<title>错误 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="module" src="scripts/resources.js"></script>
|
<script type="module" src="/scripts/resources.js"></script>
|
||||||
<script type="module" src="scripts/items.js"></script>
|
<script type="module" src="/scripts/items.js"></script>
|
||||||
<script type="module" src="scripts/index.js"></script>
|
<script type="module" src="/scripts/index.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.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/loading.css">
|
||||||
<!-- 页面特定的样式表 -->
|
<!-- 页面特定的样式表 -->
|
||||||
<link type="text/css" rel="stylesheet" href="styles/error.css">
|
<link type="text/css" rel="stylesheet" href="/styles/error.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
<!-- 自动跳转 -->
|
<!-- 自动跳转 -->
|
||||||
{{# redirect }}
|
{{#redirect}}
|
||||||
<meta http-equiv="refresh" content="3;url={{ redirect }}">
|
<meta http-equiv="refresh" content="3;url={{redirect}}">
|
||||||
{{/ redirect }}
|
{{/redirect}}
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<div class="ErrorInfo">
|
<div class="ErrorInfo">
|
||||||
<div class="ErrorTitle">{{ title }}失败</div>
|
<div class="ErrorTitle">{{title}}失败</div>
|
||||||
<div class="ErrorMessage">原因: {{ message }}</div>
|
<div class="ErrorMessage">原因: {{message}}</div>
|
||||||
{{# redirect }}
|
{{#redirect}}
|
||||||
<div class="ErrorRedirectMessage">将在三秒后跳转至页面: {{ redirect }}</div>
|
<div class="ErrorRedirectMessage">将在三秒后跳转至页面: {{redirect}}</div>
|
||||||
<button class="ErrorRedirectButton" onclick="window.location.replace('{{ redirect }}')">点此立即跳转</button>
|
<button class="ErrorRedirectButton" onclick="window.location.replace('{{redirect}}')">点此立即跳转</button>
|
||||||
{{/ redirect }}
|
{{/redirect}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<!-- 页尾内容 -->
|
<!-- 页尾内容 -->
|
||||||
<div id="Footer">
|
<div id="Footer">
|
||||||
<div class="Infos">
|
<div class="Infos">
|
||||||
<div class="Icon"><img alt="图标" src="images/icon.svg"/></div>
|
<div class="Icon"><img alt="图标" src="/images/icon.svg"/></div>
|
||||||
<div class="Title">果蔬销售商城</div>
|
<div class="Title">果蔬销售商城</div>
|
||||||
<div class="Contents">
|
<div class="Contents">
|
||||||
<span>只做高质量商品销售~</span>
|
<span>只做高质量商品销售~</span>
|
||||||
|
@ -15,16 +15,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="List Blank"></div>
|
<div class="List Blank"></div>
|
||||||
{{#user}}
|
{{#user}}
|
||||||
<div class="List Button Link" {{#isCart}}this{{/isCart}}{{^isCart}}href="/cart"{{/isCart}}><span class="Text">购物车</span></div>
|
<div class="List Button Link" {{#isCart}}this{{/isCart}}{{^isCart}}href="/cart"{{/isCart}}><span class="Text">购物车</span>
|
||||||
|
</div>
|
||||||
<div class="List Button Link" href="/action/account/logout"><span class="Text">注销</span></div>
|
<div class="List Button Link" href="/action/account/logout"><span class="Text">注销</span></div>
|
||||||
{{#isAdmin}}
|
{{#isAdmin}}
|
||||||
<div class="List Button Link" {{#isEditor}}this{{/isEditor}}{{^isEditor}}href="/editor"{{/isEditor}}><span class="Text">编辑</span></div>
|
<div class="List Button Link" {{#isEditor}}this{{/isEditor}}{{^isEditor}}href="/editor"{{/isEditor}}><span
|
||||||
|
class="Text">编辑</span></div>
|
||||||
{{/isAdmin}}
|
{{/isAdmin}}
|
||||||
<div class="List Button Link" {{#isAccount}}this{{/isAccount}}{{^isAccount}}href="/account"{{/isAccount}}><span class="Text">账户</span></div>
|
<div class="List Button Link" {{#isAccount}}this{{/isAccount}}{{^isAccount}}href="/account"{{/isAccount}}><span
|
||||||
|
class="Text">账户</span></div>
|
||||||
{{/user}}
|
{{/user}}
|
||||||
{{^user}}
|
{{^user}}
|
||||||
<div class="List Button Link" {{#isLogin}}this{{/isLogin}}{{^isLogin}}href="/login"{{/isLogin}}><span class="Text">登录</span></div>
|
<div class="List Button Link" {{#isLogin}}this{{/isLogin}}{{^isLogin}}href="/login"{{/isLogin}}><span
|
||||||
<div class="List Button Link" {{#isRegister}}this{{/isRegister}}{{^isRegister}}href="/register"{{/isRegister}}><span class="Text">注册</span></div>
|
class="Text">登录</span></div>
|
||||||
|
<div class="List Button Link" {{#isRegister}}this{{/isRegister}}{{^isRegister}}href="/register"{{/isRegister}}>
|
||||||
|
<span class="Text">注册</span></div>
|
||||||
{{/user}}
|
{{/user}}
|
||||||
<div class="List Special Clock">
|
<div class="List Special Clock">
|
||||||
<span class="CLOCK"></span>
|
<span class="CLOCK"></span>
|
||||||
|
@ -3,29 +3,29 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>主页 - 在线果蔬商城</title>
|
<title>主页 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="module" src="scripts/resources.js"></script>
|
<script type="module" src="/scripts/resources.js"></script>
|
||||||
<script type="module" src="scripts/items.js"></script>
|
<script type="module" src="/scripts/items.js"></script>
|
||||||
<script type="module" src="scripts/index.js"></script>
|
<script type="module" src="/scripts/index.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.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/loading.css">
|
||||||
<!-- 页面特定的样式表 -->
|
<!-- 页面特定的样式表 -->
|
||||||
<link type="text/css" rel="stylesheet" href="styles/index.css">
|
<link type="text/css" rel="stylesheet" href="/styles/index.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
@ -60,7 +60,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -3,36 +3,35 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>商品 - 在线果蔬商城</title>
|
<title>商品 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="text/javascript" src="scripts/footer.js"></script>
|
<script type="text/javascript" src="/scripts/footer.js"></script>
|
||||||
<script type="module" src="scripts/resources.js"></script>
|
<script type="module" src="/scripts/resources.js"></script>
|
||||||
<script type="module" src="scripts/items.js"></script>
|
<script type="module" src="/scripts/items.js"></script>
|
||||||
<script type="module" src="scripts/item.js"></script>
|
<script type="module" src="/scripts/item.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.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/item.css">
|
<link type="text/css" rel="stylesheet" href="/styles/item.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
<div class="Item">
|
<div class="Item">
|
||||||
<div class="Picture">
|
<div class="Picture">
|
||||||
<img alt="商品图片" src=""/>
|
<img alt="商品图片" src="{{item.picture}}"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="Infos">
|
<div class="Infos">
|
||||||
<span class="Title"></span>
|
<span class="Title"></span>
|
||||||
@ -62,7 +61,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -3,30 +3,30 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>登录 - 在线果蔬商城</title>
|
<title>登录 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="module" src="scripts/resources.js"></script>
|
<script type="module" src="/scripts/resources.js"></script>
|
||||||
<script type="module" src="scripts/items.js"></script>
|
<script type="module" src="/scripts/items.js"></script>
|
||||||
<script type="module" src="scripts/index.js"></script>
|
<script type="module" src="/scripts/index.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.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/loading.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/form.css">
|
<link type="text/css" rel="stylesheet" href="/styles/form.css">
|
||||||
<!-- 页面特定的样式表 -->
|
<!-- 页面特定的样式表 -->
|
||||||
<link type="text/css" rel="stylesheet" href="styles/user.css">
|
<link type="text/css" rel="stylesheet" href="/styles/user.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header}}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
@ -52,7 +52,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer}}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -3,30 +3,30 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>注册 - 在线果蔬商城</title>
|
<title>注册 - 在线果蔬商城</title>
|
||||||
<script type="text/javascript" src="scripts/header.js"></script>
|
<script type="text/javascript" src="/scripts/header.js"></script>
|
||||||
<script type="text/javascript" src="scripts/clock.js"></script>
|
<script type="text/javascript" src="/scripts/clock.js"></script>
|
||||||
<script type="text/javascript" src="scripts/top.js"></script>
|
<script type="text/javascript" src="/scripts/top.js"></script>
|
||||||
<script type="module" src="scripts/resources.js"></script>
|
<script type="module" src="/scripts/resources.js"></script>
|
||||||
<script type="module" src="scripts/items.js"></script>
|
<script type="module" src="/scripts/items.js"></script>
|
||||||
<script type="module" src="scripts/index.js"></script>
|
<script type="module" src="/scripts/index.js"></script>
|
||||||
<link type="image/x-icon" rel="icon" href="images/favicon.ico">
|
<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/header.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/clock.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/top.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/footer.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/loading.css">
|
||||||
<link type="text/css" rel="stylesheet" href="styles/form.css">
|
<link type="text/css" rel="stylesheet" href="/styles/form.css">
|
||||||
<!-- 页面特定的样式表 -->
|
<!-- 页面特定的样式表 -->
|
||||||
<link type="text/css" rel="stylesheet" href="styles/user.css">
|
<link type="text/css" rel="stylesheet" href="/styles/user.css">
|
||||||
<!-- 外部小组件 -->
|
<!-- 外部小组件 -->
|
||||||
<script src="scripts/lib/anime.min.js"></script>
|
<script src="/scripts/lib/anime.min.js"></script>
|
||||||
<script async src="scripts/lib/explosion.min.js"></script>
|
<script async src="/scripts/lib/explosion.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{{> header }}
|
{{>header}}
|
||||||
|
|
||||||
<!-- 页面内容 -->
|
<!-- 页面内容 -->
|
||||||
<div id="Contents">
|
<div id="Contents">
|
||||||
@ -57,7 +57,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="phone">邮箱</label>
|
<label class="ItemName" for="phone">手机号码</label>
|
||||||
<input class="ItemInput" id="phone" type="text" name="phone" placeholder="请输入手机号"/>
|
<input class="ItemInput" id="phone" type="text" name="phone" placeholder="请输入手机号"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -67,8 +67,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
<label class="ItemName" for="address">邮箱</label>
|
<label class="ItemName" for="address">地址</label>
|
||||||
<input class="ItemInput" id="address" type="text" name="address" placeholder="请输入邮箱"/>
|
<input class="ItemInput" id="address" type="text" name="address" placeholder="请输入地址"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="TabFormItem">
|
<div class="TabFormItem">
|
||||||
@ -88,7 +88,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{> footer }}
|
{{>footer}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
{{> header}}
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<label>用户名: {{userName}}</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{> footer}}
|
|
Loading…
Reference in New Issue
Block a user