personInfo-detail.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <style scoped>
  2. .user-panel {
  3. margin: 10px auto;
  4. }
  5. </style>
  6. <template>
  7. <el-dialog
  8. :visible.sync="showDialog"
  9. :title="title"
  10. :modal-append-to-body="false"
  11. style="text-align:left;"
  12. @close="closeDialog"
  13. :close-on-click-modal="false"
  14. >
  15. <div class="user-panel" v-loading="loading">
  16. <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'100px'">
  17. <el-row>
  18. <el-col :span="12">
  19. <el-form-item label="企业" prop="companyId">
  20. <el-select
  21. v-model="formModel.companyId"
  22. filterable
  23. placeholder="请选择"
  24. style="width:280px"
  25. >
  26. <el-option
  27. v-for="company in companyResult"
  28. :key="company.id"
  29. :label="company.name"
  30. :value="company.id"
  31. ></el-option>
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item label="姓名" prop="name">
  37. <el-input v-model="formModel.name" placeholder="请输入姓名"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row>
  42. <el-col :span="12">
  43. <el-form-item label="手机号" prop="phone">
  44. <el-input v-model="formModel.phone" placeholder="请输入手机号"></el-input>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item label="身份证" prop="idCard">
  49. <el-input v-model="formModel.idCard" placeholder="请输入身份证"></el-input>
  50. </el-form-item>
  51. </el-col>
  52. </el-row>
  53. <el-row>
  54. <el-col :span="24">
  55. <el-form-item label="照片" prop="faceImageUrl">
  56. <el-upload
  57. class="avatar-uploader"
  58. name="photoFile"
  59. :action="uploadUrl"
  60. :show-file-list="false"
  61. :headers="headers"
  62. :data="uploadData"
  63. :on-success="handleAvatarSuccess"
  64. :before-upload="beforeAvatarUpload"
  65. >
  66. <img v-if="fileUrl" :src="fileUrl" class="avatar" />
  67. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  68. </el-upload>
  69. </el-form-item>
  70. </el-col>
  71. </el-row>
  72. <el-row>
  73. <el-col :span="24">
  74. <el-form-item label="开放权限">
  75. <el-checkbox v-model="formModel.faceEnabled">人脸识别</el-checkbox>
  76. <el-checkbox v-model="formModel.cardEnabled">门禁卡</el-checkbox>
  77. <el-checkbox v-model="formModel.appEnabled">手机开锁</el-checkbox>
  78. <el-checkbox v-model="formModel.guestEnabled">访客权限</el-checkbox>
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <el-row>
  83. <el-col :span="12">
  84. <el-form-item :label="companyPosition1" prop="position1">
  85. <el-input v-model="formModel.position1" placeholder="请输入一级位置"></el-input>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="12">
  89. <el-form-item :label="companyPosition2" prop="position2">
  90. <el-input v-model="formModel.position2" placeholder="请输入二级位置"></el-input>
  91. </el-form-item>
  92. </el-col>
  93. </el-row>
  94. <el-row>
  95. <el-col :span="12">
  96. <el-form-item :label="companyPosition3" prop="position3">
  97. <el-input v-model="formModel.position3" placeholder="请输入三级位置"></el-input>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="12">
  101. <el-form-item :label="companyPosition4" prop="position4">
  102. <el-input v-model="formModel.position4" placeholder="请输入四级位置"></el-input>
  103. </el-form-item>
  104. </el-col>
  105. </el-row>
  106. <el-row>
  107. <el-col :span="12">
  108. <el-form-item :label="companyPosition5" prop="position5">
  109. <el-input v-model="formModel.position5" placeholder="请输入五级位置"></el-input>
  110. </el-form-item>
  111. </el-col>
  112. </el-row>
  113. </el-form>
  114. </div>
  115. <span slot="footer" class="dialog-footer">
  116. <el-button @click="closeDialog">取 消</el-button>
  117. <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
  118. </span>
  119. </el-dialog>
  120. </template>
  121. <script>
  122. import Constant from "@/constant";
  123. import personInfoApi from "@/api/base/personInfo";
  124. import { getToken } from "@/utils/auth"; // get token from cookie
  125. export default {
  126. props: [
  127. "businessKey",
  128. "title",
  129. "companyResult",
  130. "companyPosition1",
  131. "companyPosition2",
  132. "companyPosition3",
  133. "companyPosition4",
  134. "companyPosition5"
  135. ],
  136. data() {
  137. let checkIdCard = (rule, value, callback) => {
  138. var identNumber = value;
  139. if (!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(identNumber)) {
  140. return callback(new Error("格式错误"));
  141. } else if (!/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(identNumber)) {
  142. //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
  143. return callback(new Error("格式错误"));
  144. } else {
  145. return callback();
  146. }
  147. };
  148. return {
  149. formModel: {},
  150. ruleValidate: {
  151. companyId: [
  152. { required: true, message: "企业不能为空", trigger: "blur" }
  153. ],
  154. name: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
  155. phone: [{ required: true, message: "手机号不能为空", trigger: "blur" }]
  156. // idCard: [
  157. // { required: false, message: "身份证不能为空", trigger: "blur" },
  158. // {
  159. // validator: checkIdCard,
  160. // trigger: "blur"
  161. // }
  162. // ]
  163. },
  164. showDialog: true,
  165. loading: false,
  166. submitting: false,
  167. checkList: [],
  168. //上传地址
  169. uploadUrl: Constant.serverUrl + "/uploadPicture",
  170. uploadData: {
  171. subFolder: "personInfo"
  172. },
  173. fileUrl: "",
  174. headers: {
  175. Authorization: getToken()
  176. }
  177. };
  178. },
  179. methods: {
  180. closeDialog() {
  181. this.$emit("close", false);
  182. },
  183. handleSubmit() {
  184. var self = this;
  185. this.$refs["form"].validate(valid => {
  186. if (valid) {
  187. (function() {
  188. var id = self.formModel.id;
  189. if (id == null || id.length == 0) {
  190. return personInfoApi.add(self.formModel);
  191. } else {
  192. return personInfoApi.update(self.formModel);
  193. }
  194. })().then(function(response) {
  195. var jsonData = response.data;
  196. if (jsonData.result) {
  197. self.$message({
  198. message: "保存成功!",
  199. type: "success"
  200. });
  201. self.$emit("close", true);
  202. } else {
  203. self.$message({
  204. message: jsonData.message + "",
  205. type: "warning"
  206. });
  207. self.$emit("close", false);
  208. }
  209. });
  210. }
  211. });
  212. },
  213. handleAvatarSuccess(res, file) {
  214. var self = this;
  215. self.formModel.faceImageUrl = res.data;
  216. self.fileUrl =
  217. res.data + "?x-oss-process=image/resize,m_lfit,h_400,w_400";
  218. },
  219. beforeAvatarUpload(file) {
  220. const isJPG = file.type === "image/jpeg";
  221. const isLt2M = file.size / 1024 / 1024 < 2;
  222. if (!isJPG) {
  223. this.$message.error("上传头像图片只能是 JPG 格式!");
  224. }
  225. if (!isLt2M) {
  226. this.$message.error("上传头像图片大小不能超过 2MB!");
  227. }
  228. return isJPG && isLt2M;
  229. }
  230. },
  231. mounted: function() {
  232. var self = this;
  233. (function() {
  234. if (self.businessKey.length == 0) {
  235. return personInfoApi.create();
  236. } else {
  237. return personInfoApi.edit(self.businessKey);
  238. }
  239. })()
  240. .then(response => {
  241. var jsonData = response.data;
  242. self.loading = false;
  243. if (jsonData.result) {
  244. self.formModel = jsonData.data;
  245. let faceImageUrl = self.formModel.faceImageUrl;
  246. if (faceImageUrl != null) {
  247. self.fileUrl =
  248. faceImageUrl + "?x-oss-process=image/resize,m_lfit,h_400,w_400";
  249. }
  250. } else {
  251. self.$message.error(jsonData.message + "");
  252. }
  253. })
  254. .catch(error => {
  255. self.$message.error(error + "");
  256. });
  257. }
  258. };
  259. </script>