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;
|
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 lombok.Data;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class Express {
|
public class Express {
|
||||||
|
@NotNull
|
||||||
|
private Integer id;
|
||||||
|
@NotNull
|
||||||
private String expressid;
|
private String expressid;
|
||||||
|
@NotEmpty
|
||||||
private String sename;
|
private String sename;
|
||||||
|
@NotEmpty
|
||||||
private String sephone;
|
private String sephone;
|
||||||
|
@NotEmpty
|
||||||
private String seaddress;
|
private String seaddress;
|
||||||
|
@NotEmpty
|
||||||
private String rename;
|
private String rename;
|
||||||
|
@NotEmpty
|
||||||
private String rephone;
|
private String rephone;
|
||||||
|
@NotEmpty
|
||||||
private String readdress;
|
private String readdress;
|
||||||
private Integer issigned;
|
@State
|
||||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy年MM月dd日")
|
private String issigned;
|
||||||
private Date signtime;
|
@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;
|
package com.backend.service;
|
||||||
|
|
||||||
import com.backend.pojo.Express;
|
import com.backend.pojo.Express;
|
||||||
|
import com.backend.pojo.PageBean;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
public interface ExpressService {
|
public interface ExpressService {
|
||||||
Express findExpressById(final String expressId);
|
|
||||||
|
|
||||||
void insert(final String expressId,
|
void add(final Express express);
|
||||||
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 update(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>
|
<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>
|
</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>
|
</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