Browse Source

Merge branch '门户修改BUG' of sckj/mz-cloud into master

sunkuosheng521 2 years ago
parent
commit
c8427ffb4d

+ 33 - 2
ruoyi-web/package-lock.json

@@ -13,11 +13,13 @@
         "axios": "0.26.1",
         "element-plus": "^2.2.8",
         "file-saver": "2.0.5",
-        "js-cookie": "3.0.1",
+        "js-cookie": "^3.0.1",
+        "jsencrypt": "^3.0.0-rc.1",
         "swiper": "^8.3.1",
         "vue": "^3.0.4",
         "vue-awesome-swiper": "^5.0.1",
-        "vue-router": "^4.1.1"
+        "vue-router": "^4.1.1",
+        "vuex": "^4.0.2"
       },
       "devDependencies": {
         "@types/node": "^18.0.3",
@@ -2012,6 +2014,11 @@
         "node": ">=12"
       }
     },
+    "node_modules/jsencrypt": {
+      "version": "3.0.0-rc.1",
+      "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.0.0-rc.1.tgz",
+      "integrity": "sha512-gcvGaqerlUJy1Kq6tNgPYteVEoWNemu+9hBe2CdsCIz4rVcwjoTQ72iD1W76/PRMlnkzG0yVh7nwOOMOOUfKmg=="
+    },
     "node_modules/json5": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
@@ -3958,6 +3965,17 @@
         "vue": "^3.2.0"
       }
     },
+    "node_modules/vuex": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz",
+      "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.2"
+      }
+    },
     "node_modules/webpack-sources": {
       "version": "3.2.3",
       "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
@@ -5447,6 +5465,11 @@
       "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.1.tgz",
       "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw=="
     },
+    "jsencrypt": {
+      "version": "3.0.0-rc.1",
+      "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.0.0-rc.1.tgz",
+      "integrity": "sha512-gcvGaqerlUJy1Kq6tNgPYteVEoWNemu+9hBe2CdsCIz4rVcwjoTQ72iD1W76/PRMlnkzG0yVh7nwOOMOOUfKmg=="
+    },
     "json5": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
@@ -6970,6 +6993,14 @@
         "@vue/devtools-api": "^6.1.4"
       }
     },
+    "vuex": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz",
+      "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      }
+    },
     "webpack-sources": {
       "version": "3.2.3",
       "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",

+ 4 - 2
ruoyi-web/package.json

@@ -11,11 +11,13 @@
     "axios": "0.26.1",
     "element-plus": "^2.2.8",
     "file-saver": "2.0.5",
-    "js-cookie": "3.0.1",
+    "js-cookie": "^3.0.1",
+    "jsencrypt": "^3.0.0-rc.1",
     "swiper": "^8.3.1",
     "vue": "^3.0.4",
     "vue-awesome-swiper": "^5.0.1",
-    "vue-router": "^4.1.1"
+    "vue-router": "^4.1.1",
+    "vuex": "^4.0.2"
   },
   "devDependencies": {
     "@types/node": "^18.0.3",

+ 26 - 1
ruoyi-web/src/api/home.js

@@ -158,4 +158,29 @@ export const ylzcJSList = (query) => {
     method: 'get',
     params: query
   })
-}
+}
+
+// 获取验证码
+export function getCodeImg() {
+  return request({
+    url: '/code',
+    headers: {
+      isToken: false
+    },
+    method: 'get',
+    timeout: 20000
+  })
+}
+
+// 登录方法
+export function login(username, password, code, uuid) {
+  return request({
+    url: '/auth/login',
+    headers: {
+      isToken: false
+    },
+    method: 'post',
+    data: { username, password, code, uuid }
+  })
+}
+

+ 2 - 0
ruoyi-web/src/main.js

@@ -7,6 +7,7 @@ import ElementPlus from 'element-plus'
 import '../node_modules/element-plus/theme-chalk/index.css'
 import { zhCn } from '../node_modules/element-plus/es/locale'
 import { resetForm, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
+import store from './store/index'
 
 import { useDict } from '@/utils/dict'
 // 分页组件
@@ -26,6 +27,7 @@ app.config.globalProperties.resetForm = resetForm
 
 app.component('Pagination', Pagination)
 
+app.use(store)
 app.use(ElementPlus, { locale: zhCn })
 app.use(router)
 app.mount('#app')

+ 121 - 0
ruoyi-web/src/store/index.js

@@ -0,0 +1,121 @@
+import { createStore } from 'vuex'
+import { login } from '@/api/home.js'
+import { getToken, setToken, setExpiresIn, removeToken } from '@/utils/auth'
+
+
+export default createStore({
+  state: {
+    token: getToken(),
+    name: '',
+    avatar: '',
+    roles: [],
+    permissions: [],
+    userData:'',
+  },
+
+  mutations: {
+    SET_USERDATA: (state, userData) => {
+      state.userData = userData
+    },
+    SET_TOKEN: (state, token) => {
+      state.token = token
+    },
+    SET_EXPIRES_IN: (state, time) => {
+      state.expires_in = time
+    },
+    SET_NAME: (state, name) => {
+      state.name = name
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+    SET_ROLES: (state, roles) => {
+      state.roles = roles
+    },
+    SET_PERMISSIONS: (state, permissions) => {
+      state.permissions = permissions
+    }
+  },
+
+  actions: {
+    // 登录
+    Login({ commit }, userInfo) {
+      const username = userInfo.username.trim()
+      const password = userInfo.password
+      const code = userInfo.code
+      const uuid = userInfo.uuid
+      return new Promise((resolve, reject) => {
+        login(username, password, code, uuid).then(res => {
+          console.log(res,'res');
+          let data = res.data
+          setToken(data.access_token)
+          commit('SET_TOKEN', data.access_token)
+          setExpiresIn(data.expires_in)
+          commit('SET_EXPIRES_IN', data.expires_in)
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 获取用户信息
+    GetInfo({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        getInfo().then(res => {
+          const user = res.user
+          const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : user.avatar;
+          if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+            commit('SET_ROLES', res.roles)
+            commit('SET_PERMISSIONS', res.permissions)
+          } else {
+            commit('SET_ROLES', ['ROLE_DEFAULT'])
+          }
+          commit('SET_NAME', user.userName)
+          commit('SET_USERDATA', user)
+          commit('SET_AVATAR', avatar)
+          resolve(res)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 刷新token
+    RefreshToken({commit, state}) {
+      return new Promise((resolve, reject) => {
+        refreshToken(state.token).then(res => {
+          setExpiresIn(res.data)
+          commit('SET_EXPIRES_IN', res.data)
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 退出系统
+    LogOut({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        logout(state.token).then(() => {
+          commit('SET_TOKEN', '')
+          commit('SET_ROLES', [])
+          commit('SET_PERMISSIONS', [])
+          removeToken()
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 前端 登出
+    FedLogOut({ commit }) {
+      return new Promise(resolve => {
+        commit('SET_TOKEN', '')
+        removeToken()
+        resolve()
+      })
+    }
+  }
+})

+ 30 - 0
ruoyi-web/src/utils/jsencrypt.js

@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
+  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+
+const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+  'UP8iWi1Qw0Y='
+
+// 加密
+export function encrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPublicKey(publicKey) // 设置公钥
+  return encryptor.encrypt(txt) // 对数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPrivateKey(privateKey) // 设置私钥
+  return encryptor.decrypt(txt) // 对数据进行解密
+}
+

+ 57 - 42
ruoyi-web/src/views/cxylhly/index.vue

@@ -26,44 +26,48 @@
           </div>
         </div>
       </div>
-      <div class="inputBox-form" v-show="isNone">
-        <div class="content">
-          <div class="info-line">
-            <img class="m10" src="@/assets/images/ylhly/cx1.png" alt="" />
-            <span>姓名:</span>
+      <el-carousel arrow="always" height="400px" v-show="isNone">
+        <el-carousel-item v-for="(item,index) in ylhlyList" :key="index">
+          <div class="inputBox-form" >
+            <div class="content">
+              <div class="info-line">
+                <img class="m10" src="@/assets/images/ylhly/cx1.png" alt="" />
+                <span>姓名:</span>
+              </div>
+              <div>{{ item.xm }}</div>
+            </div>
+            <div class="content">
+              <div class="info-line">
+                <img class="m10" src="@/assets/images/ylhly/cx2.png" alt="" />
+                <span>性别:</span>
+              </div>
+              <div>{{ selectDictLabel(C0007, item.xb) }}</div>
+            </div>
+            <div class="content">
+              <div class="info-line">
+                <img class="m10" src="@/assets/images/ylhly/cx3.png" alt="" />
+                <span>年龄:</span>
+              </div>
+              <div>{{ item.age }}</div>
+            </div>
+            <div class="content">
+              <div class="info-line">
+                <img class="m10" src="@/assets/images/ylhly/cx5.png" alt="" />
+                <span>当前工作机构</span>
+              </div>
+              <div>{{ item.jgmc }}</div>
+            </div>
+            <div class="content">
+              <div class="info-line">
+                <img class="m10" src="@/assets/images/ylhly/cx6.png" alt="" />
+                <span>持证情况:</span>
+              </div>
+              <div>{{ selectDictLabel(CH020, item.cz) }}</div>
+            </div>
+            <div class="jgck">(结果仅供参考)</div>
           </div>
-          <div>{{ ylhlyList.xm }}</div>
-        </div>
-        <div class="content">
-          <div class="info-line">
-            <img class="m10" src="@/assets/images/ylhly/cx2.png" alt="" />
-            <span>性别:</span>
-          </div>
-          <div>{{ selectDictLabel(C0007, ylhlyList.xb) }}</div>
-        </div>
-        <div class="content">
-          <div class="info-line">
-            <img class="m10" src="@/assets/images/ylhly/cx3.png" alt="" />
-            <span>年龄:</span>
-          </div>
-          <div>{{ ylhlyList.age }}</div>
-        </div>
-        <div class="content">
-          <div class="info-line">
-            <img class="m10" src="@/assets/images/ylhly/cx5.png" alt="" />
-            <span>当前工作机构</span>
-          </div>
-          <div>{{ ylhlyList.jgmc }}</div>
-        </div>
-        <div class="content">
-          <div class="info-line">
-            <img class="m10" src="@/assets/images/ylhly/cx6.png" alt="" />
-            <span>持证情况:</span>
-          </div>
-          <div>{{ selectDictLabel(CH020, ylhlyList.cz) }}</div>
-        </div>
-        <div class="jgck">(结果仅供参考)</div>
-      </div>
+        </el-carousel-item>
+      </el-carousel>
     </div>
   </div>
 </template>
@@ -233,23 +237,34 @@ const getList = () => {
   border: 1px solid #d80100;
   color: #fff;
 }
+:deep(.el-carousel){
+  width: 1000px;
+  position: absolute;
+  top: 25%;
+  left: 50%;
+  transform: translate(-50%, 0);
+  padding: 20px 35px;
+  box-sizing: border-box;
+  
+}
 .inputBox-form {
+  margin: 0 auto;
   width: 800px;
-  height: 500px;
+  height: 700px;
   background-color: #ffffff;
-  position: absolute;
+  /* position: absolute;
   top: 25%;
   left: 50%;
   transform: translate(-50%, 0);
   padding: 20px 35px;
-  box-sizing: border-box;
+  box-sizing: border-box; */
 }
 .content {
   display: flex;
   justify-content: space-between;
   align-items: center;
   font-size: 22px;
-  margin: 10px 0;
+  margin: 10px ;
   padding: 10px 0;
   position: relative;
 }
@@ -266,6 +281,6 @@ const getList = () => {
   font-size: 14px;
   color: #999999;
   position: absolute;
-  right: 5%;
+  right: 7%;
 }
 </style>

+ 188 - 11
ruoyi-web/src/views/home/index.vue

@@ -13,7 +13,14 @@
         <div class="carousel">
           <el-carousel height="395px" ref="carousel">
             <el-carousel-item v-for="(item, index) in srcData" :key="index" @click="router.push({ name: 'tpxwDetails', params: { id: item.id } })">
-              <img :src="item.url" class="topImg" />
+              <!-- <img :src="item.url" class="topImg" /> -->
+              <el-image class="topImg" :src="item.url" fit="scale-down">
+                <template #error>
+                  <div class="image-slot">
+                    <el-icon><icon-picture /></el-icon>
+                  </div>
+                </template>
+              </el-image>
               <div class="carousel_footer" :title="item.bt">
                 <div class="carousel_title title_overflow">{{ item.bt }}</div>
               </div>
@@ -139,7 +146,7 @@
           <el-tabs v-model="activeName2">
             <el-tab-pane v-for="(item, indexd) in XZ094" :label="item.label" :name="item.value">
               <div class="flex_column" style="height: 100%" v-if="changZcData(bsData, activeName2).length > 0">
-                <div @click="router.push({name:'bsznDetails',params:{ id: item.id } })" class="flex bor_bt" v-for="(item, index) in changZcData(bsData, activeName2).slice(0, 5)" :key="index">
+                <div @click="router.push({ name: 'bsznDetails', params: { id: item.id } })" class="flex bor_bt" v-for="(item, index) in changZcData(bsData, activeName2).slice(0, 5)" :key="index">
                   <div class="flex" style="width: 100%" v-if="indexd === 0">
                     <div class="title_type gr" v-if="item.sfl === '1'">个人</div>
                     <div class="title_type jg" v-else-if="item.sfl === '2'">机构</div>
@@ -205,7 +212,7 @@
           <div class="rd_title">用户中心</div>
         </div>
         <div class="rd_center flex_row">
-          <div class="user_big">
+          <!-- <div class="user_big">
             <img src="../../assets/images/addUser.png" style="width: 31px; height: 29px" />
             <el-link :href="hrefLogin" :underline="false" class="zl_title" target="_blank">新用户注册</el-link>
           </div>
@@ -216,18 +223,66 @@
           <div class="user_login">
             <img src="../../assets/images/adminLogin.png" style="width: 31px; height: 31px" />
             <el-link :href="hrefLogin" :underline="false" class="zl_title" target="_blank">管理员登录</el-link>
-          </div>
+          </div> -->
+          <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon>
+            <el-form-item prop="username">
+              <el-input v-model="loginForm.username" placeholder="账号" type="text">
+                <template v-slot:prefix>
+                  <div style="font-size: 20px">
+                    <!-- 由于SVG图标默认不携带任何属性 -->
+                    <!-- 你需要直接提供它们 -->
+                    <User style="width: 0.8em; height: 0.8em; margin-right: 5px" />
+                  </div>
+                </template>
+              </el-input>
+            </el-form-item>
+            <el-form-item prop="password">
+              <el-input v-model="loginForm.password" placeholder="密码" type="password">
+                <template v-slot:prefix>
+                  <div style="font-size: 20px">
+                    <!-- 由于SVG图标默认不携带任何属性 -->
+                    <!-- 你需要直接提供它们 -->
+                    <Lock style="width: 0.8em; height: 0.8em; margin-right: 5px" />
+                  </div>
+                </template>
+              </el-input>
+            </el-form-item>
+            <el-form-item prop="code">
+              <el-input v-model="loginForm.code" placeholder="验证码" style="width: 50%">
+                <template v-slot:prefix>
+                  <div style="font-size: 20px">
+                    <Setting style="width: 0.8em; height: 0.8em; margin-right: 5px" />
+                  </div>
+                </template>
+              </el-input>
+              <div class="login-code">
+                <img :src="codeUrl" @click="getCode" class="login-code-img" />
+              </div>
+            </el-form-item>
+            <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 15px 0px">记住密码</el-checkbox>
+            <el-form-item>
+              <el-button type="danger" @click.prevent="handleLogin(loginFormRef)">登录</el-button>
+              <!-- <el-link :href="hrefLogin" :underline="false" class="zl_title" target="_blank" @click.prevent="handleLogin(loginFormRef)">普通用户登录</el-link> -->
+              <el-link :href="hrefLogin" :underline="false" class="zl_title" target="_blank">管理员登录</el-link>
+            </el-form-item>
+          </el-form>
         </div>
       </div>
     </div>
   </div>
 </template>
 
-<script setup>
-import { ref, onMounted } from 'vue'
-import { useRouter } from 'vue-router'
+<script setup >
+import { ref, onMounted, reactive, getCurrentInstance, watch } from 'vue'
+import { useRouter,useRoute } from 'vue-router'
+import { Picture as IconPicture } from '@element-plus/icons-vue'
+import { encrypt, decrypt } from '@/utils/jsencrypt'
+import { useStore } from "vuex"
+import Cookies from 'js-cookie'
 let router = useRouter()
-import { lbList, rdList, ttList, zcList, wlList, bsList } from '@/api/home'
+let route = useRoute()
+let store = useStore()
+import { lbList, rdList, ttList, zcList, wlList, bsList, getCodeImg } from '@/api/home'
 const { proxy } = getCurrentInstance()
 const { XZ085, XZ086, XZ093, XZ094 } = proxy.useDict('XZ085', 'XZ086', 'XZ093', 'XZ094')
 const hrefLogin = ref('http://mz.tshe.cn:801/login')
@@ -243,21 +298,99 @@ const jgData = ref([
   { src: new URL('../../assets/images/jg5.png', import.meta.url).href, label: '助餐服务点' },
   { src: new URL('../../assets/images/jg6.png', import.meta.url).href, label: '护理院/站' }
 ])
+let loading = ref(false)
 const xwData = ref([])
 const bsData = ref([])
 const srcData = ref([])
 const zcData = ref([])
 const rdData = ref([])
-const carousel = ref(null);
+const carousel = ref(null)
+let redirect = ref(undefined)
+const loginForm = reactive({
+  username: '',
+  password: '',
+  code: '',
+  uuid: '',
+  rememberMe: false
+})
+const formSize = ref('default')
+const loginFormRef = ref(null)
+const loginRules = reactive({
+  username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
+  password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
+  code: [{ required: true, message: '请输入验证码', trigger: 'blur' }]
+})
+
+let codeUrl = ref('')
+let captchaOnOff = ref(true)
+
+function getCookie() {
+  const username = Cookies.get('username')
+  const password = Cookies.get('password')
+  const rememberMe = Cookies.get('rememberMe')
+  loginForm = {
+    username: username === undefined ? loginForm.username : username,
+    password: password === undefined ? loginForm.password : decrypt(password),
+    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
+  }
+}
+
+watch( route, (newVal) => {
+  console.log(newVal,'route');
+	redirect.value = route.query && route.query.redirect;
+  console.log(redirect.value,'redirect.value');
+  
+},{ immediate: true, deep: true } )
+
+const handleLogin = async () => {
+  if (!loginFormRef) return
+  await loginFormRef.value.validate( (valid) => {
+    if (valid) {
+      loading.value = true
+      if (loginForm.rememberMe) {
+        Cookies.set('username', loginForm.username, { expires: 30 })
+        Cookies.set('password', encrypt(loginForm.password), { expires: 30 })
+        Cookies.set('rememberMe', loginForm.rememberMe, { expires: 30 })
+      } else {
+        Cookies.remove('username')
+        Cookies.remove('password')
+        Cookies.remove('rememberMe')
+      }
+      store
+        .dispatch('Login', loginForm)
+        .then((res) => {
+          console.log('吃了吗');
+          console.log(res,'res');
+          // router.push({ path: redirect.value || '/' }).catch(() => {})
+        })
+        .catch(() => {
+          loading.value = false
+          if (captchaOnOff.value) {
+            getCode()
+          }
+        })
+    }
+  })
+}
+
+function getCode() {
+  getCodeImg().then((res) => {
+    captchaOnOff.value = res.captchaOnOff === undefined ? true : res.captchaOnOff
+    if (captchaOnOff.value) {
+      codeUrl.value = 'data:image/gif;base64,' + res.img
+      loginForm.uuid = res.uuid
+    }
+  })
+}
 
 // 图片新闻
 function getLbList() {
   lbList().then((res) => {
     srcData.value = res.rows
     //处理刚开始显示空白页
-    setTimeout(()=>{
+    setTimeout(() => {
       carousel.value.setActiveItem(0)
-    },500)
+    }, 500)
   })
 }
 
@@ -354,6 +487,7 @@ onMounted(() => {
   getZcList()
   getWlList()
   getBsList()
+  getCode()
 })
 </script>
 <style></style>
@@ -792,4 +926,47 @@ onMounted(() => {
   justify-content: center;
   align-items: center;
 }
+
+.image-slot {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background: var(--el-fill-color-light);
+  color: var(--el-text-color-secondary);
+  font-size: 50px;
+}
+.image-slot .el-icon {
+  font-size: 50px;
+}
+
+:deep(.el-form) {
+  width: 80%;
+}
+:deep(.el-form-item) {
+  margin-bottom: 16px;
+}
+
+:deep(.el-form-item__content) {
+  margin-left: 0px !important;
+}
+
+.login-code {
+  width: 33%;
+  height: 38px;
+  float: right;
+  margin-left: 15px;
+}
+.login-code img {
+  cursor: pointer;
+  vertical-align: middle;
+}
+.login-code-img {
+  height: 38px;
+}
+
+:deep(.el-form-item__content){
+  justify-content: space-between;
+}
 </style>

+ 22 - 1
ruoyi-web/src/views/jgcx/index.vue

@@ -102,7 +102,13 @@
                 <div class="jg_box" v-for="(item,index) in jgData" :key="index">
                     <div class="jg_main">
                         <div class="img" @click="jgXq(item.id)">
-                        <el-image style="width: 100%;height: 100%" :src="item.url" fit="cover"  />
+                        <el-image style="width: 100%;height: 100%" :src="item.url" fit="cover">
+                            <template #error>
+                                <div class="image-slot">
+                                    <el-icon><icon-picture /></el-icon>
+                                </div>
+                            </template>
+                        </el-image>
                         </div>
                         <div class="rigth_nr">
                             <div class="height25 font_style1">
@@ -165,6 +171,7 @@
     import {Search} from '@element-plus/icons-vue'
     import {jcxxList} from '@/api/home'
     import {useRouter,useRoute} from 'vue-router'
+    import { Picture as IconPicture } from '@element-plus/icons-vue'
     let router = useRouter();
     let route=useRoute();
     const {proxy} = getCurrentInstance();
@@ -525,4 +532,18 @@
         font-weight: 400;
         color: #999999;
     }
+
+    .image-slot {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 100%;
+        height: 100%;
+        background: var(--el-fill-color-light);
+        color: var(--el-text-color-secondary);
+        font-size: 30px;
+    }
+    .image-slot .el-icon {
+        font-size: 30px;
+    }
 </style>

+ 0 - 2
ruoyi-web/src/views/jiansuo/index.vue

@@ -47,8 +47,6 @@ const loading = ref(false)
 const search = () => {
   if (queryParams.bt || queryParams.issSj) {
     getList()
-    queryParams.bt = null
-    queryParams.issSj = null
   } else {
     ElMessage({
       message: '请输入关键字或选择日期',

+ 42 - 17
ruoyi-web/src/views/yldt/index.vue

@@ -10,22 +10,41 @@
             </div>
         </div>
         <div>
-            <el-from :model="formLabelAlign" ref="queryRef"  class="flex">
-                <el-form-item label="机构名称" prop="jgmc">
-                    <el-input v-model="formLabelAlign.jgmc" clearable placeholder="请输入机构名称"/>
-                </el-form-item>
-                <el-form-item label="行政区划" prop="xzqhId">
-                    <el-cascader v-model="formLabelAlign.xzqhId" clearable :props="props"/>
-                </el-form-item>
-                <el-form-item label="机构类型" prop="state">
-                    <el-select v-model="formLabelAlign.state" clearable placeholder="请选择机构类型">
-                        <el-option v-for="item in XZ093" :label="item.label" :value="item.value"/>
-                    </el-select>
-                </el-form-item>
+            <el-from :model="formLabelAlign" ref="queryRef">
+                <div class="flex">
+                    <el-form-item label="机构名称" prop="jgmc">
+                        <el-input v-model="formLabelAlign.jgmc" clearable placeholder="请输入机构名称"/>
+                    </el-form-item>
+                    <el-form-item label="行政区划" prop="xzqhId">
+                        <el-cascader v-model="formLabelAlign.xzqhId" clearable :props="props"/>
+                    </el-form-item>
+                    <el-form-item label="机构类型" prop="state">
+                        <el-select v-model="formLabelAlign.state" clearable placeholder="请选择机构类型">
+                            <el-option v-for="item in XZ093" :label="item.label" :value="item.value"/>
+                        </el-select>
+                    </el-form-item>
+                </div>
+                <div class="flex">
+                    <el-form-item label="机构等级" prop="pddj">
+                        <el-select v-model="formLabelAlign.pddj" clearable placeholder="请选择机构等级">
+                            <el-option v-for="item in CZ015" :key="item.value" :label="item.label" :value="item.value"/>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="是否长护险定点" prop="isChxddjg">
+                        <el-select v-model="formLabelAlign.isChxddjg" clearable placeholder="请选择是否长护险定点">
+                            <el-option v-for="item in CZ035" :key="item.value" :label="item.label" :value="item.value"/>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="有无空余床位" prop="cwzs">
+                        <el-select v-model="formLabelAlign.cwzs" clearable placeholder="请选择有无空余床位">
+                            <el-option v-for="item in CZ035" :key="item.value" :label="item.label" :value="item.value"/>
+                        </el-select>
+                    </el-form-item>
+                </div>
                 <el-form-item>
-                    <el-button type="danger" @click="handleQuery">搜索</el-button>
-                    <el-button @click="resetQuery()">重置</el-button>
-                </el-form-item>
+                        <el-button type="danger" @click="handleQuery">搜索</el-button>
+                        <el-button @click="resetQuery()">重置</el-button>
+                    </el-form-item>
             </el-from>
         </div>
         <div class="flex" v-loading="loading" style="position: relative">
@@ -112,7 +131,7 @@
     import {useRoute} from 'vue-router'
     let route=useRoute();
     const {proxy} = getCurrentInstance();
-    const {XZ093} = proxy.useDict("XZ093");
+    const {XZ093, CZ035, CZ015} = proxy.useDict("XZ093",'CZ035','CZ015');
     const props = {
         lazy: true,
         checkStrictly: true,
@@ -156,7 +175,10 @@
     const formLabelAlign = reactive({
         jgmc: '',
         xzqhId: '',
-        state: ''
+        state: '',
+        isChxddjg:'',
+        pddj:'',
+        cwzs:''
     });
     const  formXq=ref({});
     const  isShow=ref(true);
@@ -195,6 +217,9 @@
         }
         jcxxMap(quer).then(response => {
             isShow.value=true;
+            formLabelAlign.pddj = quer.pddj
+            formLabelAlign.isChxddjg = quer.isChxddjg
+            formLabelAlign.cwzs = quer.cwzs
             jgList.value=response.data;
             //地图被销毁就不用添加点坐标了
             if(!isDestroy.value)

+ 7 - 4
ruoyi-web/src/views/ylhly/index.vue

@@ -72,21 +72,24 @@ let router = useRouter()
   background-position: 0px -55px;
 }
 
+.text-box{
+  height: 700px;
+  position: relative;
+}
+
 .text-box p {
   font-size: 22px;
   margin: 0;
   text-indent: 2em;
   padding: 0px 50px;
   color: #373d41;
-  position: relative;
+  
 }
 .text-box p:nth-child(1) {
   padding-top: 60px;
   padding-bottom: 20px;
 }
-.text-box p:nth-child(2) {
-  padding-bottom: 350px;
-}
+
 .text-box-btn {
   position: absolute;
   bottom: 260px;

+ 2 - 1
ruoyi-web/src/views/ylzc/index.vue

@@ -203,7 +203,8 @@ function tabChange(name) {
     pageNum: 1,
     pageSize: 10,
     ffl: '',
-    sfl: []
+    sfl: [],
+    mkqf:'00'
   }
   if (name !== 'first') {
     queryParams.value.ffl = name