From 6de4ec8ac6822f22745c9bd059487a743e836e02 Mon Sep 17 00:00:00 2001
From: Tcsm <1377977403@qq.com>
Date: 星期三, 12 四月 2023 00:04:07 +0800
Subject: [PATCH] 4.12日提交通讯录模块和成长经历模块

---
 ruoyi-ui/src/views/self/show.vue             |  250 ++++++++-------
 ruoyi-ui/src/assets/icons/top.png            |    0 
 ruoyi-ui/src/views/contacts/index.vue        |  203 ++++++++----
 ruoyi-ui/src/views/contacts/contactsInfo.vue |  396 ++++++++++++++++++++++++++
 4 files changed, 661 insertions(+), 188 deletions(-)

diff --git a/ruoyi-ui/src/assets/icons/top.png b/ruoyi-ui/src/assets/icons/top.png
new file mode 100644
index 0000000..069f742
--- /dev/null
+++ b/ruoyi-ui/src/assets/icons/top.png
Binary files differ
diff --git a/ruoyi-ui/src/views/contacts/contactsInfo.vue b/ruoyi-ui/src/views/contacts/contactsInfo.vue
new file mode 100644
index 0000000..d092eef
--- /dev/null
+++ b/ruoyi-ui/src/views/contacts/contactsInfo.vue
@@ -0,0 +1,396 @@
+<template>
+  <div class="app-container">
+    <div class="form-header mt">
+      <h4 class="dt h4">閫氳褰曡缁嗕俊鎭� </h4>
+      <el-button type="primary" class="pt"  icon="el-icon-edit" @click="handleEdit()" :disabled="btn">缂栬緫</el-button>
+      <!--      <br>-->
+      <!--      <el-button type="primary" class="pt"   @click="handleExport"-->
+      <!--                 v-hasPermi="['self:user:export']" >瀵煎嚭</el-button>-->
+    </div>
+
+    <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
+      <!--      <el-form-item label="id" prop="id">-->
+      <!--        <el-input v-model="formData.id" placeholder="璇疯緭鍏d" :maxlength="11" show-word-limit :disabled="true"-->
+      <!--                  clearable prefix-icon='el-icon-mobile' :style="{width: '100%'}"></el-input>-->
+      <!--      </el-form-item>-->
+      <el-form-item label="鎴愬憳濮撳悕" prop="myName">
+        <el-input v-model="formData.myName" placeholder="璇疯緭鍏ユ垚鍛樺鍚�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="绉板懠" prop="nickName">
+        <el-input v-model="formData.nickName" placeholder="璇疯緭鍏ョО鍛�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="濮撳悕" prop="name">
+        <el-input v-model="formData.name" placeholder="璇疯緭鍏ュ鍚�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="宸ヤ綔鍗曚綅" prop="work">
+        <el-input v-model="formData.work" placeholder="璇疯緭鍏ュ叿浣撲綅缃�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="鎵嬫満" prop="phone">
+        <el-input v-model="formData.phone" placeholder="璇疯緭鍏ユ墜鏈�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="寰俊" prop="wx">
+        <el-input v-model="formData.wx" placeholder="璇疯緭鍏ュ井淇�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="QQ" prop="qq">
+        <el-input v-model="formData.qq" placeholder="璇疯緭鍏Q" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="twitter" prop="twitter">
+        <el-input v-model="formData.twitter" placeholder="璇疯緭鍏witter" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="鏄惁甯歌仈绯�" prop="isAlways">
+        <el-input v-model="formData.isAlways" placeholder="鏄惁甯歌仈绯�" clearable :style="{width: '100%'}" :disabled="dsb">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞锛堟槸鍚﹀瓨鍦ㄩ噾閽卞叧绯伙級" prop="remark">
+        <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" clearable :style="{width: '100%'}" :disabled="dsb"></el-input>
+      </el-form-item>
+
+      <h4 class="form-header">鐢靛瓙鍚嶇墖 </h4>
+      <el-upload
+        action="#"
+        list-type="picture-card"
+        multiple
+        :http-request="requestUpload"
+        :file-list="fileList"
+      >
+        <i slot="default" class="el-icon-plus"></i>
+        <div slot="file" slot-scope="{file}">
+          <img
+            class="el-upload-list__item-thumbnail"
+            :src="file.url"
+            alt=""
+            style="width: 147px; height: 147px"
+            fit="cover"
+            :preview-src-list="[file.url]"
+          >
+          <span class="el-upload-list__item-actions">
+        <span
+          class="el-upload-list__item-preview"
+          @click="handlePictureCardPreview(file)"
+        >
+          <i class="el-icon-zoom-in"></i>
+        </span>
+        <span
+          v-if="!disabled"
+          class="el-upload-list__item-delete"
+          @click="handleDownload(file.url)"
+        >
+          <i class="el-icon-download"></i>
+        </span>
+        <span
+          v-if="!disabled"
+          class="el-upload-list__item-delete"
+          @click="handleRemove(file)"
+        >
+          <i class="el-icon-delete"></i>
+        </span>
+      </span>
+
+
+        </div>
+      </el-upload>
+
+      <h4 class="form-header">鍏朵粬闄勪欢 </h4>
+      <el-upload
+        action=""
+        :file-list="fileListOther"
+        class="upload-demo"
+        multiple
+        :on-preview="handlePreview"
+
+        :on-remove="handleRemove"
+        :http-request="requestUpload"
+        :show-file-list="true"
+      >
+        <el-button type="primary">鐐瑰嚮涓婁紶</el-button>
+        <template #tip>
+          <div class="el-upload__tip">
+          </div>
+        </template>
+
+
+      </el-upload>
+
+      <el-form-item size="large">
+        <el-button type="primary" @click="submitForm" :disabled="dsb">淇敼</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-dialog  :visible.sync="dialogVisible">
+      <img w-full :src="dialogImageUrl" alt="Preview Image" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {getContactList, getContactIdList, addContact,updateContact, download,delContact,uploadPic} from "@/api/contacts/index";
+import {addRole, updateRole} from "@/api/system/role";
+import {blobValidate} from "@/utils/ruoyi";
+import errorCode from "@/utils/errorCode";
+import {Message} from "element-ui";
+
+export default {
+  components: {},
+  props: [],
+  data() {
+    return {
+      cdi:"閫氳褰曡缁嗕俊鎭�",
+      udi:"閫氳褰曚俊鎭鎯�",
+      fot:[".jpg",".jif"],
+      fileList:[
+      ],
+      fileListOther:[
+
+      ],
+      dsb:true,
+      btn:false,
+
+      // 閫氳褰曡〃鏍兼暟鎹�
+      contactList: [],
+
+      formData: {
+        //閫氳褰�
+        id:undefined,
+        myName:undefined,
+        nickName:undefined,
+        name:undefined,
+        work:undefined,
+
+        phone:undefined,
+        wx:undefined,
+        qq:undefined,
+        twitter:undefined,
+        isAlways:undefined,
+        remark:undefined,
+        url: undefined,
+      },
+      dialogImageUrl: '',
+      dialogVisible: false,
+      disabled: false,
+      rules: {
+        id: [{
+          required: true,
+          message: '璇疯緭鍏d',
+          trigger: 'blur'
+        }],
+
+        myName: [{
+          required: true,
+          message: '璇疯緭鍏ユ垚鍛樺鍚�',
+          trigger: 'blur'
+        }],
+        nickName: [{
+          required: true,
+          message: '璇疯緭鍏ョО鍛�',
+          trigger: 'blur'
+        }],
+        name: [{
+          required: true,
+          message: '璇疯緭鍏ュ鍚�',
+          trigger: 'blur'
+        }],
+        address: [{
+          required: true,
+          message: '璇疯緭鍏ュ叿浣撲綅缃�',
+          trigger: 'blur'
+        }],
+        remark: [{
+          // required: true,
+          message: '璇疯緭鍏ュ娉�',
+          trigger: 'blur'
+        }],
+
+      },
+      typeOptions: [],
+    }
+  },
+  computed: {},
+  watch: {},
+  created() {
+    const id = this.$route.params && this.$route.params.id;
+    let jd;
+    if(this.$route.query.detail!=undefined)
+    {
+      jd =  this.$route.query.detail
+      this.btn= jd
+      this.dsb = !jd
+      document.title = "淇敼閫氳褰曡缁嗕俊鎭�";
+      this.$route.meta.title = "淇敼閫氳褰曡缁嗕俊鎭�";//鍒楄〃鐨勫悕绉�
+    }
+    else{
+      document.title = "鏌ョ湅閫氳褰曡缁嗕俊鎭�";
+      this.$route.meta.title = "鏌ョ湅閫氳褰曡缁嗕俊鎭�";//鍒楄〃鐨勫悕绉�
+    }
+
+    let _this = this
+    if (id) {
+      this.loading = true;
+      getContactIdList(id).then((response) => {
+        this.formData = response.data;
+        let paths = response.data.url.split(",");
+        for(let i = 0; i < paths.length; i++)
+        {
+          if(paths[i]!="") {
+
+            let pth = paths[i].substr(paths[i].length - 4, paths[i].length)
+
+            if (_this.fot.includes(pth) === true)
+              _this.fileList.push({name:paths[i],url: process.env.VUE_APP_BASE_TRUE_API+paths[i]})
+            else {
+              // alert(paths[i])
+              let nms = paths[i].split("\/")
+              let nm = nms[nms.length - 1]
+              _this.fileListOther.push({name:nm, url: process.env.VUE_APP_BASE_TRUE_API+paths[i]})
+            }
+          }
+        }
+        this.loading = false;
+      });
+      this.getCateInfor()
+
+    }
+  },
+  mounted() {},
+  methods: {
+    /** 鏌ヨ绫诲埆淇℃伅 */
+    // getCateInfor()
+    // {
+    //   let _this = this
+    //   getCategory().then(response=>{
+    //
+    //     response.data.itemValues.replace("{","").replace("}","").split(",").map(elem=>{
+    //       _this.typeOptions.push({"label":elem.split(":")[0], "value":elem.split(":")[0]})
+    //     })
+    //   })
+    // },
+    submitForm() {
+      let ul = this.fileList.map(function (elem){
+        return elem.url.replace(process.env.VUE_APP_BASE_TRUE_API,"")
+      }).join(",")
+      let uls = this.fileListOther.map(function (elem){
+        return elem.url.replace(process.env.VUE_APP_BASE_TRUE_API,"")
+      }).join(",")
+      this.formData.url = ul+","+uls
+
+      this.$refs['elForm'].validate(valid => {
+
+
+        if (valid) {
+          if (this.formData.id != undefined) {
+            updateContact(this.formData).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              // this.open = false;
+              this.btn=false
+            });
+          } else {
+            this.$modal.msgSuccess("淇敼澶辫触");
+
+          }
+        }
+      })
+    },
+    resetForm() {
+      this.$refs['elForm'].resetFields()
+    },
+    handlePreview(file)
+    {
+      let formData = {'path':"/"+file.url.replace(process.env.VUE_APP_BASE_TRUE_API,"")};
+      let lens = formData.path.split(".")
+      let suffix = lens[lens.length-1]
+      download(formData).then(async (response) => {
+        const isLogin = await blobValidate(response);
+        let nt = new Date().getTime()
+        let filename = 'property_'+nt+'.'+suffix
+        const blob = new Blob([response])
+        saveAs(blob, filename)
+      })
+    },
+    handleRemoveFile(file) {
+      alert(23)
+    },
+    handleRemove(file) {
+      alert(323)
+    },
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    handleDownload(url) {
+      var formData = {'path':"/"+url.replace(process.env.VUE_APP_BASE_TRUE_API,"")};
+
+      let lens = formData.path.split(".")
+      let suffix = lens[lens.length-1]
+      download(formData).then(async (response) => {
+        const isLogin = await blobValidate(response);
+        let nt = new Date().getTime()
+        let filename = 'property_'+nt+'.'+suffix
+        const blob = new Blob([response])
+        saveAs(blob, filename)
+      })
+    },
+    handleEdit()
+    {
+      this.dsb = false
+      this.btn = true
+    },
+    requestUpload(params)
+    {
+      var file = params.file;
+      var formData = new FormData();
+      formData.append('uploadFile', file);
+      let _this = this
+
+      uploadPic(formData).then(response => {
+        let pth = response.data.originalFilename.substr(response.data.originalFilename.length-4, response.data.originalFilename.length)
+
+        if(_this.fot.includes(pth) === true)
+        {
+          _this.fileList.push({name:response.data.fileName, "url":response.data.url})
+
+        }
+
+        else{
+          _this.fileListOther.push({name:response.data.fileName, url:response.data.url})
+
+        }
+      })
+
+    },
+
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('/zfContact/export', {
+        ...this.queryParams
+      }, `zfContact_${new Date().getTime()}.xlsx`)
+    }
+
+  }
+}
+
+</script>
+
+<style scoped>
+.mt
+{
+  position: relative;
+}
+.dt{
+  display: block;
+
+}
+.pt{
+  right: 10px;
+  top:-3px;
+  display: block;
+  position: absolute;
+}
+</style>
+
diff --git a/ruoyi-ui/src/views/contacts/index.vue b/ruoyi-ui/src/views/contacts/index.vue
index 82404cb..6c73b4f 100644
--- a/ruoyi-ui/src/views/contacts/index.vue
+++ b/ruoyi-ui/src/views/contacts/index.vue
@@ -1,15 +1,21 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
-      <el-form-item label="" prop="id" style="padding-left:30px">
+      <el-form-item label="" prop="phone wx qq twitter isAlways remark" >
         <el-input
-          v-model="queryParams.id"
+          v-model:phone="queryParams.phone"
+          v-model:wx="queryParams.wx"
+          v-model:qq="queryParams.qq"
+          v-model:twitter="queryParams.twitter"
+          v-model:isAlways="queryParams.isAlways"
+          v-model:remark="queryParams.remark"
           placeholder="鍦ㄢ�滈�氳褰曗�濅腑鎼滅储"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery">
           <i slot="prefix" class="el-input__icon el-icon-search"></i>
         </el-input>
+        <!--        v-model="queryParams.id"-->
       </el-form-item>
 
       <el-form-item label="鎴愬憳濮撳悕" prop="myName" style="padding-left:180px">
@@ -36,44 +42,44 @@
       </el-form-item>
       <el-cntainer>
         <el-col :span="9" >
-         <el-form-item>
-          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
-          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
 
-         </el-form-item>
+          </el-form-item>
         </el-col>
       </el-cntainer>
-        <el-form-item label="濮撳悕" prop="name">
-          <el-input
-            v-model="queryParams.name"
-            placeholder="璇疯緭鍏ュ鍚�"
-            clearable
-            style="width: 240px"
-            @keyup.enter.native="handleQuery">
-            <i slot="prefix" class="el-input__icon el-icon-search"></i>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="宸ヤ綔鍗曚綅" prop="work">
-          <el-input
-            v-model="queryParams.work"
-            placeholder="璇疯緭鍏ュ伐浣滃崟浣�"
-            clearable
-            style="width: 240px"
-            @keyup.enter.native="handleQuery"
-          >
-            <i slot="prefix" class="el-input__icon el-icon-search"></i>
-          </el-input>
-        </el-form-item>
+      <el-form-item label="濮撳悕" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ鍚�"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery">
+          <i slot="prefix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="宸ヤ綔鍗曚綅" prop="work">
+        <el-input
+          v-model="queryParams.work"
+          placeholder="璇疯緭鍏ュ伐浣滃崟浣�"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        >
+          <i slot="prefix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+      </el-form-item>
 
     </el-form>
     <div style="width: 72px;
-height: 24px;
-font-size: 18px;
-font-family: Microsoft YaHei-Regular, Microsoft YaHei;
-font-weight: 400;
-color: #000000;
-line-height: 21px;
-">閫氳褰�</div>
+      height: 24px;
+      font-size: 18px;
+      font-family: Microsoft YaHei-Regular, Microsoft YaHei;
+      font-weight: 400;
+      color: #000000;
+      line-height: 21px;
+      ">閫氳褰�</div>
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -111,25 +117,36 @@
     </el-row>
 
     <el-table v-loading="loading" :data="contactList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55"  align="center" />
-      <el-table-column label="鎴愬憳濮撳悕" prop="myName" sortable width="100" />
-      <el-table-column label="绉板懠" prop="nickName" sortable :show-overflow-tooltip="true" width="100" />
-      <el-table-column label="濮撳悕" prop="name" sortable :show-overflow-tooltip="true" width="100" />
-      <el-table-column label="宸ヤ綔鍗曚綅" prop="work" sortable width="100" />
-      <el-table-column label="鎵嬫満" prop="phone" sortable width="120" />
-      <el-table-column label="鍏跺畠鑱旂郴鏂瑰紡" prop="wx qq twitter" sortable width="150" >
+      <el-table-column type="selection" width="25"  align="center" />
+      <el-table-column label="鎴愬憳濮撳悕" prop="myName" sortable width="100" >
         <template slot-scope="scope">
-          {{scope.row.wx}}/
-          {{scope.row.qq}}/
+          <div>
+            <a href="javascript:;" @click="handleCheck(scope.row)">{{scope.row.myName}}</a>
+          </div>
+        </template>
+
+      </el-table-column>
+      <el-table-column label="绉板懠" prop="nickName" sortable :show-overflow-tooltip="true" width="80" />
+      <el-table-column label="濮撳悕" prop="name" sortable :show-overflow-tooltip="true" width="80" />
+      <el-table-column label="宸ヤ綔鍗曚綅" prop="work" sortable width="100" />
+      <el-table-column label="鎵嬫満" prop="phone" sortable width="110" />
+      <el-table-column label="鍏跺畠鑱旂郴鏂瑰紡" prop="wx qq twitter" sortable width="130" >
+        <template slot-scope="scope">
+          {{scope.row.wx}}<br>
+          {{scope.row.qq}}<br>
           {{scope.row.twitter}}
         </template>
       </el-table-column>
-      <el-table-column label="鏄惁甯歌仈绯�" prop="isAlways" sortable width="120" />
+      <el-table-column label="鏄惁甯歌仈绯�" prop="isAlways" sortable width="120" >
+        <template slot-scope="scope">
+          <span v-if="scope.row.isAlways===1">鏄�</span>
+          <span v-if="scope.row.isAlways===0">鍚�</span>
+        </template>
+      </el-table-column>
       <el-table-column label="鐢靛瓙鍚嶇墖" prop="url" align="center" sortable  width="180">
-<!--        <el-image-->
-<!--          :src="'http://47.93.189.255:8080/'+ contactList.url"-->
-<!--          :fit="fit"-->
-<!--        ></el-image>-->
+        <template slot-scope="scope">
+          <el-image style="width: 100px; height: 100px" :src="'http://47.93.189.255:8080/'+ scope.row.url" fit="cover"></el-image>
+        </template>
       </el-table-column>
       <el-table-column label="澶囨敞锛堟槸鍚﹀瓨鍦ㄩ噾閽卞叧绯伙級" prop="remark" sortable width="120" />
       <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
@@ -174,39 +191,47 @@
 
     <!-- 娣诲姞閫氳褰曢厤缃璇濇 -->
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
-      <el-form ref="elForm" :model="contactList" :rules="rules" size="medium" label-width="100px">
+      <el-form ref="elForm" :model="formDat" :rules="rules" size="medium" label-width="100px">
 
         <el-form-item label="鎴愬憳濮撳悕" prop="myName">
-          <el-input v-model="contactList.myName" placeholder="璇疯緭鍏ユ垚鍛樺鍚�" clearable :style="{width: '100%'}" >
-        </el-input>
+          <el-input v-model="formDat.myName" placeholder="璇疯緭鍏ユ垚鍛樺鍚�" clearable :style="{width: '100%'}" >
+          </el-input>
         </el-form-item>
 
         <el-form-item label="绉板懠" prop="nickName">
-          <el-input v-model="contactList.nickName" placeholder="璇疯緭鍏ョО鍛�" clearable :style="{width: '100%'}" ></el-input>
+          <el-input v-model="formDat.nickName" placeholder="璇疯緭鍏ョО鍛�" clearable :style="{width: '100%'}" ></el-input>
         </el-form-item>
         <el-form-item label="濮撳悕" prop="name">
-          <el-input v-model="contactList.name" placeholder="璇疯緭鍏ュ鍚�" clearable :style="{width: '100%'}" >
+          <el-input v-model="formDat.name" placeholder="璇疯緭鍏ュ鍚�" clearable :style="{width: '100%'}" >
           </el-input>
         </el-form-item>
         <el-form-item label="宸ヤ綔鍗曚綅" prop="work">
-          <el-input v-model="contactList.work" placeholder="璇疯緭鍏ュ伐浣滃崟浣�" clearable :style="{width: '100%'}" >
+          <el-input v-model="formDat.work" placeholder="璇疯緭鍏ュ伐浣滃崟浣�" clearable :style="{width: '100%'}" >
           </el-input>
         </el-form-item>
         <el-form-item label="鎵嬫満" prop="phone">
-          <el-input v-model="contactList.phone" placeholder="璇疯緭鍏ユ墜鏈�" clearable :style="{width: '100%'}" >
+          <el-input v-model="formDat.phone" placeholder="璇疯緭鍏ユ墜鏈�" clearable :style="{width: '100%'}" >
           </el-input>
         </el-form-item>
-        <el-form-item label="鍏跺畠鑱旂郴鏂瑰紡" prop="wx">
-          <el-input v-model="contactList.wx" placeholder="璇疯緭鍏ュ叾瀹冭仈绯绘柟寮�" clearable :style="{width: '100%'}" >
+        <el-form-item label="寰俊" prop="wx">
+          <el-input v-model="formDat.wx" placeholder="璇疯緭鍏ュ井淇�" clearable :style="{width: '100%'}" >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="QQ" prop="qq">
+          <el-input v-model="formDat.qq" placeholder="璇疯緭鍏Q" clearable :style="{width: '100%'}" >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="twitter" prop="twitter">
+          <el-input v-model="formDat.twitter" placeholder="璇疯緭鍏witter" clearable :style="{width: '100%'}" >
           </el-input>
         </el-form-item>
         <el-form-item label="鏄惁甯歌仈绯�" prop="isAlways">
-          <el-input v-model="contactList.isAlways" placeholder="鏄惁甯歌仈绯�" clearable :style="{width: '100%'}" >
+          <el-input v-model="formDat.isAlways" placeholder="鏄惁甯歌仈绯�" clearable :style="{width: '100%'}" >
           </el-input>
         </el-form-item>
 
         <el-form-item label="澶囨敞锛堟槸鍚﹀瓨鍦ㄩ噾閽卞叧绯伙級" prop="remark">
-          <el-input v-model="contactList.remark" placeholder="璇疯緭鍏ュ娉�" clearable :style="{width: '100%'}" ></el-input>
+          <el-input v-model="formDat.remark" placeholder="璇疯緭鍏ュ娉�" clearable :style="{width: '100%'}" ></el-input>
         </el-form-item>
 
         <h4 class="form-header">鐢靛瓙鍚嶇墖 </h4>
@@ -288,7 +313,7 @@
 
 
 
-//鍦╯ystem/note/index.js涓鍏ユ帴鍙e嚱鏁�
+//瀵煎叆鎺ュ彛鍑芥暟
 import {getContactList, getContactIdList, addContact,updateContact, delContact,uploadPic} from "@/api/contacts/index";
 export default {
   name: "index",
@@ -372,6 +397,13 @@
         nickName:undefined,
         name:undefined,
         work:undefined,
+
+        phone:undefined,
+        wx:undefined,
+        qq:undefined,
+        twitter:undefined,
+        isAlways:undefined,
+        remark:undefined,
       },
       // 琛ㄥ崟鍙傛暟
       form: {},
@@ -381,11 +413,11 @@
       },
       // 琛ㄥ崟鏍¢獙
       rules: {
-        id: [{
-          required: true,
-          message: '璇疯緭鍏d',
-          trigger: 'blur'
-        }],
+        // id: [{
+        //   required: true,
+        //   message: '璇疯緭鍏d',
+        //   trigger: 'blur'
+        // }],
         myName: [{
           required: true,
           message: '璇疯緭鍏ユ垚鍛樺鍚�',
@@ -402,11 +434,40 @@
           trigger: 'blur'
         }],
         work: [{
-          required: true,
+          // required: true,
           message: '璇疯緭鍏ュ伐浣滃崟浣�',
           trigger: 'blur'
         }],
-
+        phone: [{
+          // required: true,
+          message: '璇疯緭鍏ユ墜鏈�',
+          trigger: 'blur'
+        }],
+        wx: [{
+          // required: true,
+          message: '璇疯緭鍏ュ井淇�',
+          trigger: 'blur'
+        }],
+        qq: [{
+          // required: true,
+          message: '璇疯緭鍏Q',
+          trigger: 'blur'
+        }],
+        twitter: [{
+          // required: true,
+          message: '璇疯緭鍏witter',
+          trigger: 'blur'
+        }],
+        isAlways: [{
+          // required: true,
+          message: '鏄惁甯歌仈绯�',
+          trigger: 'blur'
+        }],
+        remark: [{
+          // required: true,
+          message: '璇疯緭鍏ュ娉�',
+          trigger: 'blur'
+        }],
       },
       typeOptions: [],
     };
@@ -514,7 +575,7 @@
     /** 鏌ョ湅璇︾粏淇℃伅 */
     handleCheck(row){
       const id = row.id;
-      this.$router.push("/tongxunlu/contacts/propertyInfo/" + id);
+      this.$router.push("/tongxunlu/contacts/contactsInfo/" + id);
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
@@ -522,7 +583,7 @@
       let jd = true
 
       this.$router.push({
-        path:"/tongxunlu/contacts/propertyInfo/" + id,
+        path:"/tongxunlu/contacts/contactsInfo/" + id,
         query:{
           detail:jd
         }
@@ -590,9 +651,9 @@
     },
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
-      this.download('family/property/export', {
+      this.download('zfContact/export', {
         ...this.queryParams
-      }, `property_${new Date().getTime()}.xlsx`)
+      }, `zfContact_${new Date().getTime()}.xlsx`)
     }
   }
 };
diff --git a/ruoyi-ui/src/views/self/show.vue b/ruoyi-ui/src/views/self/show.vue
index 01fe356..f28d412 100644
--- a/ruoyi-ui/src/views/self/show.vue
+++ b/ruoyi-ui/src/views/self/show.vue
@@ -1,29 +1,34 @@
 <template>
   <div class="app-container">
-
+    <!--    鍥炲埌椤堕儴-->
+    <el-backtop :bottom="150" :right="30">
+      <el-button type="primary" circle
+                 class="el-icon-top"
+      ></el-button>
+    </el-backtop>
     <h1 style="font-size:21px;padding-top:30px">涓汉绠�鍘�</h1>
     <el-divider />
-<!--    鍩烘湰淇℃伅-->
+    <!--    鍩烘湰淇℃伅-->
     <h2 style="font-size:16px">鍩烘湰淇℃伅</h2>
     <el-container>
-      <div style="padding-left:30px">
+      <div >
         <el-container >
           <el-col >
             <el-form ref="elForm" :model="individualList" :rules="rules" size="medium"  label-position="left"
                      v-loading="loading" :data="individualList" @selection-change="handleSelectionChange" >
-              <el-row :span="7">
+              <el-row :span="5">
                 <el-form-item label="濮撳悕" prop="nickName" label-width="40px">
                   <el-input v-model="individualList.nickName" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
-              <el-row :span="7">
+              <el-row :span="5">
                 <el-form-item label="鏇剧敤鍚�" prop="oldName" label-width="60px">
                   <el-input v-model="individualList.oldName" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
-              <el-row :span="7">
+              <el-row :span="5">
                 <el-form-item label="韬唤璇佸彿" prop="idNum" label-width="70px">
                   <el-input v-model="individualList.idNum" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
@@ -33,23 +38,23 @@
           </el-col>
         </el-container>
       </div>
-      <div style="padding-left:70px">
+      <div style="padding-left:30px">
         <el-container>
           <el-col v-loading="loading" :data="individualList" @selection-change="handleSelectionChange">
             <el-form ref="elForm" :model="individualList" :rules="rules" size="medium"  label-position="left">
-              <el-row :span="6">
+              <el-row :span="5">
                 <el-form-item label="鎬у埆" prop="sex" label-width="40px">
-                  <el-input v-model="individualList.sex" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
+                  <el-input v-model="individualList.sex === 1 ? '鐢�':'濂�' " placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
-              <el-row :span="6">
+              <el-row :span="5">
                 <el-form-item label="姘戞棌" prop="nation"label-width="40px">
                   <el-input v-model="individualList.nation" placeholder="" clearable :style="{width: '100%'}":disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
-              <el-row :span="8">
+              <el-row :span="5">
                 <el-form-item label="鑱旂郴鏂瑰紡" prop="phoneNumber" label-width="70px">
                   <el-input v-model="individualList.phoneNumber" placeholder="" clearable :style="{width: '100%'}":disabled="dsb">
                   </el-input>
@@ -59,19 +64,19 @@
           </el-col>
         </el-container>
       </div>
-      <div style="padding-left:70px">
+      <div style="padding-left:30px">
         <el-container>
           <el-col v-loading="loading" :data="individualList" @selection-change="handleSelectionChange">
             <el-form ref="elForm" :model="individualList" :rules="rules" size="medium"  label-position="left":disabled="dsb">
-              <el-row :span="6">
+              <el-row :span="5">
                 <el-form-item label="鍥界睄" prop="nationality" label-width="40px">
                   <el-input v-model="individualList.nationality" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
-              <el-row :span="6">
+              <el-row :span="5">
                 <el-form-item label="濠氬Щ鐘跺喌" prop="maritalStatus" label-width="70px">
-                  <el-input v-model="individualList.maritalStatus" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
+                  <el-input v-model="individualList.maritalStatus === 1 ? '宸插':'鏈'" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
                   </el-input>
                 </el-form-item>
               </el-row>
@@ -80,101 +85,95 @@
           </el-col>
         </el-container>
       </div>
-      <div style="padding-left:90px;padding-top:30px">
+      <div style="padding-left:30px;padding-top:30px">
         <el-col :span="6" :data="individualList">
-            <div class="block" :model="individualList" >
-              <el-col v-model="individualList.url" prop="url">
+          <div class="block" :model="individualList" >
+            <el-col v-model="individualList.url" prop="url">
               <el-avatar shape="square" :size=200 >
                 <el-image
                   :src="'http://47.93.189.255:8080/'+ individualList.url"
                   :fit="fit"
                 ></el-image>
               </el-avatar>
-              </el-col>
-            </div>
+            </el-col>
+          </div>
 
         </el-col>
 
 
-<!--        <el-row>-->
-<!--&lt;!&ndash;          <el-table  border style="width: 100%">&ndash;&gt;-->
-<!--&lt;!&ndash;            <el-table-column&ndash;&gt;-->
-<!--&lt;!&ndash;              prop="img"&ndash;&gt;-->
-<!--&lt;!&ndash;              v-model="individualList.img"&ndash;&gt;-->
-<!--&lt;!&ndash;              placeholder=""&ndash;&gt;-->
-<!--&lt;!&ndash;              width="180">&ndash;&gt;-->
-<!--&lt;!&ndash;              <template slot-scope="scope">&ndash;&gt;-->
-<!--&lt;!&ndash;                <img :src="scope.row.src" style="width:100px;height:50px;"/>&ndash;&gt;-->
-<!--&lt;!&ndash;              </template>&ndash;&gt;-->
-<!--&lt;!&ndash;            </el-table-column>&ndash;&gt;-->
+        <!--        <el-row>-->
+        <!--&lt;!&ndash;          <el-table  border style="width: 100%">&ndash;&gt;-->
+        <!--&lt;!&ndash;            <el-table-column&ndash;&gt;-->
+        <!--&lt;!&ndash;              prop="img"&ndash;&gt;-->
+        <!--&lt;!&ndash;              v-model="individualList.img"&ndash;&gt;-->
+        <!--&lt;!&ndash;              placeholder=""&ndash;&gt;-->
+        <!--&lt;!&ndash;              width="180">&ndash;&gt;-->
+        <!--&lt;!&ndash;              <template slot-scope="scope">&ndash;&gt;-->
+        <!--&lt;!&ndash;                <img :src="scope.row.src" style="width:100px;height:50px;"/>&ndash;&gt;-->
+        <!--&lt;!&ndash;              </template>&ndash;&gt;-->
+        <!--&lt;!&ndash;            </el-table-column>&ndash;&gt;-->
 
-<!--&lt;!&ndash;          </el-table>&ndash;&gt;-->
-<!--&lt;!&ndash;          <el-upload :class="{uoloadSty:showBtnDealImg,disUoloadSty:noneBtnImg}"&ndash;&gt;-->
-<!--&lt;!&ndash;                      ref="ref1"&ndash;&gt;-->
-<!--&lt;!&ndash;                     action=""&ndash;&gt;-->
-<!--&lt;!&ndash;                     :file-list="fileList"&ndash;&gt;-->
-<!--&lt;!&ndash;                     list-type="picture-card"&ndash;&gt;-->
-<!--&lt;!&ndash;                     accept="image/*"&ndash;&gt;-->
-<!--&lt;!&ndash;                     :auto-upload="false"&ndash;&gt;-->
-<!--&lt;!&ndash;                     :multiple="false"&ndash;&gt;-->
-<!--&lt;!&ndash;                     :limit="limitCountImg">&ndash;&gt;-->
-<!--&lt;!&ndash;            <i class="el-icon-plus"></i>&ndash;&gt;-->
-<!--&lt;!&ndash;          </el-upload>&ndash;&gt;-->
-<!--        </el-row>-->
+        <!--&lt;!&ndash;          </el-table>&ndash;&gt;-->
+        <!--&lt;!&ndash;          <el-upload :class="{uoloadSty:showBtnDealImg,disUoloadSty:noneBtnImg}"&ndash;&gt;-->
+        <!--&lt;!&ndash;                      ref="ref1"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     action=""&ndash;&gt;-->
+        <!--&lt;!&ndash;                     :file-list="fileList"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     list-type="picture-card"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     accept="image/*"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     :auto-upload="false"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     :multiple="false"&ndash;&gt;-->
+        <!--&lt;!&ndash;                     :limit="limitCountImg">&ndash;&gt;-->
+        <!--&lt;!&ndash;            <i class="el-icon-plus"></i>&ndash;&gt;-->
+        <!--&lt;!&ndash;          </el-upload>&ndash;&gt;-->
+        <!--        </el-row>-->
       </div>
 
-      <div style="padding-left:50px;padding-top:30px"  >
+      <div style="padding-left:30px;padding-top:30px" >
         <el-container >
-<!--          <template slot-scope="scope" v-if="scope.row.roleId !== 1">-->
-<!--            <el-button-->
-<!--              size="mini"-->
-<!--              type="text"-->
-<!--              icon="el-icon-edit"-->
-<!--              @click="handleUpdate(scope.row)"-->
-<!--              v-hasPermi="['system:role:edit']"-->
-<!--            >淇敼</el-button>-->
+          <!--          <template slot-scope="scope" v-if="scope.row.roleId !== 1">-->
+          <!--            <el-button-->
+          <!--              size="mini"-->
+          <!--              type="text"-->
+          <!--              icon="el-icon-edit"-->
+          <!--              @click="handleUpdate(scope.row)"-->
+          <!--              v-hasPermi="['system:role:edit']"-->
+          <!--            >淇敼</el-button>-->
 
-<!--          </template>-->
+          <!--          </template>-->
 
-          <el-row :span="2" style="flex-direction: column;">
+          <el-row  >
             <el-button
               type="primary"
-
               @click="handleUpdate(scope.row)"
               v-hasPermi="['system:role:edit']"
-
-
             >缂栬緫</el-button>
 
-<!--            <el-dropdown-->
-<!--              size="mini"-->
-<!--              @command="(command) => handleCommand(command, scope.row)"-->
-<!--              v-hasPermi="['system:role:edit']">-->
-<!--              <el-button-->
-<!--                size="mini"-->
-<!--                type="text"-->
-<!--                icon="el-icon-d-arrow-right"-->
-<!--                @click="handleCheck(scope.row)"-->
-<!--              >鏌ョ湅璇︽儏</el-button>-->
+            <!--            <el-dropdown-->
+            <!--              size="mini"-->
+            <!--              @command="(command) => handleCommand(command, scope.row)"-->
+            <!--              v-hasPermi="['system:role:edit']">    person:information:edit   -->
+            <!--              <el-button-->
+            <!--                size="mini"-->
+            <!--                type="text"-->
+            <!--                icon="el-icon-d-arrow-right"-->
+            <!--                @click="handleCheck(scope.row)"-->
+            <!--              >鏌ョ湅璇︽儏</el-button>-->
 
-<!--            </el-dropdown>-->
+            <!--            </el-dropdown>-->
             <br>
-
-              <el-button
-                type="primary"
-
-                @click="handleExport"
-                v-hasPermi="['self:user:export']"
-              >瀵煎嚭</el-button>
-
+            <el-button
+              type="primary"
+              @click="handleExport"
+              v-hasPermi="['self:user:export']"
+            >瀵煎嚭</el-button>
           </el-row>
 
         </el-container>
       </div>
-<!--      </el-dialog>-->
+      <!--      </el-dialog>-->
     </el-container>
     <el-container>
-      <div style="padding-left:30px">
+      <div>
         <el-container>
           <el-col v-loading="loading" :data="individualList" @selection-change="handleSelectionChange">
             <el-form ref="elForm" :model="individualList" :rules="rules" size="medium"  label-position="left">
@@ -229,7 +228,7 @@
       </div>
     </el-container>
 
-<!--鎶樺彔闈㈡澘-->
+    <!--鎶樺彔闈㈡澘-->
     <el-collapse v-model="activeNames" @change="handleChange">
       <el-collapse-item title="涓昏瀛︿範鍙婂伐浣滅粡鍘�" name="1" >
         <el-table v-loading="loading" :data="experienceList" @selection-change="handleSelectionChange">
@@ -250,7 +249,7 @@
                 size="mini"
                 type="text"
                 icon="el-icon-delete"
-                @click="handleDelete(scope.row)"
+                @click="handleExperienceDelete(scope.row)"
                 v-hasPermi="['system:role:remove']"
               >鍒犻櫎</el-button>
               <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
@@ -284,7 +283,7 @@
                 size="mini"
                 type="text"
                 icon="el-icon-delete"
-                @click="handleDelete(scope.row)"
+                @click="handleCertificateDelete(scope.row)"
                 v-hasPermi="['system:role:remove']"
               >鍒犻櫎</el-button>
               <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
@@ -338,17 +337,17 @@
       </el-collapse-item>
     </el-collapse>
 
-<!--    鑷紶-->
+    <!--    鑷紶-->
     <div style="padding-top:30px">
       <el-container>
         <div style="width:100%"><h2 style="font-size:15px" >鑷紶</h2></div>
       </el-container>
       <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick"
-        v-loading="loading" :data="AutobiographyList" @selection-change="handleSelectionChange">
-<!--        <el-tab-pane label="鎬昏" name="0">-->
+               v-loading="loading" :data="AutobiographyList" @selection-change="handleSelectionChange">
+        <!--        <el-tab-pane label="鎬昏" name="0">-->
 
-<!--        </el-tab-pane>-->
-<!--        <div :model="AutobiographyList">-->
+        <!--        </el-tab-pane>-->
+        <!--        <div :model="AutobiographyList">-->
         <el-tab-pane label="0~3宀�(濠村効鏈�)" name="1" >
           <el-input v-model="AutobiographyList.content" prop="content" placeholder="" clearable :style="{width: '100%'}" :disabled="dsb">
           </el-input>
@@ -360,13 +359,13 @@
         <el-tab-pane label="22~25(鐮旂┒鐢�)" name="6"></el-tab-pane>
         <el-tab-pane label="26~ (宸ヤ綔)" name="7"></el-tab-pane>
         <el-tab-pane label="锛熷瞾缁撳" name="8"></el-tab-pane>
-<!--    </div>-->
-<!--        <el-tab-pane-->
-<!--          v-for="(item, index) in AutobiographyTermList"-->
-<!--          :key="index"-->
-<!--          :name="item"-->
-<!--          :label="item"-->
-<!--        />-->
+        <!--    </div>-->
+        <!--        <el-tab-pane-->
+        <!--          v-for="(item, index) in AutobiographyTermList"-->
+        <!--          :key="index"-->
+        <!--          :name="item"-->
+        <!--          :label="item"-->
+        <!--        />-->
       </el-tabs>
 
 
@@ -396,6 +395,7 @@
 import {getIndividualList, getIndividualRelation, delIndividual, updateIndividual, addIndividual,listExperience,updateExperience,
   addExperience,delExperience} from "@/api/self/index";
 import {
+  delCertificate,
   getAbroadList,
   getAutobiography,
   getAutobiographyList,
@@ -720,12 +720,12 @@
       );
       //鍑哄浗鎯呭喌
       getAbroadList(this.queryParams).then(response => {
-        //  alert(123)
-        //   console.log(response.data)
-        this.AbroadList = response.data;
-        this.total = response.data.total;
-        this.loading = false;
-      }
+          //  alert(123)
+          //   console.log(response.data)
+          this.AbroadList = response.data;
+          this.total = response.data.total;
+          this.loading = false;
+        }
       );
 
 
@@ -790,14 +790,14 @@
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "娣诲姞瀹跺涵澶т簨璁颁俊鎭�";
+      this.title = "娣诲姞涓汉淇℃伅";
     },
 
 
     /** 鏌ョ湅璇︾粏淇℃伅 */
     handleCheck(row){
       const id = row.id;
-      this.$router.push("/family1/bignote/familyeventInfo/" + id);
+      this.$router.push("/self/self/edit/" + id);
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
@@ -805,7 +805,7 @@
       let jd = true
 
       this.$router.push({
-        path:"/self/self/edit" + id,
+        path:"/self/self/edit/" + id,
         query:{
           detail:jd
         }
@@ -816,7 +816,7 @@
       alert(23)
     },
     handleRemove(file) {
-      alert(323)
+      alert("鎿嶄綔鎴愬姛")
     },
     handlePictureCardPreview(file) {
       this.dialogImageUrl = file.url;
@@ -861,10 +861,10 @@
       this.$refs["elForm"].validate(valid => {
         if (valid) {
 
-          addFamilyevent(this.formDat).then(response => {
+          addIndividual(this.formDat).then(response => {
             this.$modal.msgSuccess("鏂板鎴愬姛");
             this.open = false;
-            this.getList1();
+            this.getList();
           });
         }
       });
@@ -892,13 +892,23 @@
       })
 
     },
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
+    /** 鍒犻櫎涓汉缁忓巻鎸夐挳鎿嶄綔 */
+    handleExperienceDelete(row) {
       const Ids = row.id || this.ids;
       this.$modal.confirm('鏄惁纭鍒犻櫎搴忓彿涓�"' + Ids + '"鐨勬暟鎹」锛�').then(function() {
-        return delFamilyevent(Ids);
+        return delExperience(Ids);
       }).then(() => {
-        this.getList1();
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 鍒犻櫎鎸佹湁鍑哄叆澧冭瘉浠舵儏鍐垫寜閽搷浣� */
+    handleCertificateDelete(row) {
+      const Ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎搴忓彿涓�"' + Ids + '"鐨勬暟鎹」锛�').then(function() {
+        return delCertificate(Ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
       }).catch(() => {});
     },
@@ -913,12 +923,18 @@
 </script>
 
 <style>
-.uoloadSty {
-  width:110px;
-  height:110px;
-  line-height:110px;
+/*.uoloadSty {*/
+/*  width:110px;*/
+/*  height:110px;*/
+/*  line-height:110px;*/
+/*}*/
+/*.disUoloadSty {*/
+/*  display:none;   !* 涓婁紶鎸夐挳闅愯棌 *!*/
+/*}*/
+
+.el-icon-top {
+  background: url("src/assets/icons/top.png");
 }
-.disUoloadSty {
-  display:none;   /* 涓婁紶鎸夐挳闅愯棌 */
-}
+
+
 </style>

--
Gitblit v1.9.1