index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  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="ruleForm" label-width="200px" ref="ruleFormRef" v-loading="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 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.sss[Z]"
  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.sss[Z]"
  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="loading" v-auth="'100301'">保 存 </el-button>
  153. <el-button @click="resetForm" :loading="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, toRefs, 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. const { ruleForm, data, loading } = toRefs(state);
  182. //获取参数列表
  183. const getSetList = () => {
  184. loading.value = true;
  185. state.formateData = [];
  186. getsyssettings()
  187. .then((res: any) => {
  188. state.data = res?.result ?? [];
  189. for (let j of state.data) {
  190. for (let i of j.systemSettings) {
  191. state.formateData.push({
  192. id: i.id,
  193. value: i.settingValue ? i.settingValue : i.valueType == 5 ? 'false' : null,
  194. valueType: i.valueType,
  195. });
  196. if (i.presetValue) {
  197. // 默认数据
  198. i.presetValue = JSON.parse(i.presetValue);
  199. }
  200. if (i.valueType == 1 && i.settingValue == null) {
  201. //多选
  202. i.settingValue = [];
  203. } else if (i.valueType == 1 && i.settingValue) {
  204. i.settingValue = i.settingValue.split(',');
  205. } else if (i.valueType == 8 && i.settingValue) {
  206. i.settingValue = i.settingValue.split(',');
  207. } else if (i.valueType == 9 && i.settingValue) {
  208. // 时间区间
  209. i.settingValue = i.settingValue.split(',');
  210. timeRageRef.value = [i.settingValue[0], i.settingValue[1]];
  211. }
  212. if (i.valueType == 5 && i.settingValue) {
  213. // 开关
  214. i.settingValue = JSON.parse(i.settingValue);
  215. }
  216. if (i.valueType == 3 && i.settingValue) {
  217. // 开关
  218. i.settingValue = Number(i.settingValue);
  219. }
  220. }
  221. }
  222. loading.value = false;
  223. })
  224. .catch(() => {
  225. loading.value = false;
  226. });
  227. };
  228. // 处理提交数据
  229. const changeVal = (val: any, id: string | number, startOrEnd?: string) => {
  230. state.formateData.forEach((item: any) => {
  231. if (item.id == id) {
  232. item.value = val;
  233. if (item.valueType == 1 || item.valueType == 8) {
  234. // 多选 日期区间
  235. item.value = val.join(',');
  236. }
  237. if (item.valueType == 9) {
  238. // 时间区间
  239. if (startOrEnd == 'startTime') {
  240. // 开始时间
  241. timeRageRef.value[0] = val;
  242. item.value = timeRageRef.value.join(',');
  243. } else if (startOrEnd == 'endTime') {
  244. // 结束时间
  245. timeRageRef.value[1] = val;
  246. item.value = timeRageRef.value.join(',');
  247. }
  248. }
  249. if (item.valueType == 5 || item.valueType == 3) {
  250. // 开关 数字输入
  251. item.value = String(val);
  252. }
  253. }
  254. });
  255. };
  256. // 单个上传列表
  257. const imageUrl = ref('https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100');
  258. const handleAvatarSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {
  259. imageUrl.value = URL.createObjectURL(uploadFile.raw!);
  260. };
  261. // 单个图片上传
  262. const uploadImg = (response:any, uploadFile:any) => {
  263. console.log(response, uploadFile);
  264. };
  265. // 上传之前限制大小和类型
  266. const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  267. if (rawFile.type !== 'image/jpeg') {
  268. ElMessage.error('Avatar picture must be JPG format!');
  269. return false;
  270. } else if (rawFile.size / 1024 / 1024 > 2) {
  271. ElMessage.error('Avatar picture size can not exceed 2MB!');
  272. return false;
  273. }
  274. return true;
  275. };
  276. // 上传列表
  277. const fileList = ref<UploadUserFile[]>([
  278. {
  279. name: 'food.jpeg',
  280. url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100',
  281. },
  282. ]);
  283. // 多张图片上传
  284. const uploadImgList = (file:any, list:any, id:any) => {
  285. console.log(file, list, id);
  286. fileList.value = list;
  287. };
  288. // 删除图片(多张)
  289. const handleRemove = (uploadFile: any) => {
  290. uploadListRef.value[0].handleRemove(uploadFile.file);
  291. };
  292. // 预览图片 多张
  293. const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile:any) => {
  294. for (let i = 0; i < document.querySelectorAll('.images').length; i++) {
  295. if (uploadFile.file.url === document.querySelectorAll('.images')[i].getElementsByTagName('img')[0].src) {
  296. viewerApi({
  297. options: {
  298. toolbar: true,
  299. url: 'url',
  300. initialViewIndex: i,
  301. },
  302. images: fileList.value,
  303. });
  304. break;
  305. }
  306. }
  307. };
  308. // 保存
  309. const submitForm = () => {
  310. modifysettings({ list: state.formateData })
  311. .then(() => {
  312. ElMessage.success('配置成功');
  313. getSetList();
  314. })
  315. .catch(() => {});
  316. };
  317. const resetForm = () => {
  318. getSetList();
  319. };
  320. // 页面加载时
  321. onMounted(() => {
  322. getSetList();
  323. });
  324. </script>
  325. <style lang="scss" scoped>
  326. .system-systemParameter-container {
  327. .pd100 {
  328. padding: 0 10vw;
  329. }
  330. .maxwidth400 {
  331. max-width: 214px;
  332. }
  333. .form {
  334. flex: 1;
  335. overflow-y: auto;
  336. overflow-x: hidden;
  337. }
  338. .avatar-uploader .avatar {
  339. width: 178px;
  340. height: 178px;
  341. display: block;
  342. }
  343. }
  344. </style>
  345. <style>
  346. .avatar-uploader .el-upload {
  347. border: 1px dashed var(--el-border-color);
  348. border-radius: 6px;
  349. cursor: pointer;
  350. position: relative;
  351. overflow: hidden;
  352. transition: var(--el-transition-duration-fast);
  353. }
  354. .avatar-uploader .el-upload:hover {
  355. border-color: var(--el-color-primary);
  356. }
  357. .el-icon.avatar-uploader-icon {
  358. font-size: 28px;
  359. color: #8c939d;
  360. width: 178px;
  361. height: 178px;
  362. text-align: center;
  363. }
  364. </style>