index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { useAjax } from "@/Hook/useAjax";
  2. import { addProfilesApi, delProfilesApi, getProfilesApi } from "@/services/adqV3/global";
  3. import { PlusOutlined, SearchOutlined } from "@ant-design/icons";
  4. import { Button, Card, Form, Input, Modal, Select, Space, Table, message, Image, Divider } from "antd";
  5. import React, { useEffect, useState } from "react"
  6. import '../../tencentAdPutIn/index.less'
  7. import profilesColumns from "./tableConfig";
  8. import SelectCloudNew from "../../material/cloudNew/selectCloudNew";
  9. /**
  10. * 头像昵称跳转页
  11. * @returns
  12. */
  13. const Profiles: React.FC = () => {
  14. /***************************************/
  15. const [addVisible, setAddVisible] = useState<boolean>(false)
  16. const [initialValues, setInitialValues] = useState<any>({})
  17. const [form] = Form.useForm()
  18. const [queryForm, setQueryForm] = useState<{ profileName?: string }>({})
  19. const getProfiles = useAjax((params) => getProfilesApi(params))
  20. const addProfiles = useAjax((params) => addProfilesApi(params))
  21. const delProfiles = useAjax((params) => delProfilesApi(params))
  22. /***************************************/
  23. // 获取列表
  24. useEffect(() => {
  25. getProfiles.run(queryForm)
  26. }, [queryForm])
  27. // 新增修改
  28. const handleOk = async () => {
  29. form.submit()
  30. let { imageData, ...data } = await form.validateFields()
  31. addProfiles.run({ ...imageData, ...data }).then(res => {
  32. if (res) {
  33. message.success('新增成功')
  34. setAddVisible(false)
  35. getProfiles.refresh()
  36. }
  37. })
  38. setInitialValues({})
  39. }
  40. /** 删除 */
  41. const del = (id: number) => {
  42. delProfiles.run({ id }).then(res => {
  43. if (res) {
  44. message.success('删除成功')
  45. getProfiles.refresh()
  46. }
  47. })
  48. }
  49. return <Card
  50. className="cardResetCss"
  51. title={<div className="flexStart" style={{ gap: 8 }}>
  52. <Input style={{ width: 200 }} placeholder="请输入头像昵称跳转页" value={queryForm?.profileName} allowClear onChange={(e) => setQueryForm({ ...queryForm, profileName: e.target.value })} />
  53. <Button type="primary" icon={<SearchOutlined />} onClick={() => getProfiles.refresh()}>搜索</Button>
  54. <Button type="primary" icon={<PlusOutlined />} onClick={() => { setAddVisible(true); setInitialValues({}), form.resetFields() }}>上传头像昵称跳转页</Button>
  55. </div>}
  56. >
  57. <Table
  58. columns={profilesColumns(del)}
  59. dataSource={getProfiles?.data}
  60. size="small"
  61. loading={getProfiles?.loading}
  62. scroll={{ y: 600 }}
  63. bordered
  64. rowKey={'id'}
  65. />
  66. {addVisible && <Modal className="modalResetCss" title="上传头像昵称跳转页" open={addVisible} confirmLoading={addProfiles.loading} onOk={handleOk} onCancel={() => setAddVisible(false)}>
  67. <Form
  68. name="basicProfiles"
  69. form={form}
  70. layout='vertical'
  71. autoComplete="off"
  72. initialValues={{ ...initialValues }}
  73. >
  74. <Form.Item label={<strong>头像</strong>} name="imageData" rules={[{ required: true, message: '请选择头像!' }]}>
  75. <UploadImageOrMd5 />
  76. </Form.Item>
  77. <Form.Item label={<strong>昵称</strong>} name="profileName" rules={[{ required: true, message: '请输入昵称!' }]}>
  78. <Input placeholder="请输入昵称" maxLength={12} />
  79. </Form.Item>
  80. <Form.Item label={<strong>详细描述</strong>} name="description">
  81. <Input.TextArea placeholder="请输入详细描述" maxLength={120} />
  82. </Form.Item>
  83. </Form>
  84. </Modal>}
  85. </Card>
  86. }
  87. export default React.memo(Profiles)
  88. interface ImageProps {
  89. onChange?: (data: { imageUrl: string, imageMd5: string }) => void,
  90. value?: { imageUrl: string, imageMd5: string }
  91. }
  92. /**
  93. * 处理选择图片Form
  94. * @returns
  95. */
  96. const UploadImageOrMd5: React.FC<ImageProps> = (props) => {
  97. /*********************/
  98. const { onChange, value } = props
  99. const [selectImgVisible, setSelectImgVisible] = useState<boolean>(false)
  100. const [selectCloudData, setSelectCloudData] = useState<{
  101. defaultParams: {
  102. sizeQueries?: {
  103. width: number,
  104. height: number,
  105. relation: string
  106. }[],
  107. materialType: 'image' | 'video'
  108. fileSize: number
  109. }
  110. num: number
  111. }>()
  112. /*********************/
  113. const setImg = (content: any[]) => {
  114. console.log(content)
  115. onChange && onChange({ imageUrl: content[0]?.oss_url, imageMd5: content[0]?.md5 })
  116. setSelectImgVisible(false)
  117. }
  118. const selectImg = () => {
  119. setSelectCloudData({
  120. defaultParams: {
  121. sizeQueries: [{ relation: '=', width: 512, height: 512 }],
  122. fileSize: 400 * 1024,
  123. materialType: 'image'
  124. },
  125. num: 1
  126. })
  127. setSelectImgVisible(true)
  128. }
  129. return <>
  130. {value?.imageUrl ? <img src={value?.imageUrl} onClick={selectImg} width={100} height={100} /> : <Button onClick={selectImg}>选择图片</Button>}
  131. <div style={{ fontSize: 12, color: 'rgba(0,0,0,.5)' }}>
  132. <div>图片尺寸:512×512 像素</div>
  133. <div>图片格式:大小要求在 400KB 以内,仅支持 jpg 和 png 格式</div>
  134. </div>
  135. {/* 选择素材 */}
  136. {(selectImgVisible && selectCloudData) && <SelectCloudNew
  137. {...selectCloudData}
  138. visible={selectImgVisible}
  139. onClose={() => {
  140. setSelectImgVisible(false)
  141. setSelectCloudData(undefined)
  142. }}
  143. onChange={setImg}
  144. />}
  145. </>
  146. }
  147. export const SelectProfiles: React.FC<{ value?: number, onChange?: (value?: number) => void }> = ({ value, onChange }) => {
  148. /*******************************/
  149. const getProfiles = useAjax((params) => getProfilesApi(params))
  150. /*******************************/
  151. // 获取列表
  152. useEffect(() => {
  153. getProfiles.run({})
  154. }, [])
  155. return <Select
  156. showSearch
  157. allowClear
  158. placeholder="选择头像昵称跳转页"
  159. filterOption={(input, option) =>
  160. ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
  161. }
  162. style={{ width: 480 }}
  163. dropdownRender={menu => <>
  164. {menu}
  165. <Divider style={{ margin: '8px 0' }} />
  166. <div>
  167. <Button type="link" onClick={() => {
  168. window.location.href = '/#/launchSystemV3/tencenTasset/profiles'
  169. }}>前往管理</Button>
  170. {/* <Link href="/#/launchSystemV3/tencenTasset/profiles" target="_blank">
  171. 前往管理
  172. </Link> */}
  173. </div>
  174. </>}
  175. value={value}
  176. onChange={(e) => onChange?.(e)}
  177. >
  178. {getProfiles?.data?.map((item: { id: number; headImageUrl: string; profileName: string; }) => <Select.Option value={item.id} key={item.id}>
  179. <Space>
  180. <Image width={20} style={{ borderRadius: 4 }} src={item.headImageUrl} />
  181. <span>{item.profileName}</span>
  182. </Space>
  183. </Select.Option>)}
  184. </Select>
  185. }