index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div class="system-systemParameter-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd100">
  4. <el-divider content-position="center"><h4 class="table-title">系统参数设置</h4></el-divider>
  5. <el-form :model="state.ruleForm" label-width="200px" ref="ruleFormRef" v-loading="state.loading" class="form">
  6. <el-row :gutter="35">
  7. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-for="items in state.data" :key="items.id">
  8. <!-- <el-divider content-position="left">{{ items.groupName }}</el-divider> -->
  9. <div v-for="item in items.systemSettings" :key="item.id">
  10. <el-form-item :label="item.settingName">
  11. <!-- 单选框 -->
  12. <template v-if="item.valueType === 0">
  13. <el-radio-group v-model="item.settingValue" class="ml-4" @change="changeVal($event, item.id)">
  14. <el-radio :label="item1.value" v-for="item1 in item.presetValue" :key="item1.value">{{ item1.key }}</el-radio>
  15. </el-radio-group>
  16. </template>
  17. <!-- 多选框 -->
  18. <template v-else-if="item.valueType === 1">
  19. <el-checkbox-group v-model="item.settingValue" @change="changeVal($event, item.id)">
  20. <el-checkbox v-for="item1 in item.presetValue" :key="item1.value" :label="item1.value">{{ item1.key }}</el-checkbox>
  21. </el-checkbox-group>
  22. </template>
  23. <!-- 文本 -->
  24. <template v-else-if="item.valueType === 2">
  25. <el-input
  26. v-model="item.settingValue"
  27. :placeholder="'请输入' + item.settingName"
  28. class="maxwidth400"
  29. @input="changeVal($event, item.id)"
  30. />
  31. </template>
  32. <!-- 数字 -->
  33. <template v-else-if="item.valueType === 3">
  34. <el-input-number v-model="item.settingValue" :placeholder="'请输入' + item.settingName" @input="changeVal($event, item.id)" />
  35. </template>
  36. <!-- 下拉框 -->
  37. <template v-else-if="item.valueType === 4">
  38. <el-select v-model="item.settingValue" :placeholder="'请选择' + item.settingName" @change="changeVal($event, item.id)">
  39. <el-option v-for="item1 in item.presetValue" :key="item1.value" :label="item1.key" :value="item1.value" />
  40. </el-select>
  41. </template>
  42. <!-- 开关 -->
  43. <template v-else-if="item.valueType === 5">
  44. <el-switch v-model="item.settingValue" @change="changeVal($event, item.id)" />
  45. </template>
  46. <!-- 时间 -->
  47. <template v-else-if="item.valueType === 6">
  48. <el-time-select
  49. v-model="item.settingValue"
  50. start="00:00"
  51. step="00:30"
  52. end="23:30"
  53. :placeholder="'请选择' + item.settingName"
  54. @change="changeVal($event, item.id)"
  55. />
  56. </template>
  57. <!-- 日期 -->
  58. <template v-else-if="item.valueType === 7">
  59. <el-date-picker
  60. v-model="item.settingValue"
  61. value-format="YYYY-MM-DD[T]HH:mm:ss"
  62. type="date"
  63. :placeholder="'请选择' + item.settingName"
  64. @change="changeVal($event, item.id)"
  65. />
  66. </template>
  67. <!-- 日期区间 -->
  68. <template v-else-if="item.valueType === 8">
  69. <div>
  70. <el-date-picker
  71. v-model="item.settingValue"
  72. value-format="YYYY-MM-DD[T]HH:mm:ss"
  73. type="daterange"
  74. :placeholder="'请选择' + item.settingName"
  75. @change="changeVal($event, item.id)"
  76. range-separator="至"
  77. start-placeholder="开始日期"
  78. end-placeholder="结束日期"
  79. />
  80. </div>
  81. </template>
  82. <!-- 时间区间 -->
  83. <template v-else-if="item.valueType === 9">
  84. <el-time-select
  85. v-model="item.settingValue[0]"
  86. :max-time="item.settingValue[1]"
  87. placeholder="开始时间"
  88. start="00:00"
  89. step="00:30"
  90. end="23:30"
  91. @change="changeVal($event, item.id, 'startTime')"
  92. />
  93. <el-time-select
  94. v-model="item.settingValue[1]"
  95. :min-time="item.settingValue[0]"
  96. placeholder="结束时间"
  97. start="00:00"
  98. step="00:30"
  99. end="23:30"
  100. @change="changeVal($event, item.id, 'endTime')"
  101. />
  102. </template>
  103. <!-- 单个图片上传 -->
  104. <template v-else-if="item.valueType === 10">
  105. <el-upload
  106. class="avatar-uploader"
  107. accept=".jpg, .jpeg, .png, .gif, .bmp, .JPG, .JPEG, .PBG, .GIF, .BMP"
  108. action=""
  109. :show-file-list="false"
  110. :on-success="handleAvatarSuccess"
  111. :http-request="(file:any) => uploadImg(file, item.id)"
  112. :before-upload="beforeAvatarUpload"
  113. >
  114. <img v-if="imageUrl" :src="imageUrl" class="avatar" />
  115. <SvgIcon v-else class="avatar-uploader-icon" name="ele-Plus" size="32px" />
  116. </el-upload>
  117. </template>
  118. <!-- 多个图片上传 -->
  119. <template v-else-if="item.valueType === 11">
  120. <el-upload
  121. v-model:file-list="fileList"
  122. accept=".jpg, .jpeg, .png, .gif, .bmp, .JPG, .JPEG, .PBG, .GIF, .BMP"
  123. action=""
  124. list-type="picture-card"
  125. ref="uploadListRef"
  126. :autoUpload="false"
  127. :on-change="(file:any, fileList:any) => uploadImgList(file, fileList, item.id)"
  128. >
  129. <SvgIcon name="ele-Plus" size="32px" />
  130. <template #file="file">
  131. <div style="text-align: center" class="w100 h100">
  132. <div class="images w100 h100" v-viewer>
  133. <img class="w100 h100" :src="file.file.url" />
  134. </div>
  135. <span class="el-upload-list__item-actions">
  136. <span title="预览图片" class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
  137. <SvgIcon name="ele-ZoomIn" size="18px" />
  138. </span>
  139. <span title="删除图片" class="el-upload-list__item-delete" @click="handleRemove(file)">
  140. <SvgIcon name="ele-Delete" size="18px" />
  141. </span>
  142. </span>
  143. </div>
  144. </template>
  145. </el-upload>
  146. </template>
  147. </el-form-item>
  148. </div>
  149. </el-col>
  150. </el-row>
  151. <el-form-item>
  152. <el-button type="primary" @click="submitForm" :loading="state.loading" v-auth="'100301'">保 存 </el-button>
  153. <el-button @click="resetForm" :loading="state.loading" v-auth="'100301'">重 置</el-button>
  154. </el-form-item>
  155. </el-form>
  156. </div>
  157. </div>
  158. </template>
  159. <script lang="ts" setup name="systemParameter">
  160. import { reactive, ref, onMounted } from 'vue';
  161. import { getsyssettings, modifysettings } from '/@/api/system/parameter';
  162. import { ElMessage } from 'element-plus';
  163. import type { UploadProps, UploadUserFile } from 'element-plus';
  164. import { api as viewerApi } from 'v-viewer';
  165. // 定义接口来定义对象的类型
  166. interface SystemState {
  167. ruleForm: object;
  168. data: Array<any>;
  169. formateData: Array<any>;
  170. loading: boolean;
  171. }
  172. // 定义变量内容
  173. const timeRageRef = ref<any>(['', '']);
  174. const uploadListRef = ref();
  175. const state = reactive<SystemState>({
  176. ruleForm: {},
  177. data: [],
  178. formateData: [],
  179. loading: false,
  180. });
  181. //获取参数列表
  182. const getSetList = () => {
  183. state.loading = true;
  184. state.formateData = [];
  185. getsyssettings()
  186. .then((res: any) => {
  187. state.data = res?.result ?? [];
  188. for (let j of state.data) {
  189. for (let i of j.systemSettings) {
  190. state.formateData.push({
  191. id: i.id,
  192. value: i.settingValue ? i.settingValue : i.valueType == 5 ? 'false' : null,
  193. valueType: i.valueType,
  194. });
  195. if (i.presetValue) {
  196. // 默认数据
  197. i.presetValue = JSON.parse(i.presetValue);
  198. }
  199. if (i.valueType == 1 && i.settingValue == null) {
  200. //多选
  201. i.settingValue = [];
  202. } else if (i.valueType == 1 && i.settingValue) {
  203. i.settingValue = i.settingValue.split(',');
  204. } else if (i.valueType == 8 && i.settingValue) {
  205. i.settingValue = i.settingValue.split(',');
  206. } else if (i.valueType == 9 && i.settingValue) {
  207. // 时间区间
  208. i.settingValue = i.settingValue.split(',');
  209. timeRageRef.value = [i.settingValue[0], i.settingValue[1]];
  210. }
  211. if (i.valueType == 5 && i.settingValue) {
  212. // 开关
  213. i.settingValue = JSON.parse(i.settingValue);
  214. }
  215. if (i.valueType == 3 && i.settingValue) {
  216. // 开关
  217. i.settingValue = Number(i.settingValue);
  218. }
  219. }
  220. }
  221. state.loading = false;
  222. })
  223. .catch(() => {
  224. state.loading = false;
  225. });
  226. };
  227. // 处理提交数据
  228. const changeVal = (val: any, id: string | number, startOrEnd?: string) => {
  229. state.formateData.forEach((item: any) => {
  230. if (item.id == id) {
  231. item.value = val;
  232. if (item.valueType == 1 || item.valueType == 8) {
  233. // 多选 日期区间
  234. item.value = val.join(',');
  235. }
  236. if (item.valueType == 9) {
  237. // 时间区间
  238. if (startOrEnd == 'startTime') {
  239. // 开始时间
  240. timeRageRef.value[0] = val;
  241. item.value = timeRageRef.value.join(',');
  242. } else if (startOrEnd == 'endTime') {
  243. // 结束时间
  244. timeRageRef.value[1] = val;
  245. item.value = timeRageRef.value.join(',');
  246. }
  247. }
  248. if (item.valueType == 5 || item.valueType == 3) {
  249. // 开关 数字输入
  250. item.value = String(val);
  251. }
  252. }
  253. });
  254. };
  255. // 单个上传列表
  256. const imageUrl = ref('https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100');
  257. const handleAvatarSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {
  258. imageUrl.value = URL.createObjectURL(uploadFile.raw!);
  259. };
  260. // 单个图片上传
  261. const uploadImg = (response: any, uploadFile: any) => {
  262. console.log(response, uploadFile);
  263. };
  264. // 上传之前限制大小和类型
  265. const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  266. if (rawFile.type !== 'image/jpeg') {
  267. ElMessage.error('Avatar picture must be JPG format!');
  268. return false;
  269. } else if (rawFile.size / 1024 / 1024 > 2) {
  270. ElMessage.error('Avatar picture size can not exceed 2MB!');
  271. return false;
  272. }
  273. return true;
  274. };
  275. // 上传列表
  276. const fileList = ref<UploadUserFile[]>([
  277. {
  278. name: 'food.jpeg',
  279. url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100',
  280. },
  281. ]);
  282. // 多张图片上传
  283. const uploadImgList = (file: any, list: any, id: any) => {
  284. console.log(file, list, id);
  285. fileList.value = list;
  286. };
  287. // 删除图片(多张)
  288. const handleRemove = (uploadFile: any) => {
  289. uploadListRef.value[0].handleRemove(uploadFile.file);
  290. };
  291. // 预览图片 多张
  292. const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile: any) => {
  293. for (let i = 0; i < document.querySelectorAll('.images').length; i++) {
  294. if (uploadFile.file.url === document.querySelectorAll('.images')[i].getElementsByTagName('img')[0].src) {
  295. viewerApi({
  296. options: {
  297. toolbar: true,
  298. url: 'url',
  299. initialViewIndex: i,
  300. },
  301. images: fileList.value,
  302. });
  303. break;
  304. }
  305. }
  306. };
  307. // 保存
  308. const submitForm = () => {
  309. modifysettings({ list: state.formateData })
  310. .then(() => {
  311. ElMessage.success('配置成功');
  312. getSetList();
  313. })
  314. .catch(() => {});
  315. };
  316. const resetForm = () => {
  317. getSetList();
  318. };
  319. // 页面加载时
  320. onMounted(() => {
  321. getSetList();
  322. });
  323. </script>
  324. <style lang="scss" scoped>
  325. .system-systemParameter-container {
  326. .pd100 {
  327. padding: 0 10vw;
  328. }
  329. .maxwidth400 {
  330. max-width: 214px;
  331. }
  332. .form {
  333. flex: 1;
  334. overflow-y: auto;
  335. overflow-x: hidden;
  336. }
  337. .avatar-uploader .avatar {
  338. width: 178px;
  339. height: 178px;
  340. display: block;
  341. }
  342. }
  343. </style>
  344. <style>
  345. .avatar-uploader .el-upload {
  346. border: 1px dashed var(--el-border-color);
  347. border-radius: 6px;
  348. cursor: pointer;
  349. position: relative;
  350. overflow: hidden;
  351. transition: var(--el-transition-duration-fast);
  352. }
  353. .avatar-uploader .el-upload:hover {
  354. border-color: var(--el-color-primary);
  355. }
  356. .el-icon.avatar-uploader-icon {
  357. font-size: 28px;
  358. color: #8c939d;
  359. width: 178px;
  360. height: 178px;
  361. text-align: center;
  362. }
  363. </style>