index.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import { useAjax } from "@/Hook/useAjax"
  2. import SelectCloud from "@/pages/launchSystemNew/components/selectCloud"
  3. import { PlusOutlined } from "@ant-design/icons"
  4. import { Button, Divider, Form, Input, message, Modal, Select, Space, Table } from "antd"
  5. import React, { useEffect, useState } from "react"
  6. import { useModel } from "umi"
  7. import brandColumns from "./tableConfig"
  8. import { addSysBrandApi, delSysBrandApi, editSysBrandApi, getSysBrandApi } from "@/services/adqV3/global"
  9. interface Props {
  10. onChange?: (data: any) => void,
  11. value?: any,
  12. id?: any
  13. }
  14. /**
  15. * 品牌形象
  16. * @returns
  17. */
  18. const BrandImage: React.FC<Props> = (props) => {
  19. /****************************/
  20. const { onChange, value, id } = props
  21. const [visible, setVisible] = useState<boolean>(false)
  22. const [addVisible, setAddVisible] = useState<boolean>(false)
  23. const [form] = Form.useForm()
  24. const [initialValues, setInitialValues] = useState<any>({})
  25. const getSysBrand = useAjax(() => getSysBrandApi())
  26. const addSysBrand = useAjax((params) => addSysBrandApi(params))
  27. const editSysBrand = useAjax((params) => editSysBrandApi(params))
  28. const delSysBrand = useAjax((params) => delSysBrandApi(params))
  29. /****************************/
  30. // 获取列表
  31. useEffect(() => {
  32. getSysBrand.run()
  33. }, [])
  34. // 新增修改
  35. const handleOk = async () => {
  36. form.submit()
  37. let data = await form.validateFields()
  38. if (Object.keys(initialValues).length > 0) { // 修改
  39. editSysBrand.run({ ...data, sysBrandId: initialValues.id }).then(res => {
  40. if (res) {
  41. message.success('修改成功')
  42. setAddVisible(false)
  43. getSysBrand.refresh()
  44. }
  45. })
  46. } else { // 新增
  47. addSysBrand.run(data).then(res => {
  48. if (res) {
  49. message.success('新增成功')
  50. setAddVisible(false)
  51. getSysBrand.refresh()
  52. }
  53. })
  54. }
  55. setInitialValues({})
  56. }
  57. /** 删除 */
  58. const del = (id: number) => {
  59. delSysBrand.run({ sysBrandId: id }).then(res => {
  60. if (res) {
  61. message.success('删除成功')
  62. getSysBrand.refresh()
  63. }
  64. })
  65. }
  66. /** 修改 */
  67. const edit = (data: any) => {
  68. setInitialValues(data)
  69. setAddVisible(true)
  70. }
  71. return <div id={id}>
  72. <Select
  73. showSearch
  74. placeholder="请选择一个品牌跳转页,与广告创意一起展示"
  75. optionFilterProp="children"
  76. style={{ width: 400 }}
  77. onChange={(e) => { onChange && onChange(e) }}
  78. allowClear
  79. value={value}
  80. filterOption={(input, option) => {
  81. return (option!.value as unknown as string).toLowerCase().includes(input.toLowerCase())
  82. }}
  83. dropdownRender={menu => <>
  84. {menu}
  85. <Divider style={{ margin: '8px 0' }} />
  86. <div>
  87. <Button type="link" onClick={() => { setAddVisible(true); setInitialValues({}) }}>新增</Button>
  88. <Button type="link" onClick={() => setVisible(true)}>前往管理</Button>
  89. </div>
  90. </>}
  91. >
  92. {
  93. getSysBrand?.data?.map((item: any) => {
  94. return <Select.Option value={item.name + '_' + item.brandImgUrl} key={item.id}>
  95. <Space>
  96. <img src={item.brandImgUrl} style={{ width: 20 }} />
  97. <span>{item.name}</span>
  98. </Space>
  99. </Select.Option>
  100. })
  101. }
  102. </Select>
  103. {visible && <Modal title="品牌形象" width={1000} visible={visible} footer={null} onCancel={() => setVisible(false)}>
  104. <Space direction='vertical' style={{ width: '100%' }}>
  105. <Button type="primary" icon={<PlusOutlined />} onClick={() => { setAddVisible(true); setInitialValues({}) }}>上传品牌形象</Button>
  106. <Table
  107. columns={brandColumns(del, edit)}
  108. dataSource={getSysBrand?.data}
  109. size="small"
  110. loading={getSysBrand?.loading}
  111. scroll={{ y: 300 }}
  112. bordered
  113. rowKey={'id'}
  114. />
  115. </Space>
  116. </Modal>}
  117. {addVisible && <Modal title="上传品牌形象" visible={addVisible} confirmLoading={addSysBrand.loading} onOk={handleOk} onCancel={() => setAddVisible(false)}>
  118. <Form
  119. name="basic"
  120. form={form}
  121. layout='vertical'
  122. autoComplete="off"
  123. initialValues={{ ...initialValues }}
  124. >
  125. <Form.Item label={<strong>头像</strong>} name="brandImgUrl" rules={[{ required: true, message: '请选择头像!' }]}>
  126. <UploadImage />
  127. </Form.Item>
  128. <Form.Item label={<strong>名称</strong>} name="name" rules={[{ required: true, message: '请输入名称!' }]}>
  129. <Input placeholder="请输入名称" maxLength={12} />
  130. </Form.Item>
  131. </Form>
  132. </Modal>}
  133. </div>
  134. }
  135. interface ImageProps {
  136. onChange?: (value: string) => void,
  137. value?: string
  138. }
  139. /**
  140. * 处理选择图片Form
  141. * @returns
  142. */
  143. export const UploadImage: React.FC<ImageProps> = (props) => {
  144. /*********************/
  145. const { onChange, value } = props
  146. const [selectImgVisible, setSelectImgVisible] = useState<boolean>(false)
  147. const [sliderImgContent, setSliderImgContent] = useState<{ url: string, width?: number, height?: number }[]>([]) // 保存回填数据
  148. const { init } = useModel('useLaunchAdq.useBdMediaPup')
  149. /*********************/
  150. useEffect(() => {
  151. if (value) {
  152. setSliderImgContent([{ url: value }])
  153. } else {
  154. setSliderImgContent([])
  155. }
  156. }, [value])
  157. const setImg = (content: any[]) => {
  158. onChange && onChange(content[0]?.url)
  159. setSelectImgVisible(false)
  160. }
  161. const selectImg = () => {
  162. init({ mediaType: 'IMG', cloudSize: [[{ relation: '=', width: 512, height: 512 }]], maxSize: 50 * 1024 })
  163. setTimeout(() => { setSelectImgVisible(true) }, 50)
  164. }
  165. return <>
  166. {value ? <img src={value} onClick={selectImg} width={100} height={100} /> : <Button onClick={selectImg}>选择图片</Button>}
  167. <div style={{ fontSize: 12, color: 'rgba(0,0,0,.5)' }}>
  168. <div>图片尺寸:512×512 像素</div>
  169. <div>图片格式:大小要求在 50KB 以内,仅支持 jpg 和 png 格式</div>
  170. </div>
  171. {/* 选择素材 */}
  172. {selectImgVisible && <SelectCloud visible={selectImgVisible} sliderImgContent={sliderImgContent} onClose={() => setSelectImgVisible(false)} onChange={setImg} />}
  173. </>
  174. }
  175. export default React.memo(BrandImage)