index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <!--
  2. * @Author:
  3. * @Date: 2023-03-01 19:20:44
  4. * @LastEditors: guicheng 1625811865@qq.com
  5. * @LastEditTime: 2024-07-10 12:05:52
  6. * @Description: kxs files
  7. * @filePath:
  8. -->
  9. <script lang="ts">
  10. // 声明额外的选项
  11. export default {
  12. name: "Add"
  13. };
  14. </script>
  15. <script setup lang="ts">
  16. import { inject, onMounted, reactive, ref, Uploadfile, UploadImg, Editor, useRenderIcon, ElMessage, ElMessageBox, Upload, Close, http, getGroupUrl, RegularVerification, verification } from "@/utils/importUsed"
  17. // 接口列表实例
  18. const UserUrl = ref(null)
  19. // 获取当前板块接口列表
  20. onMounted(async () => {
  21. UserUrl.value = await getGroupUrl(["User"]);
  22. })
  23. // 组件传参对象
  24. const props = defineProps<{
  25. submit: Function;
  26. addVisible: {
  27. type: Boolean;
  28. default: false;
  29. };
  30. width: {
  31. type: Number;
  32. default: 50;
  33. };
  34. }>();
  35. // 表单数据
  36. const UpdateForm = ref({
  37. RealName: "",
  38. AdminName: "",
  39. PassWord: "",
  40. RoleId: "",
  41. content: "",
  42. upLoadFile: "",
  43. upLoadImg: "",
  44. });
  45. // 表单实例
  46. const ruleFormRef = ref()
  47. // 富文本实例
  48. const childComp = ref();
  49. // 传参选项数据
  50. // 选项卡参数(默认值为列表某项的id)
  51. const activeId = ref("1");
  52. const optionList = [
  53. { Id: "1", label: "推荐" },
  54. { Id: "2", label: "实物" },
  55. { Id: "3", label: "虚拟商品" }
  56. ];
  57. // 穿梭框数据
  58. const transferdata = ref([
  59. { key: 1, label: "1", disabled: false },
  60. { key: 2, label: "2", disabled: false },
  61. { key: 3, label: "3", disabled: false },
  62. { key: 4, label: "4", disabled: false },
  63. { key: 5, label: "5", disabled: false },
  64. { key: 6, label: "6", disabled: false }
  65. ]);
  66. // 提交函数
  67. const submit = async () => {
  68. // 表单校验拦截
  69. if (!formEl) return
  70. await formEl.validate((valid, fields) => {
  71. if (valid) {
  72. //表单校验成功回调
  73. console.log('submit!')
  74. // 富文本实例赋值
  75. UpdateForm.value.content = childComp.value.valueHtml;
  76. // 需动态生成接口
  77. const { status, info }: any = http.Request({
  78. url: UserUrl.User.userSearch.method,
  79. method: UserUrl.User.userSearch.url,
  80. params: UpdateForm.value
  81. });
  82. if (status === "1") {
  83. //业务成功回调
  84. ElMessage({
  85. message: "新增成功",
  86. type: "success"
  87. });
  88. // 关闭新增弹窗;
  89. closeVisible()
  90. } else {
  91. //业务失败回调
  92. ElMessageBox.alert(info, "提示", {
  93. confirmButtonText: "关闭",
  94. type: "warning"
  95. });
  96. }
  97. } else {
  98. //表单校验失败回调
  99. ElMessage({
  100. message: "请输入完整信息",
  101. type: "error"
  102. });
  103. }
  104. })
  105. };
  106. // 选项卡切换回调
  107. const handleClick = () => {
  108. console.log("切换选项卡");
  109. };
  110. //上传文件回调
  111. const UploadFileCallBack = (url) => {
  112. ElMessage({
  113. message: `文件上传成功:${url}`,
  114. type: "success"
  115. });
  116. UpdateForm.value.upLoadFile = url;
  117. }
  118. //上传图片回调
  119. const UploadImgCallBack = (url) => {
  120. ElMessage({
  121. message: `图片上传成功:${url}`,
  122. type: "success"
  123. });
  124. UpdateForm.value.upLoadImg = url;
  125. }
  126. // 表单校验规则
  127. const rules = reactive({
  128. RealName: [
  129. // 必传
  130. { required: true, message: '请输入账户名称', trigger: 'blur' },
  131. // 长度
  132. { min: 3, max: 5, message: '长度为3-5', trigger: 'blur' },
  133. // 时间类型必填
  134. {
  135. type: 'date',
  136. required: true,
  137. message: '请选择正确时间类型',
  138. trigger: 'blur',
  139. },
  140. // 封装正则
  141. {
  142. validator: (rule: any, value: any, callback: any) => {
  143. verification.verificationName(value, callback)
  144. }, trigger: 'blur'
  145. },
  146. // 自定义正则
  147. {
  148. validator: (rule: any, value: any, callback: any) => {
  149. // 自定义正则替换
  150. const regular = /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
  151. RegularVerification(regular, value, callback)
  152. }, trigger: 'blur'
  153. },
  154. ],
  155. })
  156. // 关闭弹窗回调函数
  157. const closeFn: any = inject("closeAddVisible");
  158. const closeVisible = () => {
  159. // 清空表单项;
  160. ruleFormRef.value.resetFields();
  161. closeFn();
  162. };
  163. // 弹窗是否全屏
  164. const isFullscreen = ref(false)
  165. </script>
  166. <template lang="pug">
  167. .main
  168. el-dialog(v-model='props.addVisible' width="50%" :fullscreen="isFullscreen" title="新增" draggable @close="closeVisible")
  169. //- 有选项卡模板
  170. el-tabs(v-model="activeId" class="demo-tabs" @tab-click="handleClick")
  171. el-tab-pane(label="选项卡一" name="1")
  172. el-form(ref="ruleFormRef" :model='UpdateForm' label-position="right" label-width="100px" :rules="rules")
  173. el-form-item(label='账户名称1' prop="RealName")
  174. el-input(v-model='UpdateForm.RealName' autocomplete='off'
  175. placeholder="请输入账户名称")
  176. el-form-item(label='用户名' prop="AdminName")
  177. el-input(v-model='UpdateForm.AdminName' autocomplete='off'
  178. placeholder="请输入用户名")
  179. el-form-item(label='密码' prop="PassWord")
  180. el-input(v-model='UpdateForm.PassWord' autocomplete='off'
  181. placeholder="请输入密码")
  182. el-form-item(label="角色:", prop="RoleId")
  183. el-select(
  184. v-model="UpdateForm.RoleId",
  185. placeholder="请选择用户角色",
  186. clearable
  187. )
  188. el-option(:label="item.label", :value="item.Id" v-for="(item, index) in optionList")
  189. el-tab-pane(label="选项卡二" name="2")
  190. el-form(:model='UpdateForm' label-position="right" label-width="100px")
  191. el-form-item(label='账户名称2' prop="RealName")
  192. el-input(v-model='UpdateForm.RealName' autocomplete='off'
  193. placeholder="请输入账户名称")
  194. el-form-item(label='用户名' prop="AdminName")
  195. el-input(v-model='UpdateForm.AdminName' autocomplete='off'
  196. placeholder="请输入用户名")
  197. el-form-item(label='密码' prop="PassWord")
  198. el-input(v-model='UpdateForm.PassWord' autocomplete='off'
  199. placeholder="请输入密码")
  200. el-form-item(label="角色:", prop="RoleId")
  201. el-select(
  202. v-model="UpdateForm.RoleId",
  203. placeholder="请选择用户角色",
  204. clearable
  205. )
  206. el-option(:label="item.label", :value="item.Id" v-for="(item, index) in optionList")
  207. //- 无选项卡模板
  208. el-form(:model='UpdateForm' label-position="right" label-width="100px")
  209. el-form-item(label='账户名称' prop="RealName")
  210. el-input(v-model='UpdateForm.RealName' autocomplete='off'
  211. placeholder="请输入账户名称")
  212. el-form-item(label='用户名' prop="AdminName")
  213. el-input(v-model='UpdateForm.AdminName' autocomplete='off'
  214. placeholder="请输入用户名")
  215. el-form-item(label='密码' prop="PassWord")
  216. el-input(v-model='UpdateForm.PassWord' autocomplete='off'
  217. placeholder="请输入密码")
  218. el-form-item(label="角色:", prop="RoleId")
  219. el-select(
  220. v-model="UpdateForm.RoleId",
  221. placeholder="请选择用户角色",
  222. clearable
  223. )
  224. el-option(:label="item.label", :value="item.Id" v-for="(item, index) in optionList")
  225. el-form-item(label='取色器' prop="PassWord")
  226. el-color-picker(v-model="UpdateForm.AdminName" show-alpha)
  227. el-form-item(label='数字输入框' prop="PassWord")
  228. el-input-number(v-model="UpdateForm.PassWord" :min="1" :max="10")
  229. el-form-item(label='滑块' prop="PassWord")
  230. el-slider(v-model="UpdateForm.PassWord")
  231. el-form-item(label='开关' prop="PassWord")
  232. el-switch(v-model="UpdateForm.PassWord")
  233. el-form-item(label='单选框' prop="PassWord")
  234. el-radio-group(v-model="UpdateForm.PassWord")
  235. el-radio(:value="1") Option A
  236. el-radio(:value="2") Option B
  237. el-radio(:value="3") Option C
  238. el-form-item(label='评分' prop="PassWord")
  239. el-rate(v-model="UpdateForm.PassWord")
  240. el-form-item(label='穿梭框' prop="AdminName")
  241. el-transfer(v-model="UpdateForm.AdminName" :data="transferdata")
  242. el-form-item(label='上传文件' prop="Uploadfile")
  243. el-input(v-model='UpdateForm.upLoadFile' autocomplete='off' disabled)
  244. Uploadfile(btntext="上传文件" :FilePath="UploadFileCallBack")
  245. el-form-item(label='上传图片' prop="UploadImg")
  246. UploadImg(:cropper="true" :callBack="UploadImgCallBack")
  247. el-form-item(label='富文本' prop="childComp")
  248. Editor(ref="childComp")
  249. .flex.justify-end
  250. el-button(
  251. :icon="useRenderIcon(Close)",
  252. @click="closeVisible"
  253. ) 关闭
  254. el-button(
  255. type="primary",
  256. :icon="useRenderIcon(Upload)",
  257. @click="submit(ruleFormRef)"
  258. ) 确认提交
  259. </template>
  260. <style scoped lang="scss">
  261. :deep(.el-dropdown-menu__item i) {
  262. margin: 0;
  263. }
  264. :deep(.el-form-item__label) {
  265. font-weight: 700;
  266. }
  267. :deep(.el-pagination) {
  268. flex-flow: wrap;
  269. }
  270. :deep(.is-draggable) {
  271. max-height: 80vh;
  272. overflow: auto;
  273. }
  274. :deep(.el-dialog__header) {
  275. position: sticky;
  276. top: 0;
  277. z-index: 2;
  278. background: #fff;
  279. }
  280. .collapsedom {
  281. padding: 0 20px;
  282. background-color: #fff;
  283. }
  284. .ovh-x {
  285. height: 40vh;
  286. overflow-y: auto;
  287. }
  288. :deep(.el-descriptions__header) {
  289. margin: 16px 0 !important;
  290. }
  291. .el-select {
  292. width: 100%;
  293. }
  294. </style>