addSign.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <template>
  2. <div class="system-add-flag-container">
  3. <el-dialog :title="isEdit?'编辑标识项':'新建标识项'" v-model="isShowDialog" width="569px">
  4. <el-form class="add-flag-container" ref="ruleTagRef" :rules="rules" :model="ruleForm" size="default" label-width="90px">
  5. <el-row :gutter="35">
  6. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
  7. <el-form-item label="标识" prop="name">
  8. <el-input v-model="ruleForm.name" placeholder="请输入标识" clearable></el-input>
  9. </el-form-item>
  10. </el-col>
  11. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
  12. <el-form-item label="名称" prop="title">
  13. <el-input v-model="ruleForm.title" placeholder="请输入名称" clearable></el-input>
  14. </el-form-item>
  15. </el-col>
  16. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
  17. <el-form-item class="has-symbol" label="权重" prop="weight">
  18. <el-input v-model.number="ruleForm.weight" placeholder="请输入权重" clearable></el-input>
  19. <span class="symbol">%</span>
  20. </el-form-item>
  21. </el-col>
  22. </el-row>
  23. </el-form>
  24. <!-- 添加取值范围 -->
  25. <div class="add-value-range">
  26. <div class="header">
  27. <p>添加取值范围</p>
  28. <el-button @click="addRange" size="small" plain type="primary">添加</el-button>
  29. </div>
  30. <div class="add-value-range-wrap">
  31. <section class="add-value-range-item" v-for="(item, index) in ruleForm.ranges" :key="index">
  32. <div class="left-wrap">
  33. <span class="symbol">*</span>
  34. <span class="label">取值范围</span>
  35. <el-input size="small" v-model="item.start_value" placeholder="请输入最小值" clearable></el-input>
  36. <span> ~ </span>
  37. <el-input size="small" v-model="item.end_value" placeholder="请输入最大值" clearable></el-input>
  38. </div>
  39. <div class="right-wrap">
  40. <span class="symbol">*</span>
  41. <span class="label">得分</span>
  42. <el-input size="small" v-model.number="item.base_value" placeholder="请输入得分" clearable></el-input>
  43. </div>
  44. <el-button @click="deleteRange(index)" size="small" type="danger">删除</el-button>
  45. </section>
  46. </div>
  47. </div>
  48. <template #footer>
  49. <span class="dialog-footer">
  50. <el-button @click="onCancel" size="default">取 消</el-button>
  51. <el-button type="primary" @click="onSubmit(ruleTagRef)" size="default">保 存</el-button>
  52. </span>
  53. </template>
  54. </el-dialog>
  55. </div>
  56. </template>
  57. <script lang="ts">
  58. import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue';
  59. import type { FormInstance, FormRules } from 'element-plus'
  60. import { ElMessage } from 'element-plus';
  61. // 定义接口来定义对象的类型
  62. interface DeptData {
  63. start_value: string;
  64. end_value: string;
  65. base_value: string;
  66. }
  67. // interface RangeData {
  68. // minVal: number | string;
  69. // maxVal: number | string;
  70. // score: number | string;
  71. // }
  72. interface UserState {
  73. isShowDialog: boolean;
  74. ruleForm: {
  75. name: string;
  76. title: string;
  77. weight: string;
  78. ranges: Array<DeptData>;
  79. };
  80. index: any;
  81. isEdit: Boolean;
  82. // deptData: Array<DeptData>;
  83. }
  84. export default defineComponent({
  85. name: 'systemAddUser',
  86. setup(prop, { emit }) {
  87. const state = reactive<UserState>({
  88. isShowDialog: false,
  89. ruleForm: {
  90. name: '', // 标识
  91. title: '', // 名称
  92. weight: '', // 权重
  93. ranges: []
  94. },
  95. index: null,
  96. isEdit: false
  97. });
  98. const ruleTagRef = ref<FormInstance>()
  99. const rules = reactive<FormRules>({
  100. name: [
  101. { required: true, message: '请输入标识', trigger: 'blur' },
  102. ],
  103. title: [
  104. { required: true, message: '请输入名称', trigger: 'blur' },
  105. ],
  106. weight: [
  107. { required: true, message: '请输入权重', trigger: 'blur' },
  108. ]
  109. });
  110. // 打开弹窗
  111. const openDialog = (row:any, index: any, isEdit: Boolean) => {
  112. if(!isEdit) {
  113. state.ruleForm = {
  114. name: '', // 标识
  115. title: '', // 名称
  116. weight: '', // 权重
  117. ranges: []
  118. }
  119. }
  120. if(row) {
  121. state.ruleForm = row
  122. }
  123. state.index = index
  124. state.isEdit = isEdit
  125. state.isShowDialog = true;
  126. };
  127. // 关闭弹窗
  128. const closeDialog = () => {
  129. state.isShowDialog = false;
  130. };
  131. // 取消
  132. const onCancel = () => {
  133. closeDialog();
  134. };
  135. // // 新增
  136. // const onSubmit = () => {
  137. // };
  138. // 保存数据
  139. const onSubmit = async (formEl: FormInstance | undefined) => {
  140. if (!formEl) return
  141. await formEl.validate((valid, fields) => {
  142. if (valid) {
  143. if(state.ruleForm.ranges.length) {
  144. let item = state.ruleForm.ranges[state.ruleForm.ranges.length-1]
  145. const { start_value, end_value, base_value } = item
  146. if(!start_value || !end_value || !base_value.toString()) {
  147. ElMessage.error('请完善表单');
  148. return
  149. }
  150. }
  151. emit('handleChange', state.ruleForm, state.index, state.isEdit)
  152. closeDialog();
  153. }
  154. })
  155. }
  156. // 初始化部门数据
  157. // const initTableData = () => {
  158. // state.deptData.push({
  159. // deptName: 'vueNextAdmin',
  160. // createTime: new Date().toLocaleString(),
  161. // status: true,
  162. // sort: Math.random(),
  163. // describe: '顶级部门',
  164. // id: Math.random(),
  165. // children: [
  166. // {
  167. // deptName: 'IT外包服务',
  168. // createTime: new Date().toLocaleString(),
  169. // status: true,
  170. // sort: Math.random(),
  171. // describe: '总部',
  172. // id: Math.random(),
  173. // },
  174. // {
  175. // deptName: '资本控股',
  176. // createTime: new Date().toLocaleString(),
  177. // status: true,
  178. // sort: Math.random(),
  179. // describe: '分部',
  180. // id: Math.random(),
  181. // },
  182. // ],
  183. // });
  184. // state.ruleForm.list = [{
  185. // minVal: 10,
  186. // maxVal: 100,
  187. // score: 90
  188. // }]
  189. // };
  190. const addRange = () => {
  191. if(!state.ruleForm.ranges.length) {
  192. state.ruleForm.ranges.push({
  193. start_value: '',
  194. end_value: '',
  195. base_value: ''
  196. })
  197. return
  198. }
  199. let item = state.ruleForm.ranges[state.ruleForm.ranges.length-1]
  200. const { start_value, end_value, base_value } = item
  201. if(!start_value || !end_value || !base_value.toString()) {
  202. ElMessage.error('请完善表单');
  203. return
  204. }
  205. state.ruleForm.ranges.push({
  206. start_value: '',
  207. end_value: '',
  208. base_value: ''
  209. })
  210. };
  211. const deleteRange = (index: number) => {
  212. state.ruleForm.ranges.splice(index, 1)
  213. // const { minVal, maxVal, score } = item
  214. // if(!minVal || !maxVal || !score.toString()) {
  215. // ElMessage.error('请完善表单');
  216. // return
  217. // }
  218. // state.ruleForm.list.push({
  219. // minVal: '',
  220. // maxVal: '',
  221. // score: ''
  222. // })
  223. };
  224. // 页面加载时
  225. onMounted(() => {
  226. // initTableData();
  227. });
  228. return {
  229. rules,
  230. ruleTagRef,
  231. openDialog,
  232. closeDialog,
  233. addRange,
  234. deleteRange,
  235. onCancel,
  236. onSubmit,
  237. ...toRefs(state),
  238. };
  239. },
  240. });
  241. </script>
  242. <style lang="scss" scoped>
  243. ::v-deep .has-symbol > .el-form-item__content {
  244. position: relative;
  245. .symbol {
  246. position: absolute;
  247. right: 8px;
  248. }
  249. }
  250. .el-form {
  251. border-bottom: 1px solid var(--el-border-color);
  252. }
  253. .add-value-range {
  254. // background-color: pink;
  255. padding: 10px 0;
  256. .header {
  257. display: flex;
  258. justify-content: space-between;
  259. align-items: center;
  260. margin-bottom: 12px;
  261. }
  262. .add-value-range-wrap {
  263. display: flex;
  264. flex-direction: column;
  265. .add-value-range-item {
  266. display: flex;
  267. justify-content: space-between;
  268. align-content: center;
  269. padding-top: 2px;
  270. .left-wrap,
  271. .right-wrap {
  272. display: flex;
  273. justify-content: center;
  274. align-content: center;
  275. height: 32px;
  276. line-height: 28px;
  277. .symbol {
  278. content: "*";
  279. color: var(--el-color-danger);
  280. margin-right: 4px;
  281. }
  282. .label {
  283. margin-right: 4px;
  284. }
  285. }
  286. ::v-deep .el-input {
  287. width: 100px;
  288. height: 28px;
  289. }
  290. }
  291. }
  292. }
  293. ::v-deep .el-dialog__body {
  294. border-top: 1px var(--el-border-color) var(--el-border-style);
  295. }
  296. </style>