addPlayList.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <script setup lang="ts">
  2. import {defineComponent, onMounted, PropType, ref} from "vue";
  3. import {PlayList} from "@/types/musicType.ts";
  4. import KuiInput from "@/components/public/kui/kui-input.vue";
  5. import KuiCheckbox from "@/components/public/kui/kui-checkbox.vue";
  6. import message from "@/components/public/kui/message";
  7. import {ErrorCode} from "@/types/apiTypes.ts";
  8. import {api_playlist_add, api_playlist_update} from "@/apis/musicControl.ts";
  9. defineComponent({
  10. name: "addPlayList"
  11. })
  12. const props = defineProps({
  13. playlist: {
  14. type: Object as PropType<PlayList>,
  15. default: (): PlayList => {
  16. return {
  17. id: -1,
  18. name: '',
  19. icon: '',
  20. cover: '',
  21. description: '',
  22. playCount: 0,
  23. trackCount: 0,
  24. createTime: 0,
  25. lastPlayTime: 0,
  26. isTagSearch: false,
  27. isSync: false,
  28. isPublic: false,
  29. isLike: false
  30. }
  31. }
  32. }
  33. })
  34. const emits = defineEmits<{
  35. (e: 'close' ): void,
  36. (e: 'submit'): void
  37. }>()
  38. const isEdit = ref(false);
  39. // 歌单名称
  40. const playlistName = ref('');
  41. // 歌单描述
  42. const description = ref('');
  43. // 歌单封面
  44. const cover = ref('');
  45. const isLike = ref(false);
  46. const isPublic = ref(false);
  47. onMounted(()=>{
  48. if (props.playlist && props.playlist.id > -1)
  49. {
  50. console.log(props.playlist);
  51. isEdit.value = true;
  52. playlistName.value = props.playlist.name;
  53. description.value = props.playlist.description;
  54. cover.value = props.playlist.cover;
  55. console.log(cover.value);
  56. isLike.value = !!props.playlist.isLike;
  57. isPublic.value = !!props.playlist.isPublic;
  58. }else {
  59. isEdit.value = false;
  60. }
  61. })
  62. function closeDialog() {
  63. emits('close');
  64. }
  65. async function submitHandle() {
  66. console.log('submit');
  67. // 创建歌单
  68. let param: Partial<PlayList> = {
  69. name: playlistName.value,
  70. description: description.value,
  71. cover: cover.value,
  72. isPublic: isPublic.value,
  73. isLike: isLike.value
  74. }
  75. if (!param.name)
  76. {
  77. message.error('歌单名称不能为空');
  78. return;
  79. }
  80. if (isEdit.value)
  81. {
  82. // 编辑歌单
  83. param.id = props.playlist.id;
  84. let res = await api_playlist_update(param);
  85. if (res.code === ErrorCode.success)
  86. {
  87. message.success('编辑成功');
  88. emits('close');
  89. }
  90. else {
  91. message.error(res.msg);
  92. }
  93. }
  94. else {
  95. // 创建歌单
  96. let res = await api_playlist_add(param);
  97. if (res.code === ErrorCode.success)
  98. {
  99. message.success('创建成功');
  100. emits('close');
  101. }
  102. else {
  103. message.error(res.msg);
  104. }
  105. }
  106. }
  107. </script>
  108. <template>
  109. <div class="dialog-content form-dialog">
  110. <div class="dialog-title">
  111. {{ isEdit? '编辑歌单' : '创建歌单' }}
  112. <div
  113. class="close-btn"
  114. @click="closeDialog()">
  115. X
  116. </div>
  117. </div>
  118. <div class="dialog-show">
  119. <div class="form-row" >
  120. <kui-input label="歌单名称"
  121. placeholder="歌单的名称"
  122. v-model:value="playlistName"
  123. />
  124. </div>
  125. <div class="form-row mt-4"
  126. v-if="isLike"
  127. >
  128. <kui-input
  129. label="歌单描述"
  130. placeholder="歌单的描述"
  131. v-model:value="description"
  132. />
  133. </div>
  134. <div class="form-row mt-4">
  135. <kui-checkbox id="isPublicPlaylist" v-model:value="isPublic" >
  136. 是否公开
  137. </kui-checkbox>
  138. </div>
  139. </div>
  140. <div class="dialog-footer">
  141. <div class="btn cancel-btn mr-2" @click="closeDialog()">取消</div>
  142. <div class="btn primary-btn" @click="submitHandle">确定</div>
  143. </div>
  144. </div>
  145. </template>
  146. <style scoped>
  147. .form-row{
  148. width: 90%;
  149. height: 40px;
  150. display: flex;
  151. align-items: center;
  152. margin: 1rem auto;
  153. }
  154. </style>