Przeglądaj źródła

1.DiskShare 中添加一个 albumType 字段, 其值为 AlbumType 枚举中的一个
2.扩展 DiskShare 功能, 添加对 cam 的分享
3.cam 相关的接口中增加了对 cam owner 的检测

reghao 6 miesięcy temu
rodzic
commit
b50f562099

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskShareController.java

@@ -33,8 +33,8 @@ public class DiskShareController {
     @Operation(summary = "创建分享", description = "N")
     @Operation(summary = "创建分享", description = "N")
     @PostMapping("/create")
     @PostMapping("/create")
     public String createShare(@RequestBody @Validated ShareCreate shareCreate) {
     public String createShare(@RequestBody @Validated ShareCreate shareCreate) {
-        diskShareService.createShare(shareCreate);
-        return WebResult.success();
+        Result result = diskShareService.createShare(shareCreate);
+        return WebResult.result(result);
     }
     }
 
 
     @Operation(summary = "删除分享", description = "N")
     @Operation(summary = "删除分享", description = "N")

+ 2 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/CamDeviceMapper.java

@@ -18,4 +18,6 @@ public interface CamDeviceMapper extends BaseMapper<CamDevice> {
     int countByCamDeviceQuery(CamDeviceQuery camDeviceQuery);
     int countByCamDeviceQuery(CamDeviceQuery camDeviceQuery);
     List<CamDevice> findCamDeviceQueryByPage(@Param("page") Page page,
     List<CamDevice> findCamDeviceQueryByPage(@Param("page") Page page,
                                              @Param("camDeviceQuery") CamDeviceQuery camDeviceQuery);
                                              @Param("camDeviceQuery") CamDeviceQuery camDeviceQuery);
+
+    List<CamDevice> findByCamIds(List<Long> list);
 }
 }

+ 1 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskShareMapper.java

@@ -25,5 +25,5 @@ public interface DiskShareMapper extends BaseMapper<DiskShare> {
 
 
     int countDiskShareTo(long shareId);
     int countDiskShareTo(long shareId);
     List<Long> findDiskShareToList(@Param("shareId") long shareId);
     List<Long> findDiskShareToList(@Param("shareId") long shareId);
-    List<DiskShare> findDiskShareList(@Param("shareTo") long shareTo);
+    List<DiskShare> findDiskShareList(@Param("albumType") int albumType, @Param("shareTo") long shareTo);
 }
 }

+ 37 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/repository/DiskCamRepository.java

@@ -0,0 +1,37 @@
+package cn.reghao.tnb.content.app.disk.db.repository;
+
+import cn.reghao.jutil.jdk.db.Page;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.disk.db.mapper.CamDeviceMapper;
+import cn.reghao.tnb.content.app.disk.db.mapper.CamRecordMapper;
+import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
+import cn.reghao.tnb.content.app.disk.model.query.CamDeviceQuery;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-06 16:17:50
+ */
+@Repository
+public class DiskCamRepository {
+    private CamDeviceMapper camDeviceMapper;
+    private CamRecordMapper camRecordMapper;
+
+    public DiskCamRepository(CamDeviceMapper camDeviceMapper, CamRecordMapper camRecordMapper) {
+        this.camDeviceMapper = camDeviceMapper;
+        this.camRecordMapper = camRecordMapper;
+    }
+
+    public CamDevice getCamDevice(long camId, long createBy) {
+        long loginUser = UserContext.getUserId();
+        CamDeviceQuery camDeviceQuery = new CamDeviceQuery.Builder()
+                .addBy(loginUser)
+                .camId(camId)
+                .build();
+        Page page = new Page(1, 1);
+        List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
+        return camDeviceList.isEmpty() ? null : camDeviceList.get(0);
+    }
+}

+ 34 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/constant/AlbumType.java

@@ -0,0 +1,34 @@
+package cn.reghao.tnb.content.app.disk.model.constant;
+
+/**
+ * @author reghao
+ * @date 2025-09-06 16:11:57
+ */
+public enum AlbumType {
+    // 摄像头合集
+    cam(1),
+    // 图片合集
+    image(2),
+    // 视频合集
+    video(3);
+
+    private final int value;
+    AlbumType(int value) {
+        this.value = value;
+    }
+
+    public String getName() {
+        return this.name();
+    }
+
+    /**
+     * 提供给 @ValidEnum 调用
+     *
+     * @param
+     * @return
+     * @date 2025-09-06 16:09:449
+     */
+    public int getValue() {
+        return value;
+    }
+}

+ 4 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/ShareCreate.java

@@ -1,5 +1,7 @@
 package cn.reghao.tnb.content.app.disk.model.dto;
 package cn.reghao.tnb.content.app.disk.model.dto;
 
 
+import cn.reghao.jutil.validator.ValidEnum;
+import cn.reghao.tnb.content.app.disk.model.constant.AlbumType;
 import lombok.Getter;
 import lombok.Getter;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
@@ -14,6 +16,8 @@ import java.util.List;
 public class ShareCreate {
 public class ShareCreate {
     @NotNull
     @NotNull
     private Long albumId;
     private Long albumId;
+    @ValidEnum(value = AlbumType.class, message = "合集类型不正确")
+    private Integer albumType;
     @NotNull
     @NotNull
     @Size(min = 1, max = 10, message = "最多可分享给 10 位用户")
     @Size(min = 1, max = 10, message = "最多可分享给 10 位用户")
     private List<String> shareToList;
     private List<String> shareToList;

+ 2 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/po/DiskShare.java

@@ -18,12 +18,14 @@ import lombok.Setter;
 @Getter
 @Getter
 public class DiskShare extends BaseObject<Integer> {
 public class DiskShare extends BaseObject<Integer> {
     private Long shareId;
     private Long shareId;
+    private Integer albumType;
     private Long albumId;
     private Long albumId;
     private Long createAt;
     private Long createAt;
     private Long createBy;
     private Long createBy;
 
 
     public DiskShare(long shareId, ShareCreate shareCreate) {
     public DiskShare(long shareId, ShareCreate shareCreate) {
         this.shareId = shareId;
         this.shareId = shareId;
+        this.albumType = shareCreate.getAlbumType();
         this.albumId = shareCreate.getAlbumId();
         this.albumId = shareCreate.getAlbumId();
         this.createAt = System.currentTimeMillis();
         this.createAt = System.currentTimeMillis();
         this.createBy = UserContext.getUserId();
         this.createBy = UserContext.getUserId();

+ 64 - 10
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/CamRecordService.java

@@ -4,21 +4,26 @@ import cn.reghao.file.api.iface.OssService;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.jutil.tool.id.SnowFlake;
+import cn.reghao.jutil.jdk.result.ResultStatus;
 import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
 import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
+import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamDeviceMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamDeviceMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamRecordMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamRecordMapper;
+import cn.reghao.tnb.content.app.disk.model.constant.AlbumType;
 import cn.reghao.tnb.content.app.disk.model.dto.CamRecordDto;
 import cn.reghao.tnb.content.app.disk.model.dto.CamRecordDto;
 import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
 import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
 import cn.reghao.tnb.content.app.disk.model.po.CamRecord;
 import cn.reghao.tnb.content.app.disk.model.po.CamRecord;
 import cn.reghao.tnb.content.app.disk.model.query.CamDeviceQuery;
 import cn.reghao.tnb.content.app.disk.model.query.CamDeviceQuery;
 import cn.reghao.tnb.content.app.disk.model.vo.*;
 import cn.reghao.tnb.content.app.disk.model.vo.*;
+import cn.reghao.tnb.content.app.util.IdService;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Set;
 
 
 /**
 /**
  * @author reghao
  * @author reghao
@@ -28,16 +33,19 @@ import java.util.stream.Collectors;
 public class CamRecordService {
 public class CamRecordService {
     @DubboReference(check = false, timeout = 60_000)
     @DubboReference(check = false, timeout = 60_000)
     private OssService ossService;
     private OssService ossService;
-    private int channelCode = 107;
+    private int camChannelCode = 107;
 
 
-    private final SnowFlake idGenerator;
+    private final IdService idService;
     private final CamDeviceMapper camDeviceMapper;
     private final CamDeviceMapper camDeviceMapper;
     private final CamRecordMapper camRecordMapper;
     private final CamRecordMapper camRecordMapper;
+    private final DiskShareService diskShareService;
 
 
-    public CamRecordService(CamDeviceMapper camDeviceMapper, CamRecordMapper camRecordMapper) {
-        this.idGenerator = new SnowFlake(1L, 1L);
+    public CamRecordService(IdService idService, CamDeviceMapper camDeviceMapper,
+                            CamRecordMapper camRecordMapper, DiskShareService diskShareService) {
+        this.idService = idService;
         this.camDeviceMapper = camDeviceMapper;
         this.camDeviceMapper = camDeviceMapper;
         this.camRecordMapper = camRecordMapper;
         this.camRecordMapper = camRecordMapper;
+        this.diskShareService = diskShareService;
     }
     }
 
 
     public Result addCamRecord(CamRecordDto camRecordDto) {
     public Result addCamRecord(CamRecordDto camRecordDto) {
@@ -51,14 +59,20 @@ public class CamRecordService {
             return Result.fail("cam not exist");
             return Result.fail("cam not exist");
         }
         }
 
 
-        long camId = camDeviceList.get(0).getCamId();
+        CamDevice camDevice = camDeviceList.get(0);
+        long loginUser = UserContext.getUserId();
+        if (camDevice.getAddBy() != loginUser) {
+            return Result.fail("not owner");
+        }
+
+        long camId = camDevice.getCamId();
         try {
         try {
             int videoChannelCode = camRecordDto.getVideoChannelCode();
             int videoChannelCode = camRecordDto.getVideoChannelCode();
             String videoFileId = camRecordDto.getVideoFileId();
             String videoFileId = camRecordDto.getVideoFileId();
             VideoInfo videoInfo = ossService.getVideoInfo(videoChannelCode, videoFileId);
             VideoInfo videoInfo = ossService.getVideoInfo(videoChannelCode, videoFileId);
 
 
             int duration = videoInfo.getDuration();
             int duration = videoInfo.getDuration();
-            long recordId = idGenerator.nextId();
+            long recordId = idService.getLongId();
             long startAt = camRecordDto.getStartAt();
             long startAt = camRecordDto.getStartAt();
             LocalDateTime startAt1 = DateTimeConverter.localDateTime(startAt);
             LocalDateTime startAt1 = DateTimeConverter.localDateTime(startAt);
             CamRecord camRecord = new CamRecord(camId, recordId, videoFileId, duration, startAt1);
             CamRecord camRecord = new CamRecord(camId, recordId, videoFileId, duration, startAt1);
@@ -71,6 +85,26 @@ public class CamRecordService {
         return Result.fail("");
         return Result.fail("");
     }
     }
 
 
+    private Result checkCamOwner(long camId) {
+        CamDeviceQuery camDeviceQuery = new CamDeviceQuery.Builder()
+                .camId(camId)
+                .build();
+        Page page = new Page(1, 1);
+        List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
+        if (camDeviceList.isEmpty()) {
+            return Result.fail("cam not exist");
+        }
+
+        CamDevice camDevice = camDeviceList.get(0);
+        long loginUser = UserContext.getUserId();
+        Set<Long> sharedCamIds = new HashSet<>(diskShareService.getSharedAlbumIds(AlbumType.cam.getValue(), loginUser));
+        if (camDevice.getAddBy() != loginUser && !sharedCamIds.contains(camId)) {
+            return Result.fail("not owner");
+        }
+
+        return Result.success();
+    }
+
     /**
     /**
      * 获取某天的监控录像
      * 获取某天的监控录像
      *
      *
@@ -79,12 +113,21 @@ public class CamRecordService {
      * @date 2024-08-31 18:08:972
      * @date 2024-08-31 18:08:972
      */
      */
     public List<CamRecordInfo> getCamRecordByDay(Long camId, String dayStr) {
     public List<CamRecordInfo> getCamRecordByDay(Long camId, String dayStr) {
+        Result result = checkCamOwner(camId);
+        if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+            return Collections.emptyList();
+        }
+
         return camRecordMapper.findByCamIdAndStartAt(camId, dayStr);
         return camRecordMapper.findByCamIdAndStartAt(camId, dayStr);
     }
     }
 
 
     public CamRecordDetail getCamRecordDetail(long recordId) {
     public CamRecordDetail getCamRecordDetail(long recordId) {
         CamRecord camRecord = camRecordMapper.findByRecordId(recordId);
         CamRecord camRecord = camRecordMapper.findByRecordId(recordId);
-        return camRecord == null ? null : getCamRecordDetail(camRecord);
+        if (camRecord != null && checkCamOwner(camRecord.getCamId()).getCode() == ResultStatus.SUCCESS.getCode()) {
+            return getCamRecordDetail(camRecord);
+        }
+
+        return null;
     }
     }
 
 
     /**
     /**
@@ -95,13 +138,24 @@ public class CamRecordService {
      * @date 2024-08-31 20:08:873
      * @date 2024-08-31 20:08:873
      */
      */
     public List<String> getDaysInMonth(Long camId, String yearMonth) {
     public List<String> getDaysInMonth(Long camId, String yearMonth) {
+        Result result = checkCamOwner(camId);
+        if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+            return Collections.emptyList();
+        }
+
         return camRecordMapper.findGroupByYearMonth(camId, yearMonth);
         return camRecordMapper.findGroupByYearMonth(camId, yearMonth);
     }
     }
 
 
     private CamRecordDetail getCamRecordDetail(CamRecord camRecord) {
     private CamRecordDetail getCamRecordDetail(CamRecord camRecord) {
+        long camId = camRecord.getCamId();
+        Result result = checkCamOwner(camId);
+        if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+            return null;
+        }
+
         String videoFileId = camRecord.getVideoFileId();
         String videoFileId = camRecord.getVideoFileId();
         try {
         try {
-            String signedUrl = ossService.getSignedUrl(channelCode, videoFileId);
+            String signedUrl = ossService.getSignedUrl(camChannelCode, videoFileId);
             return new CamRecordDetail(camRecord, signedUrl);
             return new CamRecordDetail(camRecord, signedUrl);
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();

+ 29 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/CamService.java

@@ -1,20 +1,23 @@
 package cn.reghao.tnb.content.app.disk.service;
 package cn.reghao.tnb.content.app.disk.service;
 
 
 import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.db.Page;
-import cn.reghao.jutil.tool.id.SnowFlake;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamDeviceMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.CamDeviceMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.UserActivityMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.UserActivityMapper;
+import cn.reghao.tnb.content.app.disk.model.constant.AlbumType;
 import cn.reghao.tnb.content.app.disk.model.dto.CamDeviceDto;
 import cn.reghao.tnb.content.app.disk.model.dto.CamDeviceDto;
 import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
 import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
 import cn.reghao.tnb.content.app.disk.model.po.UserActivity;
 import cn.reghao.tnb.content.app.disk.model.po.UserActivity;
 import cn.reghao.tnb.content.app.disk.model.query.CamDeviceQuery;
 import cn.reghao.tnb.content.app.disk.model.query.CamDeviceQuery;
 import cn.reghao.tnb.content.app.geo.model.vo.SelectOption;
 import cn.reghao.tnb.content.app.geo.model.vo.SelectOption;
+import cn.reghao.tnb.content.app.util.IdService;
 import cn.reghao.tnb.content.app.util.RandomUtil;
 import cn.reghao.tnb.content.app.util.RandomUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -24,19 +27,22 @@ import java.util.stream.Collectors;
 @Service
 @Service
 public class CamService {
 public class CamService {
     private int pageSize = 10;
     private int pageSize = 10;
-    private final SnowFlake idGenerator;
+    private final IdService idService;
     private final CamDeviceMapper camDeviceMapper;
     private final CamDeviceMapper camDeviceMapper;
     private final UserActivityMapper userActivityMapper;
     private final UserActivityMapper userActivityMapper;
+    private final DiskShareService diskShareService;
 
 
-    public CamService(CamDeviceMapper camDeviceMapper, UserActivityMapper userActivityMapper) {
-        this.idGenerator = new SnowFlake(1L, 1L);
+    public CamService(IdService idService, CamDeviceMapper camDeviceMapper,
+                      UserActivityMapper userActivityMapper, DiskShareService diskShareService) {
+        this.idService = idService;
         this.camDeviceMapper = camDeviceMapper;
         this.camDeviceMapper = camDeviceMapper;
         this.userActivityMapper = userActivityMapper;
         this.userActivityMapper = userActivityMapper;
+        this.diskShareService = diskShareService;
     }
     }
 
 
     public void addCamDevice(CamDeviceDto camDeviceDto) {
     public void addCamDevice(CamDeviceDto camDeviceDto) {
         String camName = camDeviceDto.getCamName();
         String camName = camDeviceDto.getCamName();
-        long camId = idGenerator.nextId();
+        long camId = idService.getLongId();
         CamDevice camDevice = new CamDevice(camId, camName);
         CamDevice camDevice = new CamDevice(camId, camName);
         camDeviceMapper.save(camDevice);
         camDeviceMapper.save(camDevice);
     }
     }
@@ -48,6 +54,13 @@ public class CamService {
                 .build();
                 .build();
         Page page = new Page(1, pageSize);
         Page page = new Page(1, pageSize);
         List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
         List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
+
+        List<Long> sharedCamIds = diskShareService.getSharedAlbumIds(AlbumType.cam.getValue(), loginUser);
+        if (!sharedCamIds.isEmpty()) {
+            List<CamDevice> sharedCamDevices = camDeviceMapper.findByCamIds(sharedCamIds);
+            camDeviceList.addAll(sharedCamDevices);
+        }
+
         return camDeviceList.stream().map(camDevice -> {
         return camDeviceList.stream().map(camDevice -> {
             long camId = camDevice.getCamId();
             long camId = camDevice.getCamId();
             String camName = camDevice.getCamName();
             String camName = camDevice.getCamName();
@@ -63,6 +76,17 @@ public class CamService {
                 .camId(camId)
                 .camId(camId)
                 .build();
                 .build();
         List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
         List<CamDevice> camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
+
+        if (camDeviceList.isEmpty()) {
+            Set<Long> sharedCamIds = new HashSet<>(diskShareService.getSharedAlbumIds(AlbumType.cam.getValue(), loginUser));
+            if (sharedCamIds.contains(camId)) {
+                camDeviceQuery = new CamDeviceQuery.Builder()
+                        .camId(camId)
+                        .build();
+                camDeviceList = camDeviceMapper.findCamDeviceQueryByPage(page, camDeviceQuery);
+            }
+        }
+
         return camDeviceList.isEmpty() ? null : camDeviceList.get(0);
         return camDeviceList.isEmpty() ? null : camDeviceList.get(0);
     }
     }
 
 

+ 5 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java

@@ -12,6 +12,7 @@ import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
 import cn.reghao.tnb.content.app.disk.db.repository.DiskAlbumRepository;
 import cn.reghao.tnb.content.app.disk.db.repository.DiskAlbumRepository;
+import cn.reghao.tnb.content.app.disk.model.constant.AlbumType;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
@@ -240,7 +241,8 @@ public class DiskAlbumService {
 
 
     public List<DiskAlbumInfo> getAlbumList() {
     public List<DiskAlbumInfo> getAlbumList() {
         long loginUser = UserContext.getUserId();
         long loginUser = UserContext.getUserId();
-        List<Long> albumIds = diskShareService.getSharedAlbumIds(loginUser);
+        int albumType = AlbumType.image.getValue();
+        List<Long> albumIds = diskShareService.getSharedAlbumIds(albumType, loginUser);
         List<DiskAlbum> sharedAlbums = albumIds.stream().map(diskAlbumMapper::findDiskAlbum)
         List<DiskAlbum> sharedAlbums = albumIds.stream().map(diskAlbumMapper::findDiskAlbum)
                 .filter(Objects::nonNull)
                 .filter(Objects::nonNull)
                 .peek(this::setSharedAlbumName)
                 .peek(this::setSharedAlbumName)
@@ -270,7 +272,8 @@ public class DiskAlbumService {
 
 
     public DiskAlbumDetail getDiskAlbumDetail(long albumId, int pageNumber) {
     public DiskAlbumDetail getDiskAlbumDetail(long albumId, int pageNumber) {
         long loginUser = UserContext.getUserId();
         long loginUser = UserContext.getUserId();
-        Set<Long> sharedAlbumSet = new HashSet<>(diskShareService.getSharedAlbumIds(loginUser));
+        int albumType = AlbumType.image.getValue();
+        Set<Long> sharedAlbumSet = new HashSet<>(diskShareService.getSharedAlbumIds(albumType, loginUser));
         DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
         DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
         if (diskAlbum == null) {
         if (diskAlbum == null) {
             return null;
             return null;

+ 30 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskShareService.java

@@ -8,8 +8,12 @@ import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper;
+import cn.reghao.tnb.content.app.disk.db.repository.DiskCamRepository;
 import cn.reghao.tnb.content.app.disk.db.repository.DiskShareRepository;
 import cn.reghao.tnb.content.app.disk.db.repository.DiskShareRepository;
+import cn.reghao.tnb.content.app.disk.model.constant.AlbumType;
 import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
 import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
+import cn.reghao.tnb.content.app.disk.model.po.CamDevice;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShare;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShare;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShareTo;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShareTo;
 import cn.reghao.tnb.content.app.disk.model.vo.DiskShareInfo;
 import cn.reghao.tnb.content.app.disk.model.vo.DiskShareInfo;
@@ -37,17 +41,37 @@ public class DiskShareService {
     private final IdService idService;
     private final IdService idService;
     private final DiskShareMapper diskShareMapper;
     private final DiskShareMapper diskShareMapper;
     private final DiskAlbumMapper diskAlbumMapper;
     private final DiskAlbumMapper diskAlbumMapper;
-    private DiskShareRepository diskShareRepository;
+    private final DiskShareRepository diskShareRepository;
+    private DiskCamRepository diskCamRepository;
 
 
     public DiskShareService(IdService idService, DiskShareMapper diskShareMapper,
     public DiskShareService(IdService idService, DiskShareMapper diskShareMapper,
-                            DiskAlbumMapper diskAlbumMapper, DiskShareRepository diskShareRepository) {
+                            DiskAlbumMapper diskAlbumMapper, DiskShareRepository diskShareRepository,
+                            DiskCamRepository diskCamRepository) {
         this.idService = idService;
         this.idService = idService;
         this.diskShareMapper = diskShareMapper;
         this.diskShareMapper = diskShareMapper;
         this.diskAlbumMapper = diskAlbumMapper;
         this.diskAlbumMapper = diskAlbumMapper;
         this.diskShareRepository = diskShareRepository;
         this.diskShareRepository = diskShareRepository;
+        this.diskCamRepository = diskCamRepository;
     }
     }
 
 
-    public void createShare(ShareCreate shareCreate) {
+    public Result createShare(ShareCreate shareCreate) {
+        long loginUser = UserContext.getUserId();
+        int albumType = shareCreate.getAlbumType();
+        long albumId = shareCreate.getAlbumId();
+        if (albumType == AlbumType.cam.getValue()) {
+            CamDevice camDevice = diskCamRepository.getCamDevice(albumId, loginUser);
+            if (camDevice == null) {
+                return Result.fail("not owner");
+            }
+        } else if (albumType == AlbumType.image.getValue()) {
+            DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
+            if (diskAlbum == null || diskAlbum.getCreateBy() != loginUser) {
+                return Result.fail("not owner");
+            }
+        } else {
+            return Result.fail("error albumType");
+        }
+        
         long shareId = idService.getLongId();
         long shareId = idService.getLongId();
         DiskShare diskShare = new DiskShare(shareId, shareCreate);
         DiskShare diskShare = new DiskShare(shareId, shareCreate);
         List<DiskShareTo> list = shareCreate.getShareToList().stream()
         List<DiskShareTo> list = shareCreate.getShareToList().stream()
@@ -61,6 +85,7 @@ public class DiskShareService {
         if (!list.isEmpty()) {
         if (!list.isEmpty()) {
             diskShareMapper.saveDiskShareTo(list);
             diskShareMapper.saveDiskShareTo(list);
         }
         }
+        return Result.success();
     }
     }
 
 
     public Result deleteShare(long shareId) {
     public Result deleteShare(long shareId) {
@@ -103,8 +128,8 @@ public class DiskShareService {
      * @return
      * @return
      * @date 2025-09-06 00:09:512
      * @date 2025-09-06 00:09:512
      */
      */
-    public List<Long> getSharedAlbumIds(long shareTo) {
-        List<DiskShare> diskShareList = diskShareMapper.findDiskShareList(shareTo);
+    public List<Long> getSharedAlbumIds(int albumType, long shareTo) {
+        List<DiskShare> diskShareList = diskShareMapper.findDiskShareList(albumType, shareTo);
         return diskShareList.stream()
         return diskShareList.stream()
                 .map(diskShare -> {
                 .map(diskShare -> {
                     long shareId = diskShare.getShareId();
                     long shareId = diskShare.getShareId();

+ 8 - 0
content/content-service/src/main/resources/mapper/disk/CamDeviceMapper.xml

@@ -41,4 +41,12 @@
             </if>
             </if>
         </where>
         </where>
     </select>
     </select>
+    <select id="findByCamIds" resultType="cn.reghao.tnb.content.app.disk.model.po.CamDevice">
+        select *
+        from my_cam_device
+        where deleted=0 and cam_id in
+        <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>
 </mapper>

+ 3 - 3
content/content-service/src/main/resources/mapper/disk/DiskShareMapper.xml

@@ -4,9 +4,9 @@
 <mapper namespace="cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper">
 <mapper namespace="cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into my_disk_share
         insert into my_disk_share
-        (`share_id`,`album_id`,`create_at`,`create_by`)
+        (`share_id`,`album_type`,`album_id`,`create_at`,`create_by`)
         values
         values
-        (#{shareId},#{albumId},#{createAt},#{createBy})
+        (#{shareId},#{albumType},#{albumId},#{createAt},#{createBy})
     </insert>
     </insert>
     <insert id="saveDiskShareTo" useGeneratedKeys="true" keyProperty="id">
     <insert id="saveDiskShareTo" useGeneratedKeys="true" keyProperty="id">
         insert into my_disk_share_to
         insert into my_disk_share_to
@@ -48,7 +48,7 @@
         from my_disk_share_to
         from my_disk_share_to
         inner join my_disk_share
         inner join my_disk_share
         on my_disk_share.deleted=0 and my_disk_share_to.share_id=my_disk_share.share_id
         on my_disk_share.deleted=0 and my_disk_share_to.share_id=my_disk_share.share_id
-        where user_id=#{shareTo}
+        where my_disk_share.album_type=#{albumType} and my_disk_share_to.user_id=#{shareTo}
     </select>
     </select>
 
 
     <select id="countDiskShareTo" resultType="java.lang.Integer">
     <select id="countDiskShareTo" resultType="java.lang.Integer">