subject-save.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import {NButton, NForm, NFormItem, NInput, NSelect, NSpace, useMessage} from 'naive-ui'
  2. import {defineComponent, onMounted, PropType, reactive, ref} from 'vue'
  3. import {subjectUpdate, subjectSave} from "@views/system-manage/subject-manage/api";
  4. import UploadFile from "@components/upload-file";
  5. export default defineComponent({
  6. name: 'role-operation',
  7. props: {
  8. type: {
  9. type: String,
  10. default: 'add'
  11. },
  12. data: {
  13. type: Object as PropType<any>,
  14. default: () => {
  15. }
  16. },
  17. categoryList: {
  18. type: Object as PropType<any>,
  19. default: () => []
  20. },
  21. instrumentList: {
  22. type: Object as PropType<any>,
  23. default: () => []
  24. }
  25. },
  26. emits: ['close', 'getList'],
  27. setup(props, {slots, attrs, emit}) {
  28. const state = reactive({
  29. forms: {
  30. categoryId: null,
  31. name: null,
  32. img: null,
  33. musicalInstrumentIds: [],
  34. },
  35. rowData: {},
  36. categoryList: [],
  37. instrumentList: [],
  38. })
  39. const btnLoading = ref(false)
  40. const formsRef = ref()
  41. const message = useMessage()
  42. const onSubmit = async () => {
  43. formsRef.value.validate(async (error: any) => {
  44. if (error) return false
  45. try {
  46. btnLoading.value = true
  47. if (props.type === 'add') {
  48. const params: any = {
  49. ...state.forms,
  50. musicalInstrumentIds: state.forms.musicalInstrumentIds?.join(',') || ''
  51. }
  52. await subjectSave(params)
  53. message.success('添加成功')
  54. } else if (props.type === 'edit') {
  55. const params: any = {
  56. ...state.forms,
  57. musicalInstrumentIds: state.forms.musicalInstrumentIds?.join(',') || '',
  58. id: props.data.id
  59. }
  60. await subjectUpdate(params)
  61. message.success('修改成功')
  62. }
  63. emit('close')
  64. emit('getList')
  65. } catch {
  66. }
  67. btnLoading.value = false
  68. })
  69. }
  70. onMounted(async () => {
  71. if (props.type === 'edit') {
  72. const data = props.data
  73. state.forms.categoryId = data.categoryId
  74. state.forms.name = data.name
  75. state.forms.img = data.img
  76. state.forms.musicalInstrumentIds = data.musicalInstrumentIds?.split(',') || [];
  77. }
  78. console.log("pca", props.categoryList)
  79. props.categoryList.forEach((next: any) => {
  80. next.disabled = !next.enableFlag
  81. })
  82. props.instrumentList.forEach((next: any) => {
  83. next.disabled = !next.enableFlag
  84. })
  85. })
  86. return () => (
  87. <div style="background: #fff; padding-top: 12px">
  88. <NForm
  89. model={state.forms}
  90. ref={formsRef}
  91. label-placement="left"
  92. label-width="auto">
  93. <NFormItem
  94. label="声部分类"
  95. path="categoryId"
  96. rule={[
  97. {
  98. required: true,
  99. message: '请选择声部分类'
  100. }
  101. ]}
  102. >
  103. <NSelect
  104. clearable
  105. v-model:value={state.forms.categoryId}
  106. placeholder="请选择声部分类"
  107. options={props.categoryList as any}
  108. filterable
  109. />
  110. </NFormItem>
  111. <NFormItem
  112. label="声部名称"
  113. path="name"
  114. rule={[
  115. {
  116. required: true,
  117. message: '请输入声部名称'
  118. }
  119. ]}
  120. >
  121. <NInput
  122. v-model:value={state.forms.name}
  123. placeholder="请输入声部名称"
  124. clearable
  125. maxlength={10}
  126. showCount
  127. ></NInput>
  128. </NFormItem>
  129. <NFormItem
  130. label="声部图片"
  131. path="img"
  132. rule={[
  133. {
  134. required: true,
  135. message: '请输入声部图片'
  136. }
  137. ]}
  138. >
  139. <UploadFile
  140. accept=".jpg,.jpeg,.png"
  141. tips="请上传大小1M以内的JPG、PNG图片"
  142. v-model:fileList={state.forms.img}
  143. cropper
  144. bucketName="cbs"
  145. options={{
  146. autoCrop: true, //是否默认生成截图框
  147. enlarge: 2, // 图片放大倍数
  148. autoCropWidth: 200, //默框高度
  149. fixedBox: true, //是否固定截图框大认生成截图框宽度
  150. autoCropHeight: 200, //默认生成截图小 不允许改变
  151. previewsCircle: false, //预览图是否是原圆形
  152. title: '声部图片'
  153. }}
  154. />
  155. </NFormItem>
  156. <NFormItem
  157. label="关联乐器"
  158. path="musicalInstrumentIds"
  159. rule={[
  160. {
  161. required: false,
  162. message: '请选择关联乐器'
  163. }
  164. ]}
  165. >
  166. <NSelect
  167. multiple
  168. clearable
  169. v-model:value={state.forms.musicalInstrumentIds}
  170. placeholder="请选择关联乐器"
  171. options={props.instrumentList as any}
  172. />
  173. </NFormItem>
  174. </NForm>
  175. <NSpace justify="end">
  176. <NButton type="default" onClick={() => emit('close')}>
  177. 取消
  178. </NButton>
  179. <NButton type="primary" onClick={() => onSubmit()} loading={btnLoading.value}>
  180. 保存
  181. </NButton>
  182. </NSpace>
  183. </div>
  184. )
  185. }
  186. })