【增加】AI:我的音乐
This commit is contained in:
parent
3acd058635
commit
94460008c4
|
@ -1,12 +1,10 @@
|
||||||
package cn.iocoder.yudao.module.ai.controller.admin.music;
|
package cn.iocoder.yudao.module.ai.controller.admin.music;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicPageReqVO;
|
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.*;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicRespVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicUpdatePublicStatusReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiSunoGenerateReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
||||||
import cn.iocoder.yudao.module.ai.service.music.AiMusicService;
|
import cn.iocoder.yudao.module.ai.service.music.AiMusicService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
@ -30,13 +28,39 @@ public class AiMusicController {
|
||||||
@Resource
|
@Resource
|
||||||
private AiMusicService musicService;
|
private AiMusicService musicService;
|
||||||
|
|
||||||
// TODO @xin:一个接口,获得【我的】音乐分页,参考 获得【我的】聊天角色分页 来写;用于我自己生成的列表,和音乐广场
|
@GetMapping("/my-page")
|
||||||
|
@Operation(summary = "获得【我的】音乐分页")
|
||||||
|
public CommonResult<PageResult<AiMusicRespVO>> getMusicMyPage(@Valid AiMusicPageReqVO pageReqVO) {
|
||||||
|
PageResult<AiMusicDO> pageResult = musicService.getMusicMyPage(pageReqVO, getLoginUserId());
|
||||||
|
return success(BeanUtils.toBean(pageResult, AiMusicRespVO.class));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO @xin:一个接口,删除【我的】音乐
|
@Operation(summary = "删除【我的】音乐记录")
|
||||||
|
@DeleteMapping("/delete-my")
|
||||||
|
@Parameter(name = "id", required = true, description = "音乐编号", example = "1024")
|
||||||
|
public CommonResult<Boolean> deleteMusicMy(@RequestParam("id") Long id) {
|
||||||
|
musicService.deleteMusicMy(id, getLoginUserId());
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO @xin:一个接口,获得【我的】音乐
|
@GetMapping("/get-my")
|
||||||
|
@Operation(summary = "获取【我的】音乐")
|
||||||
|
@Parameter(name = "id", required = true, description = "音乐编号", example = "1024")
|
||||||
|
public CommonResult<AiMusicRespVO> getMusicMy(@RequestParam("id") Long id) {
|
||||||
|
AiMusicDO music = musicService.getMusic(id);
|
||||||
|
if (music == null || ObjUtil.notEqual(getLoginUserId(), music.getUserId())) {
|
||||||
|
return success(null);
|
||||||
|
}
|
||||||
|
return success(BeanUtils.toBean(music, AiMusicRespVO.class));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO @xin:一个接口,修改【我的】音乐,目前只支持修改标题
|
@PostMapping("/updateTitle-my")
|
||||||
|
@Operation(summary = "修改【我的】音乐 目前只支持修改标题")
|
||||||
|
@Parameter(name = "title", required = true, description = "音乐名称", example = "夜空中最亮的星")
|
||||||
|
public CommonResult<Boolean> updateMusicTitle(AiMusicUpdateTitleReqVO updateReqVO) {
|
||||||
|
musicService.updateMusicTitle(updateReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping("/generate")
|
@PostMapping("/generate")
|
||||||
@Operation(summary = "音乐生成")
|
@Operation(summary = "音乐生成")
|
||||||
|
@ -44,7 +68,7 @@ public class AiMusicController {
|
||||||
return success(musicService.generateMusic(getLoginUserId(), reqVO));
|
return success(musicService.generateMusic(getLoginUserId(), reqVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================ 绘图管理 ================
|
// ================ 音乐管理 ================
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得音乐分页")
|
@Operation(summary = "获得音乐分页")
|
||||||
|
|
|
@ -61,6 +61,9 @@ public class AiMusicRespVO {
|
||||||
@Schema(description = "错误信息")
|
@Schema(description = "错误信息")
|
||||||
private String errorMessage;
|
private String errorMessage;
|
||||||
|
|
||||||
|
@Schema(description = "音乐时长")
|
||||||
|
private Double duration;
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - AI 音乐修改名称 Request VO")
|
||||||
|
@Data
|
||||||
|
public class AiMusicUpdateTitleReqVO {
|
||||||
|
|
||||||
|
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15583")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "音乐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "夜空中最亮的星")
|
||||||
|
@NotNull(message = "音乐名称不能为空")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
}
|
|
@ -17,17 +17,32 @@ public class AiSunoGenerateReqVO {
|
||||||
private String platform; // 参见 AiPlatformEnum 枚举
|
private String platform; // 参见 AiPlatformEnum 枚举
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1. 描述模式:描述词 + 是否纯音乐 + 模型 TODO @xin:目前貌似描述词没弄对?看着不是 prompt 字段(也可能我弄错了)。可以微信再沟通下哈
|
* 1. 描述模式:描述词 + 是否纯音乐 + 模型
|
||||||
* 2. 歌词模式:歌词 + 音乐风格 + 标题 + 模型 TODO @xin:目前这块少传递了标题;
|
* 2. 歌词模式:歌词 + 音乐风格 + 标题 + 模型
|
||||||
*/
|
*/
|
||||||
@Schema(description = "生成模式 1.描述模式 2. 歌词模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
@Schema(description = "生成模式 1.描述模式 2. 歌词模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||||
@NotNull(message = "生成模式不能为空")
|
@NotNull(message = "生成模式不能为空")
|
||||||
private Integer generateMode; // 参见 AiMusicGenerateModeEnum 枚举
|
private Integer generateMode; // 参见 AiMusicGenerateModeEnum 枚举
|
||||||
|
|
||||||
@Schema(description = "用于生成音乐音频的提示 1.描述模式:音乐/歌词说明 2.歌词模式:歌词", requiredMode = Schema.RequiredMode.REQUIRED,
|
@Schema(description = "歌词模式用:用于生成音乐音频的歌词提示", requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
example = "创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。")
|
example = """
|
||||||
|
[Verse]
|
||||||
|
阳光下奔跑 多么欢快
|
||||||
|
假期就要来 心都飞起来
|
||||||
|
朋友在一旁 笑声又灿烂
|
||||||
|
无忧无虑的 每一天甜蜜
|
||||||
|
[Chorus]
|
||||||
|
马上放假了 快来庆祝
|
||||||
|
一起去旅行 快去冒险
|
||||||
|
日子太短暂 别再等待
|
||||||
|
马上放假了 梦想起飞
|
||||||
|
""")
|
||||||
private String prompt;
|
private String prompt;
|
||||||
|
|
||||||
|
@Schema(description = "描述模式用:用于生成音乐音频的描述", requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
|
example = "创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。")
|
||||||
|
private String gptDescriptionPrompt;
|
||||||
|
|
||||||
@Schema(description = "是否纯音乐", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
|
@Schema(description = "是否纯音乐", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
|
||||||
private Boolean makeInstrumental;
|
private Boolean makeInstrumental;
|
||||||
|
|
||||||
|
|
|
@ -32,4 +32,13 @@ public interface AiMusicMapper extends BaseMapperX<AiMusicDO> {
|
||||||
.orderByDesc(AiMusicDO::getId));
|
.orderByDesc(AiMusicDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default PageResult<AiMusicDO> selectPageByMy(AiMusicPageReqVO reqVO, Long userId) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<AiMusicDO>()
|
||||||
|
// 情况一:公开
|
||||||
|
.eq(Boolean.TRUE.equals(reqVO.getPublicStatus()), AiMusicDO::getPublicStatus, reqVO.getPublicStatus())
|
||||||
|
// 情况二:私有
|
||||||
|
.eq(Boolean.FALSE.equals(reqVO.getPublicStatus()), AiMusicDO::getUserId, userId)
|
||||||
|
.orderByAsc(AiMusicDO::getId));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.ai.service.music;
|
package cn.iocoder.yudao.module.ai.service.music;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicPageReqVO;
|
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.*;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicUpdatePublicStatusReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiSunoGenerateReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
@ -20,7 +18,7 @@ public interface AiMusicService {
|
||||||
* 音乐生成
|
* 音乐生成
|
||||||
*
|
*
|
||||||
* @param userId 用户编号
|
* @param userId 用户编号
|
||||||
* @param reqVO 请求参数
|
* @param reqVO 请求参数
|
||||||
* @return 生成的音乐ID
|
* @return 生成的音乐ID
|
||||||
*/
|
*/
|
||||||
List<Long> generateMusic(Long userId, AiSunoGenerateReqVO reqVO);
|
List<Long> generateMusic(Long userId, AiSunoGenerateReqVO reqVO);
|
||||||
|
@ -39,6 +37,13 @@ public interface AiMusicService {
|
||||||
*/
|
*/
|
||||||
void updateMusicPublicStatus(@Valid AiMusicUpdatePublicStatusReqVO updateReqVO);
|
void updateMusicPublicStatus(@Valid AiMusicUpdatePublicStatusReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新音乐名称
|
||||||
|
*
|
||||||
|
* @param updateReqVO 更新信息
|
||||||
|
*/
|
||||||
|
void updateMusicTitle(@Valid AiMusicUpdateTitleReqVO updateReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除AI 音乐
|
* 删除AI 音乐
|
||||||
*
|
*
|
||||||
|
@ -46,6 +51,22 @@ public interface AiMusicService {
|
||||||
*/
|
*/
|
||||||
void deleteMusic(Long id);
|
void deleteMusic(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除【我的】音乐记录
|
||||||
|
*
|
||||||
|
* @param id 音乐编号
|
||||||
|
* @param userId 用户编号
|
||||||
|
*/
|
||||||
|
void deleteMusicMy(Long id, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得AI 音乐
|
||||||
|
*
|
||||||
|
* @param id 音乐编号
|
||||||
|
* @return 音乐内容
|
||||||
|
*/
|
||||||
|
AiMusicDO getMusic(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得音乐分页
|
* 获得音乐分页
|
||||||
*
|
*
|
||||||
|
@ -54,4 +75,12 @@ public interface AiMusicService {
|
||||||
*/
|
*/
|
||||||
PageResult<AiMusicDO> getMusicPage(AiMusicPageReqVO pageReqVO);
|
PageResult<AiMusicDO> getMusicPage(AiMusicPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得【我的】音乐分页
|
||||||
|
*
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @return 音乐分页
|
||||||
|
*/
|
||||||
|
PageResult<AiMusicDO> getMusicMyPage(AiMusicPageReqVO pageReqVO, Long userId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,12 @@ package cn.iocoder.yudao.module.ai.service.music;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.text.StrPool;
|
import cn.hutool.core.text.StrPool;
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi;
|
import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicPageReqVO;
|
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.*;
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiMusicUpdatePublicStatusReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.controller.admin.music.vo.AiSunoGenerateReqVO;
|
|
||||||
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
import cn.iocoder.yudao.module.ai.dal.dataobject.music.AiMusicDO;
|
||||||
import cn.iocoder.yudao.module.ai.dal.mysql.music.AiMusicMapper;
|
import cn.iocoder.yudao.module.ai.dal.mysql.music.AiMusicMapper;
|
||||||
import cn.iocoder.yudao.module.ai.enums.music.AiMusicGenerateModeEnum;
|
import cn.iocoder.yudao.module.ai.enums.music.AiMusicGenerateModeEnum;
|
||||||
|
@ -23,6 +22,7 @@ import java.util.*;
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
|
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.IMAGE_NOT_EXISTS;
|
||||||
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.MUSIC_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.MUSIC_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,7 +55,7 @@ public class AiMusicServiceImpl implements AiMusicService {
|
||||||
} else if (Objects.equals(AiMusicGenerateModeEnum.DESCRIPTION.getMode(), reqVO.getGenerateMode())) {
|
} else if (Objects.equals(AiMusicGenerateModeEnum.DESCRIPTION.getMode(), reqVO.getGenerateMode())) {
|
||||||
// 1.2 描述模式
|
// 1.2 描述模式
|
||||||
SunoApi.MusicGenerateRequest generateRequest = new SunoApi.MusicGenerateRequest(
|
SunoApi.MusicGenerateRequest generateRequest = new SunoApi.MusicGenerateRequest(
|
||||||
reqVO.getPrompt(), reqVO.getModel(), reqVO.getMakeInstrumental());
|
reqVO.getGptDescriptionPrompt(), reqVO.getModel(), reqVO.getMakeInstrumental());
|
||||||
musicDataList = sunoApi.generate(generateRequest);
|
musicDataList = sunoApi.generate(generateRequest);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException(StrUtil.format("未知生成模式({})", reqVO));
|
throw new IllegalArgumentException(StrUtil.format("未知生成模式({})", reqVO));
|
||||||
|
@ -103,6 +103,14 @@ public class AiMusicServiceImpl implements AiMusicService {
|
||||||
musicMapper.updateById(new AiMusicDO().setId(updateReqVO.getId()).setPublicStatus(updateReqVO.getPublicStatus()));
|
musicMapper.updateById(new AiMusicDO().setId(updateReqVO.getId()).setPublicStatus(updateReqVO.getPublicStatus()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateMusicTitle(AiMusicUpdateTitleReqVO updateReqVO) {
|
||||||
|
// 校验存在
|
||||||
|
validateMusicExists(updateReqVO.getId());
|
||||||
|
// 更新
|
||||||
|
musicMapper.updateById(new AiMusicDO().setId(updateReqVO.getId()).setTitle(updateReqVO.getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteMusic(Long id) {
|
public void deleteMusic(Long id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
|
@ -111,10 +119,20 @@ public class AiMusicServiceImpl implements AiMusicService {
|
||||||
musicMapper.deleteById(id);
|
musicMapper.deleteById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateMusicExists(Long id) {
|
@Override
|
||||||
if (musicMapper.selectById(id) == null) {
|
public void deleteMusicMy(Long id, Long userId) {
|
||||||
throw exception(MUSIC_NOT_EXISTS);
|
// 1. 校验是否存在
|
||||||
|
AiMusicDO music = validateMusicExists(id);
|
||||||
|
if (ObjUtil.notEqual(music.getUserId(), userId)) {
|
||||||
|
throw exception(IMAGE_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
// 2. 删除记录
|
||||||
|
musicMapper.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AiMusicDO getMusic(Long id) {
|
||||||
|
return musicMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -122,6 +140,11 @@ public class AiMusicServiceImpl implements AiMusicService {
|
||||||
return musicMapper.selectPage(pageReqVO);
|
return musicMapper.selectPage(pageReqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<AiMusicDO> getMusicMyPage(AiMusicPageReqVO pageReqVO, Long userId) {
|
||||||
|
return musicMapper.selectPageByMy(pageReqVO, userId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建 AiMusicDO 集合
|
* 构建 AiMusicDO 集合
|
||||||
*
|
*
|
||||||
|
@ -151,4 +174,19 @@ public class AiMusicServiceImpl implements AiMusicService {
|
||||||
byte[] bytes = HttpUtil.downloadBytes(url);
|
byte[] bytes = HttpUtil.downloadBytes(url);
|
||||||
return fileApi.createFile(bytes);
|
return fileApi.createFile(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验音乐是否存在
|
||||||
|
*
|
||||||
|
* @param id 音乐编号
|
||||||
|
* @return 音乐信息
|
||||||
|
*/
|
||||||
|
private AiMusicDO validateMusicExists(Long id) {
|
||||||
|
AiMusicDO music = musicMapper.selectById(id);
|
||||||
|
if (music == null) {
|
||||||
|
throw exception(MUSIC_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
return music;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,8 +201,8 @@ yudao.ai:
|
||||||
notify-url: http://java.nat300.top/admin-api/ai/image/midjourney/notify
|
notify-url: http://java.nat300.top/admin-api/ai/image/midjourney/notify
|
||||||
suno:
|
suno:
|
||||||
enable: true
|
enable: true
|
||||||
# base-url: https://suno-om0w1cy6e-status2xxs-projects.vercel.app
|
base-url: https://suno-55ishh05u-status2xxs-projects.vercel.app
|
||||||
base-url: http://127.0.0.1:3001
|
# base-url: http://127.0.0.1:3001
|
||||||
|
|
||||||
--- #################### 芋道相关配置 ####################
|
--- #################### 芋道相关配置 ####################
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue