master
parent
e30939afa4
commit
302254bcbb
@ -0,0 +1,21 @@
|
||||
package com.backend.anno;
|
||||
|
||||
import com.backend.validaion.StateValidation;
|
||||
import jakarta.validation.Constraint;
|
||||
import jakarta.validation.Payload;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Documented
|
||||
@Constraint(validatedBy = {StateValidation.class})
|
||||
@Target({ElementType.FIELD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface State {
|
||||
|
||||
String message() default "state参数的值只能是已签收、未签收";
|
||||
|
||||
Class<?>[] groups() default {};
|
||||
|
||||
Class<? extends Payload>[] payload() default {};
|
||||
|
||||
}
|
@ -1,21 +1,41 @@
|
||||
package com.backend.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.backend.anno.State;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.groups.Default;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class Express {
|
||||
@NotNull
|
||||
private Integer id;
|
||||
@NotNull
|
||||
private String expressid;
|
||||
@NotEmpty
|
||||
private String sename;
|
||||
@NotEmpty
|
||||
private String sephone;
|
||||
@NotEmpty
|
||||
private String seaddress;
|
||||
@NotEmpty
|
||||
private String rename;
|
||||
@NotEmpty
|
||||
private String rephone;
|
||||
@NotEmpty
|
||||
private String readdress;
|
||||
private Integer issigned;
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy年MM月dd日")
|
||||
private Date signtime;
|
||||
@State
|
||||
private String issigned;
|
||||
@NotNull
|
||||
private LocalDateTime signtime;
|
||||
|
||||
public interface Add extends Default {
|
||||
|
||||
}
|
||||
|
||||
public interface Update extends Default{
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
package com.backend.pojo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
//分页返回结果对象
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PageBean <T>{
|
||||
private Long total;//总条数
|
||||
private List<T> items;//当前页数据集合
|
||||
}
|
@ -1,18 +1,26 @@
|
||||
package com.backend.service;
|
||||
|
||||
import com.backend.pojo.Express;
|
||||
import com.backend.pojo.PageBean;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
|
||||
public interface ExpressService {
|
||||
Express findExpressById(final String expressId);
|
||||
|
||||
void insert(final String expressId,
|
||||
final String sename, final String sephone, final String seaddress,
|
||||
final String rename, final String rephone, final String readdress,
|
||||
final Integer issign, final Date signtime);
|
||||
void add(final Express express);
|
||||
|
||||
void update(final Express express);
|
||||
|
||||
void delete(final Express express);
|
||||
void delete(Integer id);
|
||||
|
||||
PageBean<Express> list(final String expressid,
|
||||
final String sename,
|
||||
final String sephone,
|
||||
final String seaddress,
|
||||
final String rename,
|
||||
final String rephone,
|
||||
final String readdress,
|
||||
final String issign,
|
||||
final LocalDateTime signtime);
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
package com.backend.validaion;
|
||||
|
||||
import com.backend.anno.State;
|
||||
import jakarta.validation.ConstraintValidator;
|
||||
import jakarta.validation.ConstraintValidatorContext;
|
||||
|
||||
public class StateValidation implements ConstraintValidator<State, String> {
|
||||
|
||||
@Override
|
||||
public boolean isValid(final String value, final ConstraintValidatorContext constraintValidatorContext) {
|
||||
if (value == null) {
|
||||
return false;
|
||||
}
|
||||
return value.equals("已签收") || value.equals("未签收");
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.backend.mapper.ExpressMapper">
|
||||
<select id="list" resultType="com.backend.pojo.Express">
|
||||
SELECT * FROM express_info
|
||||
WHERE id = #{id} OR sename = #{sename} OR sephone = #{sephone} OR seaddress = #{seaddress}
|
||||
OR rename = #{rename} OR rephone = #{rephone} OR readdress = #{readdress} OR issigned = #{issigned}
|
||||
OR signtime = #{signtime}
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.backend.mapper.ExpressMapper">
|
||||
<select id="list" resultType="com.backend.pojo.Express">
|
||||
SELECT * FROM express_info
|
||||
WHERE id = #{id} OR sename = #{sename} OR sephone = #{sephone} OR seaddress = #{seaddress}
|
||||
OR rename = #{rename} OR rephone = #{rephone} OR readdress = #{readdress} OR issigned = #{issigned}
|
||||
OR signtime = #{signtime}
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -1,11 +1,174 @@
|
||||
|
||||
|
||||
<template>
|
||||
<el-container class="layout-container">
|
||||
<!-- 左侧菜单 -->
|
||||
<el-aside width="200px">
|
||||
<div class="el-aside__logo"></div>
|
||||
<el-menu active-text-color="#ffd04b" background-color="#ccccd6" text-color="#fff"
|
||||
router>
|
||||
<el-menu-item index="/expressForm">
|
||||
<el-icon>
|
||||
<Management/>
|
||||
</el-icon>
|
||||
<span>我要求寄件</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="/expressList">
|
||||
<el-icon>
|
||||
<Promotion/>
|
||||
</el-icon>
|
||||
<span>运输查询</span>
|
||||
</el-menu-item>
|
||||
<el-sub-menu>
|
||||
<template #title>
|
||||
<el-icon>
|
||||
<UserFilled/>
|
||||
</el-icon>
|
||||
<span>个人中心</span>
|
||||
</template>
|
||||
<el-menu-item index="/userInfo">
|
||||
<el-icon>
|
||||
<User/>
|
||||
</el-icon>
|
||||
<span>我的资料</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="/user/resetPassword">
|
||||
<el-icon>
|
||||
<EditPen/>
|
||||
</el-icon>
|
||||
<span>重置密码</span>
|
||||
</el-menu-item>
|
||||
</el-sub-menu>
|
||||
</el-menu>
|
||||
</el-aside>
|
||||
<!-- 右侧主区域 -->
|
||||
<el-container>
|
||||
<!-- 头部区域 -->
|
||||
<el-header>
|
||||
<div>欢迎您: <strong>{{ userInfoStore.userInfo.nickname }}</strong></div>
|
||||
<el-dropdown placement="bottom-end" @command="handleCommand">
|
||||
<span class="el-dropdown__box">
|
||||
<el-avatar :src="userInfoStore.userInfo.userPic?userInfoStore.userInfo.userPic:avatar"/>
|
||||
<el-icon>
|
||||
<CaretBottom/>
|
||||
</el-icon>
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="info" :icon="User">基本资料</el-dropdown-item>
|
||||
<el-dropdown-item command="resetPassword" :icon="EditPen">重置密码</el-dropdown-item>
|
||||
<el-dropdown-item command="logout" :icon="SwitchButton">退出登录</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</el-header>
|
||||
<!-- 中间区域 -->
|
||||
<el-main>
|
||||
<router-view/>
|
||||
</el-main>
|
||||
<!-- 底部区域 -->
|
||||
<el-footer>卓越快递</el-footer>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import {
|
||||
CaretBottom,
|
||||
Crop,
|
||||
EditPen,
|
||||
Management,
|
||||
Promotion,
|
||||
SwitchButton,
|
||||
User,
|
||||
UserFilled
|
||||
} from '@element-plus/icons-vue'
|
||||
import avatar from '@/assets/default.png'
|
||||
import {userInfoService} from "@/api/user";
|
||||
import {useUserInfoStore} from "@/stores/userInfo";
|
||||
import {useRouter} from "vue-router";
|
||||
import {ElMessage, ElMessageBox} from "element-plus";
|
||||
import {useTokenStore} from "@/stores/token";
|
||||
|
||||
const userInfoStore = useUserInfoStore();
|
||||
const getUserInfo = async () => {
|
||||
const result = await userInfoService();
|
||||
userInfoStore.setUserInfo(result.data)
|
||||
}
|
||||
getUserInfo()
|
||||
|
||||
const router = useRouter();
|
||||
const tokenStore = useTokenStore();
|
||||
const handleCommand = (command) => {
|
||||
if (command === 'logout') {
|
||||
ElMessageBox.confirm(
|
||||
'你确认要退出吗?',
|
||||
'温馨提示',
|
||||
{
|
||||
confirmButtonText: '确认',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
).then(
|
||||
async () => {
|
||||
// clear data in pinia
|
||||
userInfoStore.removeUserInfo()
|
||||
tokenStore.removeToken()
|
||||
ElMessage.success("退出成功")
|
||||
await router.push('/login')
|
||||
}
|
||||
)
|
||||
} else {
|
||||
router.push('/user/' + command)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.layout-container {
|
||||
height: 100vh;
|
||||
|
||||
<template>
|
||||
.el-aside {
|
||||
background-color: #ccccd6;
|
||||
|
||||
</template>
|
||||
&__logo {
|
||||
height: 120px;
|
||||
background: url('/logo.png') no-repeat center / 120px auto;
|
||||
}
|
||||
|
||||
.el-menu {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
|
||||
.el-header {
|
||||
background-color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.el-dropdown__box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.el-icon {
|
||||
color: #999;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
<style scoped>
|
||||
&:active,
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.el-footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
color: #ccccd6;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,153 +0,0 @@
|
||||
<template>
|
||||
<el-row class="page">
|
||||
<el-row class="block-view" v-for="(item,index) in expressList">
|
||||
<el-row class="top">
|
||||
<el-row> 运单号: {{item.express_no}}</el-row>
|
||||
<el-row class="top-time"> 签收时间: {{item.s_datetime}}</el-row>
|
||||
</el-row>
|
||||
<el-row class="express-view">
|
||||
<el-row class="express-no-view">
|
||||
<el-text class="city">
|
||||
{{item.senderCity}}
|
||||
</el-text>
|
||||
<el-text class="user">
|
||||
{{item.senderName}}
|
||||
</el-text>
|
||||
</el-row>
|
||||
<el-row class="express-no-view">
|
||||
<el-image class="logo" src="/logo.png"></el-image>
|
||||
<el-text class="sign">
|
||||
已签收
|
||||
</el-text>
|
||||
</el-row>
|
||||
<el-row class="express-no-view">
|
||||
<el-text class="city">
|
||||
{{item.receiverCity}}
|
||||
</el-text>
|
||||
<el-text class="user">
|
||||
{{item.receiverName}}
|
||||
</el-text>
|
||||
</el-row>
|
||||
<el-row class="express-icon-view">
|
||||
<el-icon>
|
||||
<Delete />
|
||||
</el-icon>
|
||||
<el-icon>
|
||||
<Edit />
|
||||
</el-icon>
|
||||
</el-row>
|
||||
</el-row>
|
||||
|
||||
<el-row class="line-view"></el-row>
|
||||
</el-row>
|
||||
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
Delete,
|
||||
Edit
|
||||
} from '@element-plus/icons-vue'
|
||||
import {
|
||||
reactive
|
||||
} from 'vue';
|
||||
const expressList = reactive([{
|
||||
"express_no": "SF1313131313123",
|
||||
"senderCity":"深圳市",
|
||||
"senderName":"冰凉凉1",
|
||||
"receiverCity":"福州市",
|
||||
"receiverName":"叶丽丽",
|
||||
"s_datetime": "2024-10-24 11:58"
|
||||
},
|
||||
{
|
||||
"express_no": "SF1313131313123",
|
||||
"senderCity":"深圳市",
|
||||
"senderName":"冰凉凉2",
|
||||
"receiverCity":"福州市",
|
||||
"receiverName":"叶丽丽",
|
||||
"s_datetime": "2024-10-24 11:58"
|
||||
},
|
||||
{
|
||||
"express_no": "SF1313131313123",
|
||||
"senderCity":"深圳市",
|
||||
"senderName":"冰凉凉3",
|
||||
"receiverCity":"福州市",
|
||||
"receiverName":"叶丽丽",
|
||||
"s_datetime": "2024-10-24 11:58"
|
||||
},
|
||||
{
|
||||
"express_no": "SF1313131313123",
|
||||
"senderCity":"深圳市",
|
||||
"senderName":"冰凉凉4",
|
||||
"receiverCity":"福州市",
|
||||
"receiverName":"叶丽丽",
|
||||
"s_datetime": "2024-10-24 11:58"
|
||||
}
|
||||
])
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.page {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
background-color: white;
|
||||
line-height: 20px;
|
||||
}
|
||||
.block-view {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.top {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
padding-left: 20px;
|
||||
color: gray;
|
||||
font-size: 12px;
|
||||
}
|
||||
.top-time {
|
||||
margin-left: 120px;
|
||||
}
|
||||
.express-view {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-around;
|
||||
width: 100%;
|
||||
}
|
||||
.express-no-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.logo {
|
||||
width: 40px;
|
||||
height: 10px;
|
||||
}
|
||||
.city {
|
||||
font-size: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.user {
|
||||
color: gray;
|
||||
}
|
||||
.sign {
|
||||
color: red;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.express-icon-view {
|
||||
width: 10%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
}
|
||||
.line-view {
|
||||
height: 0.5px;
|
||||
width: 95%;
|
||||
background-color: lightgray;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,19 @@
|
||||
import request from "@/utils/request";
|
||||
|
||||
|
||||
export const expressListService = (params) => {
|
||||
return request.get('/express', {params})
|
||||
}
|
||||
|
||||
export const expressAddService = (expressData) => {
|
||||
return request.post('/express', expressData)
|
||||
}
|
||||
|
||||
export const expressUpdateService = (expressData) => {
|
||||
return request.put('/express', expressData)
|
||||
}
|
||||
|
||||
export const expressDeleteService = (id) => {
|
||||
return request.delete('/express?id=' + id)
|
||||
}
|
||||
|
Loading…
Reference in new issue