ad-operation.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import {
  2. NForm,
  3. NFormItem,
  4. NInput,
  5. NSelect,
  6. NSpace,
  7. NButton,
  8. useMessage,
  9. NCascader,
  10. NDatePicker
  11. } from 'naive-ui'
  12. import type { TreeSelectOption } from 'naive-ui'
  13. import { defineComponent, onMounted, PropType, provide, reactive, ref } from 'vue'
  14. import UploadFile from '@/components/upload-file'
  15. import { sysNewsInformationSave, sysNewsInformationUpdate } from '../api'
  16. import dayjs from 'dayjs'
  17. import { getTimes } from '@/utils/dateUtil'
  18. export default defineComponent({
  19. name: 'ad-operation',
  20. props: {
  21. type: {
  22. type: String,
  23. default: 'add'
  24. },
  25. data: {
  26. type: Object as PropType<any>,
  27. default: () => {}
  28. },
  29. clientTypeList: {
  30. type: Array as PropType<Array<TreeSelectOption>>,
  31. default: () => []
  32. }
  33. },
  34. emits: ['close', 'getList'],
  35. setup(props, { slots, attrs, emit }) {
  36. const forms = reactive({
  37. type: 'OPEN_SCREEN_AD',
  38. clientType: null,
  39. title: null,
  40. coverImage: null,
  41. linkUrl: null,
  42. showTime: null,
  43. operationTime: null as any,
  44. onlineTime: null,
  45. offlineTime: null,
  46. status: false
  47. })
  48. const btnLoading = ref(false)
  49. const formsRef = ref()
  50. const message = useMessage()
  51. // 提交记录
  52. const onSubmit = async () => {
  53. formsRef.value.validate(async (error: any) => {
  54. if (error) return
  55. try {
  56. const { operationTime, ...res } = forms
  57. let onlineTime = '',
  58. offlineTime = ''
  59. if (operationTime) {
  60. onlineTime = dayjs(operationTime[0]).format('YYYY-MM-DD HH:mm:ss')
  61. offlineTime = dayjs(operationTime[1]).format('YYYY-MM-DD HH:mm:ss')
  62. }
  63. btnLoading.value = true
  64. if (props.type === 'add') {
  65. await sysNewsInformationSave({
  66. ...res,
  67. ...getTimes(operationTime, ['onlineTime', 'offlineTime'], 'YYYY-MM-DD')
  68. })
  69. message.success('添加成功')
  70. } else if (props.type === 'edit') {
  71. await sysNewsInformationUpdate({
  72. ...res,
  73. ...getTimes(operationTime, ['onlineTime', 'offlineTime'], 'YYYY-MM-DD'),
  74. id: props.data.id
  75. })
  76. message.success('修改成功')
  77. }
  78. emit('getList')
  79. emit('close')
  80. } catch {
  81. //
  82. }
  83. setTimeout(() => {
  84. btnLoading.value = false
  85. }, 100)
  86. })
  87. }
  88. onMounted(async () => {
  89. // 初始化数据
  90. if (props.type === 'edit') {
  91. const data = props.data
  92. forms.title = data.title
  93. forms.coverImage = data.coverImage
  94. forms.linkUrl = data.linkUrl
  95. forms.showTime = data.showTime
  96. if (data.onlineTime && data.offlineTime) {
  97. forms.operationTime = [
  98. dayjs(data.onlineTime).valueOf(),
  99. dayjs(data.offlineTime).valueOf()
  100. ]
  101. }
  102. forms.clientType = data.clientType
  103. forms.status = data.status
  104. }
  105. })
  106. // 只能输入数字
  107. const onlyAllowNumber = (value: string) => !value || /^\d+$/.test(value)
  108. return () => (
  109. <div style="background: #fff; padding-top: 12px">
  110. <NForm model={forms} ref={formsRef} label-placement="left" label-width="auto">
  111. <NFormItem
  112. label="客户端"
  113. path="clientType"
  114. rule={[
  115. {
  116. required: true,
  117. message: '请选择客户端'
  118. }
  119. ]}
  120. >
  121. <NSelect
  122. options={props.clientTypeList}
  123. placeholder="请选择客户端"
  124. v-model:value={forms.clientType}
  125. />
  126. </NFormItem>
  127. <NFormItem
  128. label="广告标题"
  129. path="title"
  130. rule={[
  131. {
  132. required: true,
  133. message: '请输入广告标题'
  134. }
  135. ]}
  136. >
  137. <NInput
  138. v-model:value={forms.title}
  139. placeholder="请输入广告标题"
  140. clearable
  141. showCount
  142. maxlength={15}
  143. />
  144. </NFormItem>
  145. <NFormItem
  146. label="显示时长"
  147. path="showTime"
  148. rule={[
  149. {
  150. required: true,
  151. message: '请输入显示时长'
  152. }
  153. ]}
  154. >
  155. <NInput
  156. v-model:value={forms.showTime}
  157. placeholder="请输入显示时长"
  158. clearable
  159. allowInput={onlyAllowNumber}
  160. >
  161. {{ suffix: () => '秒' }}
  162. </NInput>
  163. </NFormItem>
  164. <NFormItem
  165. label="生效时间"
  166. path="operationTime"
  167. rule={[
  168. {
  169. required: true,
  170. message: '请输入生效时间'
  171. }
  172. ]}
  173. >
  174. <NDatePicker
  175. v-model:value={forms.operationTime}
  176. type="daterange"
  177. startPlaceholder="生效开始时间"
  178. endPlaceholder="生效结束时间"
  179. clearable
  180. isDateDisabled={(ts: number) => {
  181. return ts < dayjs(dayjs().format('YYYY-MM-DD')).valueOf()
  182. }}
  183. style={{ width: '100%', textAlign: 'left' }}
  184. />
  185. </NFormItem>
  186. <NFormItem label="跳转链接" path="linkUrl">
  187. <NInput v-model:value={forms.linkUrl} placeholder="请输入跳转链接" clearable />
  188. </NFormItem>
  189. <NFormItem
  190. label="广告图片"
  191. path="coverImage"
  192. rule={[
  193. {
  194. required: true,
  195. message: '请输入广告图片',
  196. trigger: ['input', 'blur']
  197. }
  198. ]}
  199. >
  200. <UploadFile
  201. v-model:fileList={forms.coverImage}
  202. accept=".jpg,.jpeg,.png"
  203. cropper
  204. bucketName="news-info"
  205. options={{
  206. enlarge: 2,
  207. autoCropWidth: 258, //默认生成截图框宽度
  208. autoCropHeight: 355 //默认生成截图框高度
  209. }}
  210. tips="请上传尺寸为516*710,大小1M以内的JPG、PNG图片"
  211. />
  212. </NFormItem>
  213. </NForm>
  214. <NSpace justify="end">
  215. <NButton type="default" onClick={() => emit('close')}>
  216. 取消
  217. </NButton>
  218. <NButton
  219. type="primary"
  220. onClick={() => onSubmit()}
  221. loading={btnLoading.value}
  222. disabled={btnLoading.value}
  223. >
  224. 保存
  225. </NButton>
  226. </NSpace>
  227. </div>
  228. )
  229. }
  230. })