From 6e59e8be453dc2f6e5240a3389b11484de689356 Mon Sep 17 00:00:00 2001 From: ZhangAo Date: Thu, 18 Dec 2025 17:28:06 +0800 Subject: [PATCH] u --- .../identity/model/dto/AuthRegisterDTO.java | 10 +- .../identity/service/AuthIdentityService.java | 15 +- .../base/controller/FileController.java | 7 +- .../java/cn/link56/base/model/po/FilePO.java | 2 +- .../cn/link56/base/service/FileService.java | 7 +- .../common/interceptor/AuthInterceptor.java | 8 +- .../company/controller/CompanyController.java | 24 +- .../controller/CompanyUserController.java | 39 ++ .../company/model/dto/AddCompanyUserDTO.java | 26 ++ ...geCompanyDTO.java => QueryCompanyDTO.java} | 2 +- .../model/dto/QueryCompanyUserDTO.java | 23 ++ .../company/model/dto/UpdateCompanyDTO.java | 34 ++ .../model/dto/UpdateCompanyUserDTO.java | 28 ++ .../cn/link56/company/model/po/CompanyPO.java | 4 + .../company/model/po/CompanyUserPO.java | 3 + .../company/model/vo/CompanyDetailVO.java | 2 + .../company/model/vo/QueryCompanyUserVO.java | 21 + ...PageCompanyVO.java => QueryCompanyVO.java} | 2 +- .../company/service/CompanyService.java | 108 ++++- .../company/service/CompanyUserService.java | 170 ++++++++ .../src/components/SvgIcon.vue | 39 +- .../src/components/anchor-menu/index.vue | 28 ++ .../src/components/anchor-menu/type.ts | 6 + .../src/components/wang-editor/index.vue | 105 ++++- .../wang-editor/modules/directory.vue | 176 -------- .../src/layout/components/header.vue | 2 + code/link56/link56-frontend-new/src/main.ts | 5 +- .../src/request/api/company/index.ts | 8 +- .../src/request/api/company/user.ts | 6 + .../link56-frontend-new/src/router/index.ts | 4 + .../src/types/auth/index.ts | 8 +- .../src/types/auto-import.d.ts | 2 + .../src/types/company/index.ts | 16 +- .../src/types/company/user.ts | 21 + .../auth/register/components/CompanyForm.vue | 20 +- .../auth/register/components/ConfirmForm.vue | 8 +- .../src/views/auth/register/index.vue | 4 +- .../src/views/company/detail/index.vue | 59 ++- .../src/views/company/index.vue | 7 +- .../src/views/settings/index.vue | 2 +- .../src/views/settings/info/company.vue | 376 ++++++++++++------ .../src/views/settings/info/user.vue | 249 ++++++++++++ 42 files changed, 1256 insertions(+), 430 deletions(-) create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyUserController.java create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/AddCompanyUserDTO.java rename code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/{PageCompanyDTO.java => QueryCompanyDTO.java} (91%) create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyUserDTO.java create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyDTO.java create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyUserDTO.java create mode 100644 code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyUserVO.java rename code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/{PageCompanyVO.java => QueryCompanyVO.java} (94%) create mode 100644 code/link56/link56-frontend-new/src/components/anchor-menu/index.vue create mode 100644 code/link56/link56-frontend-new/src/components/anchor-menu/type.ts delete mode 100644 code/link56/link56-frontend-new/src/components/wang-editor/modules/directory.vue create mode 100644 code/link56/link56-frontend-new/src/request/api/company/user.ts create mode 100644 code/link56/link56-frontend-new/src/types/company/user.ts create mode 100644 code/link56/link56-frontend-new/src/views/settings/info/user.vue diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthRegisterDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthRegisterDTO.java index 4c2ee87c..5ba78b5e 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthRegisterDTO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthRegisterDTO.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; @Data @AllArgsConstructor @@ -20,10 +22,10 @@ public class AuthRegisterDTO { public static class Company { @NotBlank(message = "公司名称不能为空") private String name; - @NotBlank(message = "所属行业不能为空") - private String industry; - @NotBlank(message = "公司地址不能为空") - private String area; + @NotEmpty(message = "所属行业不能为空") + private List industries; + @NotEmpty(message = "公司地址不能为空") + private List areas; private String phone; private String email; private String profile; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java index 6eaadaef..10819289 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java @@ -43,6 +43,10 @@ public class AuthIdentityService { } if(StringUtils.isNotBlank(company.getPhone()) && companyService.isPhoneExists(company.getPhone())){ + throw new BusinessException("公司联系方式已被注册"); + } + + if(StringUtils.isNotBlank(company.getEmail()) && companyService.isEmailExists(company.getEmail())){ throw new BusinessException("公司邮箱已被注册"); } @@ -60,8 +64,8 @@ public class AuthIdentityService { new CompanyPO() .setId(companyId) .setName(company.getName()) - .setIndustry(company.getIndustry()) - .setArea(company.getArea()) + .setIndustry(StringUtils.join(company.getIndustries(),",")) + .setArea(StringUtils.join(company.getAreas(),",")) .setPhone(company.getPhone()) .setEmail(company.getEmail()) .setProfile(company.getProfile()) @@ -116,7 +120,12 @@ public class AuthIdentityService { */ private AuthLoginVO buildLoginVO(CompanyUserPO user) { CompanyPO company = companyService.getById(user.getCompanyId()); - AuthToken authToken = tokenService.generateToken(new TokenPayload(user.getCompanyId(), user.getId())); + + TokenPayload tokenPayload = new TokenPayload(); + tokenPayload.setCompanyId(user.getCompanyId()); + tokenPayload.setUserId(user.getId()); + + AuthToken authToken = tokenService.generateToken(tokenPayload); return new AuthLoginVO( company.getId(), diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/controller/FileController.java b/code/link56/link56-backend/src/main/java/cn/link56/base/controller/FileController.java index d6d24d1a..26f7f72f 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/controller/FileController.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/controller/FileController.java @@ -7,10 +7,7 @@ import cn.link56.common.Result; import cn.link56.common.utils.HttpUtils; import cn.link56.common.utils.JsonUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -20,7 +17,7 @@ public class FileController { @Resource private FileService fileService; - @PostMapping("/getAliyunKey") + @GetMapping("/getAliyunKey") public Result getAliyunKey() { String requestUrl = "http://g3oss.g3soft.cn:8082/upload?orgid=link56&bucket=g3hdzjsj"; String s = HttpUtils.sendGet(requestUrl); diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/model/po/FilePO.java b/code/link56/link56-backend/src/main/java/cn/link56/base/model/po/FilePO.java index bd530ff8..9a5fbbd2 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/model/po/FilePO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/model/po/FilePO.java @@ -13,7 +13,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class FilePO { @TableId(value = "b_id") - private String id; + private Long id; @TableField("mx_filename") private String name; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/service/FileService.java b/code/link56/link56-backend/src/main/java/cn/link56/base/service/FileService.java index 138377bb..9564767d 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/service/FileService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/service/FileService.java @@ -3,6 +3,7 @@ package cn.link56.base.service; import cn.link56.base.mapper.FileMapper; import cn.link56.base.model.dto.AddFileDTO; import cn.link56.base.model.po.FilePO; +import cn.link56.common.utils.snowflake.idgen.IdGenerator; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -30,7 +31,11 @@ public class FileService extends ServiceImpl { } FilePO filePO = new FilePO(); - filePO.setExt(suffix).setName(fileName).setMapName(fileMapName).setSize(fileSize); + filePO.setId(IdGenerator.nextId()) + .setExt(suffix) + .setName(fileName) + .setMapName(fileMapName) + .setSize(fileSize); fileMapper.insert(filePO); } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/interceptor/AuthInterceptor.java b/code/link56/link56-backend/src/main/java/cn/link56/common/interceptor/AuthInterceptor.java index 35677986..f5b9bc54 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/interceptor/AuthInterceptor.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/interceptor/AuthInterceptor.java @@ -30,8 +30,6 @@ public class AuthInterceptor implements HandlerInterceptor { if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { return true; } - System.out.println(request.getRequestURI()); - System.out.println(request.getRequestURL()); try { String token = request.getHeader("Authorization"); @@ -39,6 +37,12 @@ public class AuthInterceptor implements HandlerInterceptor { return writeUnauthorized(response); } + if (token.startsWith("Bearer ")) { + token = token.substring(7); + }else{ + return writeUnauthorized(response); + } + boolean flag = authTokenService.validateToken(token); if (!flag){ diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyController.java b/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyController.java index e6fa1546..68431451 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyController.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyController.java @@ -2,17 +2,19 @@ package cn.link56.company.controller; import cn.link56.common.BasePageVO; import cn.link56.common.Result; -import cn.link56.company.model.dto.PageCompanyDTO; +import cn.link56.company.model.dto.QueryCompanyDTO; +import cn.link56.company.model.dto.UpdateCompanyDTO; import cn.link56.company.model.vo.CompanyDetailVO; -import cn.link56.company.model.vo.PageCompanyVO; +import cn.link56.company.model.vo.QueryCompanyVO; import cn.link56.company.model.vo.RecommendCompanyVO; import cn.link56.company.model.vo.RecommendHotCompanyVO; import cn.link56.company.service.CompanyService; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; import java.util.List; @RestController @@ -23,8 +25,8 @@ public class CompanyController { // 公司分页 @PostMapping("/query") - public Result> query(@RequestBody PageCompanyDTO pageCompanyDTO){ - BasePageVO data = companyService.queryCompany(pageCompanyDTO); + public Result> query(@RequestBody QueryCompanyDTO queryCompanyDTO){ + BasePageVO data = companyService.queryCompany(queryCompanyDTO); return Result.success(data); } @@ -44,9 +46,19 @@ public class CompanyController { // 公司详细 @GetMapping("/detail/{id}") - public Result getCompanyDetail(@PathVariable Long id){ + public Result getCompanyDetail(@PathVariable + @NotNull(message = "公司ID不能为空") + @Positive(message = "公司ID不能为空") + Long id){ CompanyDetailVO companyDetailVO = companyService.getCompanyDetail(id); return Result.success(companyDetailVO); } + // 更新 + @PostMapping("/update") + public Result updateDetail(@RequestBody @Validated UpdateCompanyDTO updateCompanyDTO){ + companyService.updateDetail(updateCompanyDTO); + return Result.success(); + } + } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyUserController.java b/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyUserController.java new file mode 100644 index 00000000..c0ab58d5 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/controller/CompanyUserController.java @@ -0,0 +1,39 @@ +package cn.link56.company.controller; + +import cn.link56.common.BasePageVO; +import cn.link56.common.Result; +import cn.link56.company.model.dto.AddCompanyUserDTO; +import cn.link56.company.model.dto.QueryCompanyUserDTO; +import cn.link56.company.model.dto.UpdateCompanyUserDTO; +import cn.link56.company.model.vo.QueryCompanyUserVO; +import cn.link56.company.service.CompanyUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/company/user") +public class CompanyUserController { + @Resource + private CompanyUserService companyUserService; + + @PostMapping("/query") + public Result> getUsersByCompanyId(@RequestBody QueryCompanyUserDTO queryCompanyUserDTO) { + BasePageVO result = companyUserService.getUsersByCompanyId(queryCompanyUserDTO); + return Result.success(result); + } + + @PostMapping("/add") + public Result addCompanyUser(@RequestBody @Validated AddCompanyUserDTO companyUserDTO){ + companyUserService.addCompanyUser(companyUserDTO); + return Result.success(); + } + + @PostMapping("/update") + public Result updateCompanyUser(@RequestBody @Validated UpdateCompanyUserDTO companyUserDTO){ + companyUserService.updateCompanyUser(companyUserDTO); + return Result.success(); + } +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/AddCompanyUserDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/AddCompanyUserDTO.java new file mode 100644 index 00000000..55f297ae --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/AddCompanyUserDTO.java @@ -0,0 +1,26 @@ +package cn.link56.company.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddCompanyUserDTO { + @NotNull(message = "公司不能为空") + private Long companyId; + + @NotBlank(message = "邮箱不能为空") + private String email; + @NotBlank(message = "密码不能为空") + private String password; + + private String position; + private String name; + private String phone; + private String canuse; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/PageCompanyDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyDTO.java similarity index 91% rename from code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/PageCompanyDTO.java rename to code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyDTO.java index ed88d031..3fec1802 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/PageCompanyDTO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyDTO.java @@ -9,7 +9,7 @@ import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor -public class PageCompanyDTO { +public class QueryCompanyDTO { private Integer currentPage; private Integer pageSize; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyUserDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyUserDTO.java new file mode 100644 index 00000000..9d084895 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/QueryCompanyUserDTO.java @@ -0,0 +1,23 @@ +package cn.link56.company.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class QueryCompanyUserDTO { + private Integer currentPage; + private Integer pageSize; + + @NotNull(message = "公司ID不能为空") + private Long companyId; + private String name; + private String position; + private String email; + private String phone; + private String canuse; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyDTO.java new file mode 100644 index 00000000..8f8ed11c --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyDTO.java @@ -0,0 +1,34 @@ +package cn.link56.company.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpdateCompanyDTO { + @NotNull(message = "公司ID不能为空") + private Long id; + @NotBlank(message = "公司名称不能为空") + private String name; + @NotEmpty(message = "所属行业不能为空") + private List industries; + @NotEmpty(message = "公司地址不能为空") + private List areas; + + private Date establishmentDate; + + private String logo; + private String phone; + private String email; + private String profile; + + private String description; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyUserDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyUserDTO.java new file mode 100644 index 00000000..47a69320 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/dto/UpdateCompanyUserDTO.java @@ -0,0 +1,28 @@ +package cn.link56.company.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpdateCompanyUserDTO { + @NotNull(message = "用户不能为空") + private Long id; + @NotNull(message = "公司不能为空") + private Long companyId; + + @NotBlank(message = "邮箱不能为空") + private String email; + @NotBlank(message = "密码不能为空") + private String password; + + private String position; + private String name; + private String phone; + private String canuse; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyPO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyPO.java index 4767a90e..b3d7c267 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyPO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyPO.java @@ -64,4 +64,8 @@ public class CompanyPO { @TableField("b_hot_recommend") private String hotRecommend; + + @TableField("b_establishment_date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date establishmentDate; } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyUserPO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyUserPO.java index 5f98d9e4..e568dfe9 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyUserPO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/po/CompanyUserPO.java @@ -42,6 +42,9 @@ public class CompanyUserPO { @TableField("b_position") private String position; + @TableField("b_canuse") + private String canuse; + @TableField(value = "b_create_time",fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/CompanyDetailVO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/CompanyDetailVO.java index 8d57ae25..45236ef9 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/CompanyDetailVO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/CompanyDetailVO.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; import java.util.List; @Data @@ -19,6 +20,7 @@ public class CompanyDetailVO { private String email; private String phone; private String description; + private Date establishmentDate; private List users; @Data diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyUserVO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyUserVO.java new file mode 100644 index 00000000..2ce315eb --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyUserVO.java @@ -0,0 +1,21 @@ +package cn.link56.company.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class QueryCompanyUserVO { + private Long id; + + private String name; + private Integer role; + private String position; + + private String email; + private String phone; + + private String canuse; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/PageCompanyVO.java b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyVO.java similarity index 94% rename from code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/PageCompanyVO.java rename to code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyVO.java index 3e9733a5..1b2db284 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/PageCompanyVO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/model/vo/QueryCompanyVO.java @@ -11,7 +11,7 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) -public class PageCompanyVO { +public class QueryCompanyVO { private Long id; private String name; private List areas; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyService.java b/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyService.java index bd844ac0..7ef71f65 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyService.java @@ -1,26 +1,30 @@ package cn.link56.company.service; import cn.link56.common.BasePageVO; +import cn.link56.common.context.UserContext; +import cn.link56.common.exception.BusinessException; import cn.link56.company.mapper.CompanyMapper; -import cn.link56.company.mapper.CompanyUserMapper; -import cn.link56.company.model.dto.PageCompanyDTO; +import cn.link56.company.model.dto.QueryCompanyDTO; +import cn.link56.company.model.dto.UpdateCompanyDTO; import cn.link56.company.model.middle.RecommendCompanyRow; import cn.link56.company.model.po.CompanyPO; import cn.link56.company.model.po.CompanyUserPO; import cn.link56.company.model.vo.CompanyDetailVO; -import cn.link56.company.model.vo.PageCompanyVO; +import cn.link56.company.model.vo.QueryCompanyVO; import cn.link56.company.model.vo.RecommendCompanyVO; import cn.link56.company.model.vo.RecommendHotCompanyVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Arrays; -import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -99,13 +103,24 @@ public class CompanyService extends ServiceImpl { return count > 0; } - public BasePageVO queryCompany(PageCompanyDTO pageCompanyDTO) { - Integer currentPage = pageCompanyDTO.getCurrentPage(); - Integer pageSize = pageCompanyDTO.getPageSize(); + /** + * 检查公司邮箱是否重复 + */ + public boolean isEmailExists(String email) { + Long count = companyMapper.selectCount( + new LambdaQueryWrapper() + .eq(CompanyPO::getEmail, email) + ); + return count > 0; + } - String name = pageCompanyDTO.getName(); - List areas = pageCompanyDTO.getAreas(); - List industries = pageCompanyDTO.getIndustries(); + public BasePageVO queryCompany(QueryCompanyDTO queryCompanyDTO) { + Integer currentPage = queryCompanyDTO.getCurrentPage(); + Integer pageSize = queryCompanyDTO.getPageSize(); + + String name = queryCompanyDTO.getName(); + List areas = queryCompanyDTO.getAreas(); + List industries = queryCompanyDTO.getIndustries(); // 分页 Page companyPage = new Page<>(currentPage,pageSize); @@ -136,23 +151,23 @@ public class CompanyService extends ServiceImpl { queryWrapper.eq(CompanyPO::getCanuse,"1"); - List result = companyMapper.selectList(companyPage, queryWrapper).stream().map(item -> { - PageCompanyVO pageCompanyVO = new PageCompanyVO(); + List result = companyMapper.selectList(companyPage, queryWrapper).stream().map(item -> { + QueryCompanyVO queryCompanyVO = new QueryCompanyVO(); - pageCompanyVO.setId(item.getId()); - pageCompanyVO.setName(item.getName()); - pageCompanyVO.setProfile(item.getProfile()); - pageCompanyVO.setLogo(item.getLogo()); - pageCompanyVO.setAreas(Arrays.stream(item.getArea().split(",")) + queryCompanyVO.setId(item.getId()); + queryCompanyVO.setName(item.getName()); + queryCompanyVO.setProfile(item.getProfile()); + queryCompanyVO.setLogo(item.getLogo()); + queryCompanyVO.setAreas(Arrays.stream(item.getArea().split(",")) .collect(Collectors.toList())); - pageCompanyVO.setIndustries(Arrays.stream(item.getIndustry().split(",")) + queryCompanyVO.setIndustries(Arrays.stream(item.getIndustry().split(",")) .collect(Collectors.toList())); - return pageCompanyVO; + return queryCompanyVO; }).collect(Collectors.toList()); - return new BasePageVO() + return new BasePageVO() .setRecords(result) .setTotal(companyPage.getTotal()); } @@ -172,11 +187,62 @@ public class CompanyService extends ServiceImpl { companyDetailVO.setUsers(companyUserPOS.stream() .map(item -> { CompanyDetailVO.User user = new CompanyDetailVO.User(); - BeanUtils.copyProperties(item, user); // 复制属性 + BeanUtils.copyProperties(item, user); return user; }) .collect(Collectors.toList())); return companyDetailVO; } + + @Transactional + public void updateDetail(UpdateCompanyDTO updateCompanyDTO) { + Long id = updateCompanyDTO.getId(); + + if (!companyUserService.hasPermission(id,UserContext.getUserId())){ + throw new BusinessException("您没有权限访问该公司的信息,操作被拒绝"); + } + + String name = updateCompanyDTO.getName(); + String phone = updateCompanyDTO.getPhone(); + String email = updateCompanyDTO.getEmail(); + Date establishmentDate = updateCompanyDTO.getEstablishmentDate(); + String profile = updateCompanyDTO.getProfile(); + String description = updateCompanyDTO.getDescription(); + String logo = updateCompanyDTO.getLogo(); + + String area = StringUtils.join(updateCompanyDTO.getAreas(), ","); + String industry = StringUtils.join(updateCompanyDTO.getIndustries(), ","); + + // 检查 + CompanyPO companyPO = companyMapper.selectById(id); + if (ObjectUtils.isEmpty(companyPO)){ + throw new BusinessException("更新失败,该公司不存在"); + } + + // 检查名称 + if (!companyPO.getName().equals(name) && isNameExists(name)){ + throw new BusinessException("公司名称已存在"); + } + // 检查联系电话 + if (!StringUtils.equals(phone, companyPO.getPhone()) + && isPhoneExists(phone)) { + throw new BusinessException("公司联系电话已存在"); + } + + // 检查邮箱 + if (!StringUtils.equals(email, companyPO.getEmail()) + && isEmailExists(email)) { + throw new BusinessException("公司联系邮箱已存在"); + } + + // 更新 + BeanUtils.copyProperties(updateCompanyDTO,companyPO); + + companyPO.setArea(area); + companyPO.setIndustry(industry); + + // 保存更新后的公司信息 + companyMapper.updateById(companyPO); + } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyUserService.java b/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyUserService.java index 2552e9af..f2ce2d9f 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyUserService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/company/service/CompanyUserService.java @@ -1,13 +1,27 @@ package cn.link56.company.service; +import cn.link56.common.BasePageVO; +import cn.link56.common.context.UserContext; +import cn.link56.common.exception.BusinessException; +import cn.link56.common.utils.snowflake.idgen.IdGenerator; import cn.link56.company.mapper.CompanyUserMapper; +import cn.link56.company.model.dto.AddCompanyUserDTO; +import cn.link56.company.model.dto.QueryCompanyUserDTO; +import cn.link56.company.model.dto.UpdateCompanyUserDTO; import cn.link56.company.model.po.CompanyUserPO; +import cn.link56.company.model.vo.QueryCompanyUserVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; @Service public class CompanyUserService extends ServiceImpl { @@ -21,6 +35,9 @@ public class CompanyUserService extends ServiceImpl() .eq(CompanyUserPO::getEmail, email) @@ -42,6 +59,38 @@ public class CompanyUserService extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CompanyUserPO::getEmail,email) @@ -63,4 +112,125 @@ public class CompanyUserService extends ServiceImpl getUsersByCompanyId(QueryCompanyUserDTO queryCompanyUserDTO) { + boolean hasPermission = hasPermission(queryCompanyUserDTO.getCompanyId(), UserContext.getUserId()); + + if (!hasPermission){ + throw new BusinessException("您没有权限访问该公司的信息,操作被拒绝"); + } + + Integer currentPage = queryCompanyUserDTO.getCurrentPage(); + Integer pageSize = queryCompanyUserDTO.getPageSize(); + + Long companyId = queryCompanyUserDTO.getCompanyId(); + String name = queryCompanyUserDTO.getName(); + String email = queryCompanyUserDTO.getEmail(); + String phone = queryCompanyUserDTO.getPhone(); + String position = queryCompanyUserDTO.getPosition(); + String canuse = queryCompanyUserDTO.getCanuse(); + + Page queryPage = new Page<>(currentPage,pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + queryWrapper.eq(CompanyUserPO::getCompanyId,companyId); + + if (StringUtils.isNotBlank(name)){ + queryWrapper.like(CompanyUserPO::getName,name); + } + + if (StringUtils.isNotBlank(email)){ + queryWrapper.like(CompanyUserPO::getEmail,email); + } + + if (StringUtils.isNotBlank(phone)){ + queryWrapper.like(CompanyUserPO::getPhone,phone); + } + + if (StringUtils.isNotBlank(position)){ + queryWrapper.like(CompanyUserPO::getPosition,position); + } + + if (StringUtils.isNotBlank(canuse)){ + queryWrapper.eq(CompanyUserPO::getCanuse,canuse); + } + + List companyUserPOS = companyUserMapper.selectList(queryPage, queryWrapper); + + List result = companyUserPOS.stream().map(item -> { + QueryCompanyUserVO queryCompanyUserVO = new QueryCompanyUserVO(); + BeanUtils.copyProperties(item, queryCompanyUserVO); + return queryCompanyUserVO; + }).collect(Collectors.toList()); + + return new BasePageVO<>(queryPage.getTotal(),result); + } + + @Transactional + public void addCompanyUser(AddCompanyUserDTO companyUserDTO) { + boolean hasPermission = hasPermission(companyUserDTO.getCompanyId(), UserContext.getUserId()); + + if (!hasPermission){ + throw new BusinessException("您没有权限访问该公司的信息,操作被拒绝"); + } + + String email = companyUserDTO.getEmail(); + String phone = companyUserDTO.getPhone(); + + if(isEmailExists(email)){ + throw new BusinessException("邮箱已被注册"); + } + + if(StringUtils.isNotBlank(phone) && !isPhoneExists(phone)){ + throw new BusinessException("手机号已被注册"); + } + + String canuse = companyUserDTO.getCanuse(); + if (StringUtils.isBlank(canuse) || (!"1".equals(canuse) && !"0".equals(canuse))) { + canuse = "1"; + } + + CompanyUserPO companyUserPO = new CompanyUserPO(); + + BeanUtils.copyProperties(companyUserDTO,companyUserPO); + companyUserPO.setId(IdGenerator.nextId()); + companyUserPO.setRole(1); + companyUserPO.setCanuse(canuse); + + companyUserMapper.insert(companyUserPO); + } + + @Transactional + public void updateCompanyUser(UpdateCompanyUserDTO companyUserDTO) { + Long id = companyUserDTO.getId(); + Long companyId = companyUserDTO.getCompanyId(); + String email = companyUserDTO.getEmail(); + String phone = companyUserDTO.getPhone(); + + boolean hasPermission = hasPermission(companyId, UserContext.getUserId()); + + if (!hasPermission){ + throw new BusinessException("您没有权限访问该公司的信息,操作被拒绝"); + } + + CompanyUserPO companyUserPO = companyUserMapper.selectById(id); + if (ObjectUtils.isEmpty(companyUserPO)){ + throw new BusinessException("更新失败,该用户不存在"); + } + + // 检查邮箱 + if (!StringUtils.equals(email, companyUserPO.getEmail()) + && isEmailExists(email)) { + throw new BusinessException("邮箱已被注册"); + } + // 检查手机号 + if (!StringUtils.equals(phone, companyUserPO.getPhone()) + && isPhoneExists(phone)) { + throw new BusinessException("手机号已被注册"); + } + + BeanUtils.copyProperties(companyUserDTO,companyUserPO); + + companyUserMapper.updateById(companyUserPO); + } } diff --git a/code/link56/link56-frontend-new/src/components/SvgIcon.vue b/code/link56/link56-frontend-new/src/components/SvgIcon.vue index 58fb2668..b6f21320 100644 --- a/code/link56/link56-frontend-new/src/components/SvgIcon.vue +++ b/code/link56/link56-frontend-new/src/components/SvgIcon.vue @@ -5,43 +5,20 @@ import { computed, useAttrs } from 'vue' interface Props { /** 图标名称 */ icon?: string - /** 图标颜色 */ - color?: string - /** 图标大小(px) */ - fontSize?: number | string + /** 图标大小 */ + size?: string | number } const props = defineProps() + const attrs = useAttrs() -const bindAttrs = computed(() => { - const style: Record = {} - - if (props.color) { - style.color = props.color - } - - if (props.fontSize) { - style.fontSize - = typeof props.fontSize === 'number' - ? `${props.fontSize}px` - : props.fontSize - } - - return { - ...attrs, - style: { - ...(attrs.style as Record), - ...style, - }, - } -}) +const bindAttrs = computed<{ class: string, style: string }>(() => ({ + class: (attrs.class as string) || '', + style: (attrs.style as string) || '', +})) diff --git a/code/link56/link56-frontend-new/src/components/anchor-menu/index.vue b/code/link56/link56-frontend-new/src/components/anchor-menu/index.vue new file mode 100644 index 00000000..2fa9ed9d --- /dev/null +++ b/code/link56/link56-frontend-new/src/components/anchor-menu/index.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/code/link56/link56-frontend-new/src/components/anchor-menu/type.ts b/code/link56/link56-frontend-new/src/components/anchor-menu/type.ts new file mode 100644 index 00000000..3c0738a2 --- /dev/null +++ b/code/link56/link56-frontend-new/src/components/anchor-menu/type.ts @@ -0,0 +1,6 @@ +export interface AnchorMenuItem { + label: string + href: string + level?: number + children: AnchorMenuItem[] +} diff --git a/code/link56/link56-frontend-new/src/components/wang-editor/index.vue b/code/link56/link56-frontend-new/src/components/wang-editor/index.vue index de804d3a..f1462dea 100644 --- a/code/link56/link56-frontend-new/src/components/wang-editor/index.vue +++ b/code/link56/link56-frontend-new/src/components/wang-editor/index.vue @@ -1,11 +1,11 @@ @@ -168,9 +263,11 @@ function handleCreated(editor: any) { display: flex; width: 100%; height: 100%; + .directory { width: 200px; - height: 450px; + height: 100%; + margin-left: 16px; } .main { min-width: 0; diff --git a/code/link56/link56-frontend-new/src/components/wang-editor/modules/directory.vue b/code/link56/link56-frontend-new/src/components/wang-editor/modules/directory.vue deleted file mode 100644 index 337ed168..00000000 --- a/code/link56/link56-frontend-new/src/components/wang-editor/modules/directory.vue +++ /dev/null @@ -1,176 +0,0 @@ - - - - - diff --git a/code/link56/link56-frontend-new/src/layout/components/header.vue b/code/link56/link56-frontend-new/src/layout/components/header.vue index 6745c1da..b6f5566d 100644 --- a/code/link56/link56-frontend-new/src/layout/components/header.vue +++ b/code/link56/link56-frontend-new/src/layout/components/header.vue @@ -24,6 +24,8 @@ function navigateTo(path: string) { function exitLogin() { userStore.clearUserInfo() + + router.push('/auth/login') } function isActive(path: string) { diff --git a/code/link56/link56-frontend-new/src/main.ts b/code/link56/link56-frontend-new/src/main.ts index e2ce1d51..b30a80bf 100644 --- a/code/link56/link56-frontend-new/src/main.ts +++ b/code/link56/link56-frontend-new/src/main.ts @@ -1,4 +1,5 @@ import ElementPlus from 'element-plus' +import zhCn from 'element-plus/es/locale/lang/zh-cn' import { createApp } from 'vue' import App from './App.vue' import { setupRouter } from './router/index' @@ -11,7 +12,9 @@ async function setupApp() { setupPinia(app) setupRouter(app) - app.use(ElementPlus) + app.use(ElementPlus, { + locale: zhCn, + }) app.mount('#app') } diff --git a/code/link56/link56-frontend-new/src/request/api/company/index.ts b/code/link56/link56-frontend-new/src/request/api/company/index.ts index a2544f39..42d79341 100644 --- a/code/link56/link56-frontend-new/src/request/api/company/index.ts +++ b/code/link56/link56-frontend-new/src/request/api/company/index.ts @@ -1,4 +1,4 @@ -import type { CompanyDetail, CompanyListItem, QueryCompanyParams, RecommendCompany, RecommendHotCompany } from '@/types/company' +import type { Company, CompanyDetail, QueryCompanyParams, RecommendCompany, RecommendHotCompany, UpdateCompanyParams } from '@/types/company' import { httpGet, httpPostJson } from '@/request/utils' export function getRecommendCompanyApi() { @@ -10,9 +10,13 @@ export function getRecommendHotCompanyApi() { } export function queryCompanyApi(params: QueryCompanyParams) { - return httpPostJson>('/company/query', params) + return httpPostJson>('/company/query', params) } export function getCompanyDetailApi(id: number) { return httpGet(`/company/detail/${id}`) } + +export function updateCompanyApi(params: UpdateCompanyParams) { + return httpPostJson(`/company/update`, params) +} diff --git a/code/link56/link56-frontend-new/src/request/api/company/user.ts b/code/link56/link56-frontend-new/src/request/api/company/user.ts new file mode 100644 index 00000000..5fd205d5 --- /dev/null +++ b/code/link56/link56-frontend-new/src/request/api/company/user.ts @@ -0,0 +1,6 @@ +import type { CompanyUser, QueryCompanyUserParams } from '@/types/company/user' +import { httpGet, httpPostJson } from '@/request/utils' + +export function queryCompanyUserApi(params: QueryCompanyUserParams) { + return httpPostJson>('/company/user/query', params) +} diff --git a/code/link56/link56-frontend-new/src/router/index.ts b/code/link56/link56-frontend-new/src/router/index.ts index be2e5a21..0c187dba 100644 --- a/code/link56/link56-frontend-new/src/router/index.ts +++ b/code/link56/link56-frontend-new/src/router/index.ts @@ -30,6 +30,10 @@ const router = createRouter({ path: '/settings/info/company', component: () => import('@/views/settings/info/company.vue'), }, + { + path: '/settings/info/user', + component: () => import('@/views/settings/info/user.vue'), + }, ], }, ], diff --git a/code/link56/link56-frontend-new/src/types/auth/index.ts b/code/link56/link56-frontend-new/src/types/auth/index.ts index 5c73d646..91f4c06d 100644 --- a/code/link56/link56-frontend-new/src/types/auth/index.ts +++ b/code/link56/link56-frontend-new/src/types/auth/index.ts @@ -23,8 +23,8 @@ export interface LoginApiResult { export interface RegisterCompanyForm { name: string - industry: string[] - address: string[] + industries: string[] + areas: string[] phone: string email: string profile: string @@ -45,8 +45,8 @@ export interface RegisterAdminForm { export interface RegisterApiParams { company: { name: string - industry: string - address: string + industries: string[] + areas: string[] phone: string email: string profile: string diff --git a/code/link56/link56-frontend-new/src/types/auto-import.d.ts b/code/link56/link56-frontend-new/src/types/auto-import.d.ts index 71a1926d..67fe5ab3 100644 --- a/code/link56/link56-frontend-new/src/types/auto-import.d.ts +++ b/code/link56/link56-frontend-new/src/types/auto-import.d.ts @@ -11,6 +11,7 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AnchorMenu: typeof import('./../components/anchor-menu/index.vue')['default'] AreaSelect: typeof import('./../components/AreaSelect.vue')['default'] Directory: typeof import('./../components/wang-editor/modules/directory.vue')['default'] HelloWorld: typeof import('./../components/HelloWorld.vue')['default'] @@ -22,6 +23,7 @@ declare module 'vue' { 'IHugeicons:home03': typeof import('~icons/hugeicons/home03')['default'] 'IHugeicons:materialAndTexture': typeof import('~icons/hugeicons/material-and-texture')['default'] 'IHugeicons:setting07': typeof import('~icons/hugeicons/setting07')['default'] + 'IHugeicons:upload01': typeof import('~icons/hugeicons/upload01')['default'] 'IHugeicons:userSettings01': typeof import('~icons/hugeicons/user-settings01')['default'] 'IIc:outlineSettings': typeof import('~icons/ic/outline-settings')['default'] 'IIc:twotoneHeadphones': typeof import('~icons/ic/twotone-headphones')['default'] diff --git a/code/link56/link56-frontend-new/src/types/company/index.ts b/code/link56/link56-frontend-new/src/types/company/index.ts index 729dddc3..e3c80dbb 100644 --- a/code/link56/link56-frontend-new/src/types/company/index.ts +++ b/code/link56/link56-frontend-new/src/types/company/index.ts @@ -22,7 +22,7 @@ export interface QueryCompanyParams { name: string } -export interface CompanyListItem { +export interface Company { id: number name: string areas: string[] @@ -43,6 +43,7 @@ export interface CompanyDetail { phone: string email: string description: string + establishmentDate: string users: { id: number companyId: number @@ -53,3 +54,16 @@ export interface CompanyDetail { name: string }[] } + +export interface UpdateCompanyParams { + id: number + name: string + areas: string[] + industries: string[] + establishmentDate: string + profile: string + phone: string + email: string + description: string + logo: string +} diff --git a/code/link56/link56-frontend-new/src/types/company/user.ts b/code/link56/link56-frontend-new/src/types/company/user.ts new file mode 100644 index 00000000..7dbe50b6 --- /dev/null +++ b/code/link56/link56-frontend-new/src/types/company/user.ts @@ -0,0 +1,21 @@ +export interface QueryCompanyUserParams { + currentPage: number + pageSize: number + + companyId: number + name: string + position: string + email: string + phone: string + canuse: string +} + +export interface CompanyUser { + id: number + role: number + name: string + position: string + email: string + phone: string + canuse: string +} diff --git a/code/link56/link56-frontend-new/src/views/auth/register/components/CompanyForm.vue b/code/link56/link56-frontend-new/src/views/auth/register/components/CompanyForm.vue index 39fef18d..ce503b52 100644 --- a/code/link56/link56-frontend-new/src/views/auth/register/components/CompanyForm.vue +++ b/code/link56/link56-frontend-new/src/views/auth/register/components/CompanyForm.vue @@ -1,7 +1,7 @@