XiaXxxxxx vor 2 Jahren
Ursprung
Commit
acf3f03311

BIN
src/assets/images/login/bg.png


BIN
src/assets/images/login/login-box.png


BIN
src/assets/images/login/password-icon.png


BIN
src/assets/images/login/title.png


BIN
src/assets/images/login/user-icon.png


+ 3 - 3
src/sys/login/Login.vue

@@ -80,7 +80,7 @@
       background-color: @dark-bg;
 
       &::before {
-        background-image: url(/@/assets/svg/login-bg-dark.svg);
+        // background-image: url(/@/assets/svg/login-bg-dark.svg);
       }
 
       .ant-input,
@@ -126,7 +126,7 @@
       width: 100%;
       height: 100%;
       margin-left: -48%;
-      background-image: url(/@/assets/svg/login-bg.svg);
+      // background-image: url(/@/assets/svg/login-bg.svg);
       background-position: 100%;
       background-repeat: no-repeat;
       background-size: auto 100%;
@@ -181,7 +181,7 @@
     }
 
     input:not([type='checkbox']) {
-      min-width: 360px;
+      // min-width: 360px;
 
       @media (max-width: @screen-xl) {
         min-width: 320px;

+ 22 - 10
src/views/dataAdmin/dataAdmin/directoryManagement/index.vue

@@ -22,14 +22,14 @@
           <a-input-search v-model:value="treeSearchValue" style="margin-bottom: 8px" placeholder="搜索关键字" />
           <a-tree class="tree-list" :tree-data="treeData" @select="select" :expandedKeys="expandedKeys"
             :auto-expand-parent="autoExpandParent" @expand="onExpand">
-            <template #title="{ title, selected }">
+            <template #title="{ title, selected, dataRef }">
               <span v-if="title.indexOf(treeSearchValue) > -1">
                 {{ title.substr(0, title.indexOf(treeSearchValue)) }}
                 <span style="color: #f50">{{ treeSearchValue }}</span>
                 {{ title.substr(title.indexOf(treeSearchValue) + treeSearchValue.length) }}
               </span>
               <span v-else>{{ title }}</span>
-              <span class="del-btn" v-if="selected" @click="delTreeNode()">删除</span>
+              <span class="del-btn" v-if="selected" @click="delTreeNode(dataRef)">删除</span>
             </template>
           </a-tree>
         </a-card>
@@ -137,12 +137,12 @@
   </div>
 </template>
 <script>
-import { defineComponent, ref } from 'vue';
+import { defineComponent, ref, createVNode, } from 'vue';
 import { getTreeRootId, getTreeList, delNode, updateNode, updateNodeList } from '/@/api/sys/dirManager';
-// import Guid from 'guid';
 import { v4 as uuidv4 } from 'uuid';
 import { session } from '/@/utils/Memory';
-import { message, Empty } from 'ant-design-vue';
+import { message, Empty, Modal } from 'ant-design-vue';
+import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
 import DirManagerDrawer from './DirManagerDrawer.vue';
 
 export default defineComponent({
@@ -357,12 +357,24 @@ export default defineComponent({
 
     //删除节点
     delTreeNode(item) {
-      console.log();
-      this.recordsData.push(`删除节点:${this.formState.name}`)
-      // console.log(item);
-      if (this.formState.id) {
+      Modal.confirm({
+        title: '删除提示',
+        icon: createVNode(ExclamationCircleOutlined),
+        content: '确定删除该节点及其子节点?',
+        centered: true,
+        okText: '确定',
+        okType: 'danger',
+        cancelText: '取消',
+        onOk:(()=> {
+          this.delFunc(item)
+        })
+      });
+    },
+    delFunc(item) {
+      this.recordsData.push(`删除节点:${item.name}`)
+      if (item.id) {
         this.delIds = ''
-        this.getChildrenIds(this.formState)
+        this.getChildrenIds(item)
         let param = {
           1: session.getItem('tokenV2'),
           2: this.delIds

+ 111 - 35
src/views/dataAdmin/dataAdmin/resourceCataloging/index.vue

@@ -58,18 +58,15 @@
                 </a-row>
               </div>
               <div class="right-content-bottom">
-                <!-- <a-checkbox-group v-model:value="value">
-                <a-row :gutter="24">
-                  <a-col :span="12" v-for="item in usedResourceData" :key="item.serviceid" :value="item.serviceid">
-                    <a-checkbox>{{ item.servicename }}</a-checkbox>
-                  </a-col>
-                </a-row>
-              </a-checkbox-group> -->
-                <a-checkbox-group v-model:value="useValue" name="checkboxgroup" :options="usedResourceData"
-                  @change="(e)=>{selectUsedData(e)}">
+                <a-checkbox-group v-model:value="useValue" name="checkboxgroup" @change="(e) => { selectUsedData(e) }">
                   <a-row :gutter="24">
-                    <a-col :span="12" v-for="item in usedResourceData" :key="item.serviceid" :value="item.serviceid">
-                      <a-checkbox></a-checkbox>
+                    <a-col :span="12" v-for="item in usedResourceData" :key="item.value">
+                      <a-checkbox :value="item.value">
+                        <span class="rtype"
+                          :class="{ 'color-mr': item.rtype === 'MR', 'color-er': item.rtype === 'ER', 'color-dr': item.rtype === 'DR' }">{{
+                            item.rtype }}</span>
+                        <span class="label">{{ item.label }}</span>
+                      </a-checkbox>
                     </a-col>
                   </a-row>
                 </a-checkbox-group>
@@ -78,14 +75,10 @@
             </a-card>
           </div>
           <div class="right-content-middle">
-            <a-row>
-              <a-col>
-                <a-button type="primary" @click="addAssociateData">添加关联</a-button>
-              </a-col>
-              <a-col>
-                <a-button type="primary" danger style="margin-top: 20px;" @click="cancelAssociateData">移除关联</a-button>
-              </a-col>
-            </a-row>
+            <div class="btn-group">
+              <a-button class="add-btn" @click="addAssociateData">{{ `>>添加关联` }}</a-button>
+              <a-button class="del-btn" style="margin-top: 20px;" @click="cancelAssociateData">{{ `<<移除关联` }}</a-button>
+            </div>
           </div>
           <div class="right-content-right">
             <a-card style="height: 100%;">
@@ -95,19 +88,22 @@
                 </a-row>
               </div>
               <div class="right-content-bottom">
-                <!-- <a-checkbox-group v-model:value="associatedValue">
-                <a-row :gutter="24">
-                  <a-col :span="12" v-for="item in associatedData" :key="item.serviceid" :value="item.serviceid">
-                    <a-checkbox>{{ item.servicename }}</a-checkbox>
-                  </a-col>
-                </a-row>
-              </a-checkbox-group> -->
-                <a-checkbox-group v-model:value="cancleUseValue" name="checkboxgroup" :options="associatedData"
+                <a-checkbox-group v-model:value="cancleUseValue" name="checkboxgroup"
                   @change="(checkedValue) => { cancleUsedData(checkedValue) }">
-                  <a-row :gutter="24">
+                  <!-- <a-row :gutter="24">
                     <a-col :span="12" v-for="item in associatedData" :key="item.serviceid" :value="item.serviceid">
                       <a-checkbox></a-checkbox>
                     </a-col>
+                  </a-row> -->
+                  <a-row :gutter="24">
+                    <a-col :span="12" v-for="item in associatedData" :key="item.value">
+                      <a-checkbox :value="item.value">
+                        <span class="rtype"
+                          :class="{ 'color-mr': item.rtype === 'MR', 'color-er': item.rtype === 'ER', 'color-dr': item.rtype === 'DR' }">{{
+                            item.rtype }}</span>
+                        <span class="label">{{ item.label }}</span>
+                      </a-checkbox>
+                    </a-col>
                   </a-row>
                 </a-checkbox-group>
               </div>
@@ -313,12 +309,14 @@ export default defineComponent({
           usedResourceData.value = []
           const data = JSON.parse(res.result)
           data.items.forEach((item) => {
+            console.log(item.rtype);
             usedResourceData.value.push({
               label: item.servicename,
               value: JSON.stringify({
                 name: item.servicename,
                 id: item.serviceid
-              })
+              }),
+              rtype: item.rtype
             })
           })
         }
@@ -355,7 +353,7 @@ export default defineComponent({
     const nodeSelect = (selectedKeys, { selectedNodes, node }) => {
       console.log("点击树的数据")
       console.log(node.dataRef);
-      clickTreeNode.value = {...node.dataRef}
+      clickTreeNode.value = { ...node.dataRef }
       getAssociatedData(clickTreeNode.value.id, coordinateChangeValue.value)
     }
 
@@ -514,19 +512,46 @@ export default defineComponent({
       width: 100%;
 
       .right-content-left {
-        width: 45%;
+        width: 46%;
         height: calc(100% - 0px);
       }
 
       .right-content-middle {
-        width: 10%;
+        width: 8%;
         height: calc(100% - 0px);
-        padding-left: 25px;
-        padding-top: 320px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+
+        .btn-group {
+          width: 94px;
+
+          ::v-deep .add-btn {
+            padding: 0;
+            width: 94px;
+            height: 34px;
+            background: #0671DD;
+            font-size: 14px;
+            font-weight: normal;
+            line-height: 34px;
+            color: #FFFFFF;
+          }
+
+          ::v-deep .del-btn {
+            padding: 0;
+            width: 94px;
+            height: 34px;
+            background: #F8252C;
+            font-size: 14px;
+            font-weight: normal;
+            line-height: 34px;
+            color: #FFFFFF;
+          }
+        }
       }
 
       .right-content-right {
-        width: 45%;
+        width: 46%;
         height: calc(100% - 0px);
       }
 
@@ -542,6 +567,57 @@ export default defineComponent({
         border-color: #E9E9E9;
         // box-shadow:0 0 10px #ddd;
         padding: 20px;
+        overflow: auto;
+
+        ::v-deep label {
+          // display: flex;
+          padding: 10px 0;
+          // align-items: center;
+
+          span {
+            &:last-child {
+              align-items: center;
+              vertical-align: text-bottom;
+            }
+          }
+        }
+
+        .rtype {
+          margin-right: 5px;
+          display: inline-block;
+          font-family: Source Han Sans CN;
+          font-size: 12px;
+          font-weight: bold;
+          line-height: 20px;
+          color: #FFFFFF;
+          text-align: center;
+          width: 30px;
+          height: 20px;
+          border-radius: 10px;
+        }
+
+        .color-mr {
+          background: #8205C1;
+        }
+
+        .color-er {
+          background: #05C17F;
+        }
+
+        .color-dr {
+          background: #FC8B01;
+        }
+
+        .label {
+          display: inline-block;
+          width: 150px;
+          height: 20px;
+          font-size: 16px;
+          line-height: 20px;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
       }
     }
   }

+ 230 - 233
src/views/sys/login/Login.vue

@@ -1,28 +1,23 @@
 <template>
-  <div
-    style="background-size: 100% 100%"
-    :style="{ backgroundImage: 'url(' + (logoUrl !== undefined ? logoUrl : '') + ')' }"
-    :class="prefixCls"
-    class="relative w-full h-full px-4"
-  >
-    <AppLocalePicker
+  <div :class="prefixCls" class="relative w-full h-full px-4">
+    <!-- <AppLocalePicker
       class="absolute text-white top-4 right-4 enter-x xl:text-gray-600"
       :showText="false"
       v-if="!sessionTimeout && showLocale"
     />
-    <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" />
+    <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" /> -->
 
     <span class="-enter-x xl:hidden">
       <!-- <AppLogo :alwaysShowTitle="true" /> -->
     </span>
 
     <div class="container relative h-full py-2 mx-auto sm:px-10">
-      <div class="flex h-full">
-        <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12">
-          <!-- <AppLogo class="-enter-x" /> -->
+      <div class="flex h-full" style="flex-direction: column;justify-content: flex-start; align-items: center;">
+        <!-- <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12">
+          <AppLogo class="-enter-x" />
           <div style="display: flex; margin-top: 10px">
-            <!-- <img v-if="defaultLogo" :src="defaultLogo" style="width: 48px; height: 48px" /> -->
-            <!-- <img style="width: 48px; height: 48px" v-else src="/src/assets/images/logo.png" /> -->
+            <img v-if="defaultLogo" :src="defaultLogo" style="width: 48px; height: 48px" />
+            <img style="width: 48px; height: 48px" v-else src="/src/assets/images/logo.png" />
             <div
               class="ml-2 truncate md:opacity-100"
               style="
@@ -33,7 +28,7 @@
                 font-weight: 700;
               "
             >
-              <!-- {{ defaultTitle }} -->
+              {{ defaultTitle }}
               空间数据管理平台
             </div>
           </div>
@@ -50,8 +45,8 @@
               {{ t('sys.login.signInDesc') }}
             </div>
           </div>
-        </div>
-        <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12">
+        </div> -->
+        <!-- <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12">
           <div
             :class="`${prefixCls}-form`"
             class="relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x"
@@ -61,9 +56,14 @@
             <RegisterForm />
             <MobileForm />
           </div>
+        </div> -->
+        <div class="logo-title-box" style="margin: 124px 0;">
+          <img :src="logoBg" alt="">
+        </div>
+        <div class="login-box" style="width: 380px;height: 420px;padding: 56px 40px;">
+          <LoginForm />
         </div>
-        <span
-          style="
+        <!-- <span style="
             height: 30px;
             width: 650px;
             white-space: nowrap;
@@ -71,280 +71,277 @@
             top: 96%;
             left: 30%;
             color: #000;
-          "
-        >
+          ">
           Copyright © tofly.com 2001-2023
-          <a-button
-            type="text"
-            href="https://www.tofly.cn/"
-            target="_blank"
-            style="color: black; cursor: pointer"
-          >
-            成都同飞科技有限责任公司 </a-button
-          >&nbsp;版权所有 &nbsp;<a-button
-            type="text"
-            href="http://beian.miit.gov.cn/"
-            target="_blank"
-            style="color: black; cursor: pointer"
-          >
+          <a-button type="text" href="https://www.tofly.cn/" target="_blank" style="color: black; cursor: pointer">
+            成都同飞科技有限责任公司 </a-button>&nbsp;版权所有 &nbsp;<a-button type="text" href="http://beian.miit.gov.cn/"
+            target="_blank" style="color: black; cursor: pointer">
             备案号: 蜀ICP备05002285号
           </a-button>
-        </span>
+        </span> -->
       </div>
     </div>
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, onMounted } from 'vue';
-  // import { AppLogo } from '/@/components/Application';
-  import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
-  import LoginForm from './LoginForm.vue';
-  import ForgetPasswordForm from './ForgetPasswordForm.vue';
-  import RegisterForm from './RegisterForm.vue';
-  import MobileForm from './MobileForm.vue';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLocaleStore } from '/@/store/modules/locale';
-  // import { useUserStore } from '/@/store/modules/user';
-  import { getPlatForm } from '/@/api/oem/index';
-  import defaultShowLogoImg from '/@/assets/svg/login-bg.svg';
-  import defaultShowLogoDarkImg from '/@/assets/svg/login-bg-dark.svg';
-  import { useTitle } from '@vueuse/core';
-  import { createLocalStorage } from '/@/utils/cache';
-  // import {usePlatform} from '/@/views/system/customize/hook/usePlatformInfo'
-
-  defineProps({
-    sessionTimeout: {
-      type: Boolean,
-    },
-  });
-  const { title } = useGlobSetting();
-  const defaultTitle = ref('');
-  const defaultLogo = ref('');
-  const logoUrl = ref('');
-  // const userStore = useUserStore();
-  const storage = createLocalStorage();
-
-  onMounted(async () => {
-    let res = storage.get('platformInfo');
-    if (res === '' || res === null) {
-      res = await getPlatForm();
-    }
-    logoUrl.value = res?.background;
-    defaultTitle.value = res?.name || title;
-    defaultLogo.value = res?.logo;
-    let link = (document.querySelector("link[rel*='icon']") ||
-      document.createElement('link')) as HTMLLinkElement;
-    link.type = 'image/x-icon';
-    link.rel = 'shortcut icon';
-    link.href = res?.icon ?? '/favicon.ico';
-    document.getElementsByTagName('head')[0].appendChild(link);
-    let defaultLogoBg = document.createElement('style');
-    let defaultLogoDarkBg = document.createElement('style');
-    if (logoUrl.value !== undefined) {
-      //企业自定义
-      ifCustom.value = false;
-      //默认图片
-      defaultLogoBg.innerHTML = `.vben-login::before{
+import { ref, onMounted } from 'vue';
+// import { AppLogo } from '/@/components/Application';
+import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
+import LoginForm from './LoginForm.vue';
+// import ForgetPasswordForm from './ForgetPasswordForm.vue';
+// import RegisterForm from './RegisterForm.vue';
+// import MobileForm from './MobileForm.vue';
+import { useGlobSetting } from '/@/hooks/setting';
+import { useI18n } from '/@/hooks/web/useI18n';
+import { useDesign } from '/@/hooks/web/useDesign';
+import { useLocaleStore } from '/@/store/modules/locale';
+// import { useUserStore } from '/@/store/modules/user';
+import { getPlatForm } from '/@/api/oem/index';
+import defaultShowLogoImg from '/@/assets/svg/login-bg.svg';
+import defaultShowLogoDarkImg from '/@/assets/svg/login-bg-dark.svg';
+import { useTitle } from '@vueuse/core';
+import { createLocalStorage } from '/@/utils/cache';
+// import {usePlatform} from '/@/views/system/customize/hook/usePlatformInfo'
+import logoBg from '/@/assets/images/login/title.png';
+
+defineProps({
+  sessionTimeout: {
+    type: Boolean,
+  },
+});
+const { title } = useGlobSetting();
+const defaultTitle = ref('');
+const defaultLogo = ref('');
+const logoUrl = ref('');
+// const userStore = useUserStore();
+const storage = createLocalStorage();
+
+onMounted(async () => {
+  let res = storage.get('platformInfo');
+  if (res === '' || res === null) {
+    res = await getPlatForm();
+  }
+  logoUrl.value = res?.background;
+  defaultTitle.value = res?.name || title;
+  defaultLogo.value = res?.logo;
+  let link = (document.querySelector("link[rel*='icon']") ||
+    document.createElement('link')) as HTMLLinkElement;
+  link.type = 'image/x-icon';
+  link.rel = 'shortcut icon';
+  link.href = res?.icon ?? '/favicon.ico';
+  document.getElementsByTagName('head')[0].appendChild(link);
+  let defaultLogoBg = document.createElement('style');
+  let defaultLogoDarkBg = document.createElement('style');
+  if (logoUrl.value !== undefined) {
+    //企业自定义
+    ifCustom.value = false;
+    //默认图片
+    defaultLogoBg.innerHTML = `.vben-login::before{
       background-image:url("");
       position:absolute;
     }`;
-      //切换黑暗模式图片
-      defaultLogoDarkBg.innerHTML = `html[data-theme='dark'] .vben-login::before{
+    //切换黑暗模式图片
+    defaultLogoDarkBg.innerHTML = `html[data-theme='dark'] .vben-login::before{
       background-image:url("");
       position:absolute;
     }`;
-    } else {
-      logoUrl.value = 'url(' + defaultShowLogoImg + ')';
-      //默认图片
-      defaultLogoBg.innerHTML = `.vben-login::before{
+  } else {
+    logoUrl.value = 'url(' + defaultShowLogoImg + ')';
+    //默认图片
+    defaultLogoBg.innerHTML = `.vben-login::before{
       background-image:url(${defaultShowLogoImg});
       position:absolute;
     }`;
-      //切换黑暗模式图片
-      defaultLogoDarkBg.innerHTML = `html[data-theme='dark'] .vben-login::before{
+    //切换黑暗模式图片
+    defaultLogoDarkBg.innerHTML = `html[data-theme='dark'] .vben-login::before{
       background-image:url(${defaultShowLogoDarkImg});
       position:absolute;
     }`;
-    }
-    document.head.appendChild(defaultLogoBg);
-    document.head.appendChild(defaultLogoDarkBg);
-  });
-
-  // const userStore = useUserStore();
-
-  const ifCustom = ref(true);
-  // const getLogo = computed(() => {
-  //   return userStore.platInfo?.logo;
-  // });
-  // const getTitle = computed(() => {
-  //   // 设置icon
-  //   let link = (document.querySelector("link[rel*='icon']") ||
-  //     document.createElement('link')) as HTMLLinkElement;
-  //   link.type = 'image/x-icon';
-  //   link.rel = 'shortcut icon';
-  //   link.href = userStore.platInfo?.icon ?? '/favicon.ico';
-  //   document.getElementsByTagName('head')[0].appendChild(link);
-  //   // logoUrl.value = userStore.platInfo?.background;
-  //   // if (logoUrl.value !== undefined) {
-  //   //   ifCustom.value = false;
-  //   // } else {
-  //   //   logoUrl.value = 'url(' + defaultShowLogoImg + ')';
-  //   // }
-  //   return userStore.platInfo?.name ?? title;
-  // });
-  // const globSetting = useGlobSetting();
-  const { prefixCls } = useDesign('login');
-  const { t } = useI18n();
-  const localeStore = useLocaleStore();
-  const showLocale = localeStore.getShowPicker;
-  // const title = computed(() => globSetting?.title ?? '');
-
-  onMounted(() => {
-    useTitle('空间数据管理平台');
-  });
+  }
+  document.head.appendChild(defaultLogoBg);
+  document.head.appendChild(defaultLogoDarkBg);
+});
+
+// const userStore = useUserStore();
+
+const ifCustom = ref(true);
+// const getLogo = computed(() => {
+//   return userStore.platInfo?.logo;
+// });
+// const getTitle = computed(() => {
+//   // 设置icon
+//   let link = (document.querySelector("link[rel*='icon']") ||
+//     document.createElement('link')) as HTMLLinkElement;
+//   link.type = 'image/x-icon';
+//   link.rel = 'shortcut icon';
+//   link.href = userStore.platInfo?.icon ?? '/favicon.ico';
+//   document.getElementsByTagName('head')[0].appendChild(link);
+//   // logoUrl.value = userStore.platInfo?.background;
+//   // if (logoUrl.value !== undefined) {
+//   //   ifCustom.value = false;
+//   // } else {
+//   //   logoUrl.value = 'url(' + defaultShowLogoImg + ')';
+//   // }
+//   return userStore.platInfo?.name ?? title;
+// });
+// const globSetting = useGlobSetting();
+const { prefixCls } = useDesign('login');
+const { t } = useI18n();
+const localeStore = useLocaleStore();
+const showLocale = localeStore.getShowPicker;
+// const title = computed(() => globSetting?.title ?? '');
+
+onMounted(() => {
+  useTitle('空间数据管理平台');
+});
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-login';
-  @logo-prefix-cls: ~'@{namespace}-app-logo';
-  @countdown-prefix-cls: ~'@{namespace}-countdown-input';
-  @dark-bg: #293146;
-
-  html[data-theme='dark'] {
-    .@{prefix-cls} {
-      background-color: @dark-bg;
+@prefix-cls: ~'@{namespace}-login';
+@logo-prefix-cls: ~'@{namespace}-app-logo';
+@countdown-prefix-cls: ~'@{namespace}-countdown-input';
+@dark-bg: #293146;
 
-      &::before {
-        // background-image: url(/@/assets/svg/login-bg-dark.svg);
-      }
+html[data-theme='dark'] {
+  .@{prefix-cls} {
+    background-color: @dark-bg;
 
-      .ant-input,
-      .ant-input-password {
-        background-color: #232a3b;
-      }
+    // &::before {
+    // background-image: url(/@/assets/svg/login-bg-dark.svg);
+    // }
 
-      .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {
-        border: 1px solid #4a5569;
-      }
+    .ant-input,
+    .ant-input-password {
+      background-color: #232a3b;
+    }
 
-      &-form {
-        background: transparent !important;
-      }
+    .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {
+      border: 1px solid #4a5569;
+    }
 
-      .app-iconify {
-        color: #fff;
-      }
+    &-form {
+      background: transparent !important;
     }
 
-    input.fix-auto-fill,
-    .fix-auto-fill input {
-      -webkit-text-fill-color: #c9d1d9 !important;
-      box-shadow: inherit !important;
+    .app-iconify {
+      color: #fff;
     }
   }
 
-  .@{prefix-cls} {
-    min-height: 100%;
-    overflow: hidden;
+  input.fix-auto-fill,
+  .fix-auto-fill input {
+    -webkit-text-fill-color: #c9d1d9 !important;
+    box-shadow: inherit !important;
+  }
+}
 
-    @media (max-width: @screen-xl) {
-      background-color: #293146;
+.@{prefix-cls} {
+  min-height: 100%;
+  overflow: hidden;
+  background: url(/@/assets/images/login/bg.png) no-repeat;
+  background-size: 100% 100%;
 
-      .@{prefix-cls}-form {
-        background-color: #fff;
-      }
+  @media (max-width: @screen-xl) {
+    background-color: #293146;
+
+    .@{prefix-cls}-form {
+      background-color: #fff;
     }
+  }
 
-    &::before {
-      position: absolute;
-      top: 0;
-      left: 0;
-      width: 100%;
-      height: 100%;
-      margin-left: -48%;
-      background-position: 100%;
-      // background-image: url(/@/assets/svg/login-bg.svg);
-      background-repeat: no-repeat;
-      background-size: auto 100%;
-      content: '';
-
-      @media (max-width: @screen-xl) {
-        display: none;
-      }
+  .login-box {
+    background: url(/@/assets/images/login/login-box.png) no-repeat;
+    background-size: 100% 100%;
+  }
+
+  // &::before {
+  //   position: absolute;
+  //   top: 0;
+  //   left: 0;
+  //   width: 100%;
+  //   height: 100%;
+  //   margin-left: -48%;
+  //   background-position: 100%;
+  //   // background-image: url(/@/assets/svg/login-bg.svg);
+  //   background-repeat: no-repeat;
+  //   background-size: auto 100%;
+  //   content: '';
+
+  //   @media (max-width: @screen-xl) {
+  //     display: none;
+  //   }
+  // }
+
+  .@{logo-prefix-cls} {
+    position: absolute;
+    top: 12px;
+    height: 30px;
+
+    &__title {
+      font-size: 16px;
+      color: #fff;
     }
 
+    img {
+      width: 32px;
+    }
+  }
+
+  .container {
     .@{logo-prefix-cls} {
-      position: absolute;
-      top: 12px;
-      height: 30px;
+      display: flex;
+      width: 60%;
+      height: 80px;
 
       &__title {
-        font-size: 16px;
+        font-size: 24px;
         color: #fff;
       }
 
       img {
-        width: 32px;
+        width: 48px;
       }
     }
+  }
 
-    .container {
-      .@{logo-prefix-cls} {
-        display: flex;
-        width: 60%;
-        height: 80px;
-
-        &__title {
-          font-size: 24px;
-          color: #fff;
-        }
+  &-sign-in-way {
+    .anticon {
+      font-size: 22px;
+      color: #888;
+      cursor: pointer;
 
-        img {
-          width: 48px;
-        }
+      &:hover {
+        color: @primary-color;
       }
     }
+  }
 
-    &-sign-in-way {
-      .anticon {
-        font-size: 22px;
-        color: #888;
-        cursor: pointer;
+  input:not([type='checkbox']) {
+    // min-width: 360px;
 
-        &:hover {
-          color: @primary-color;
-        }
-      }
+    @media (max-width: @screen-xl) {
+      min-width: 320px;
     }
 
-    input:not([type='checkbox']) {
-      min-width: 360px;
-
-      @media (max-width: @screen-xl) {
-        min-width: 320px;
-      }
-
-      @media (max-width: @screen-lg) {
-        min-width: 260px;
-      }
-
-      @media (max-width: @screen-md) {
-        min-width: 240px;
-      }
-
-      @media (max-width: @screen-sm) {
-        min-width: 160px;
-      }
+    @media (max-width: @screen-lg) {
+      min-width: 260px;
     }
 
-    .@{countdown-prefix-cls} input {
-      min-width: unset;
+    @media (max-width: @screen-md) {
+      min-width: 240px;
     }
 
-    .ant-divider-inner-text {
-      font-size: 12px;
-      color: @text-color-secondary;
+    @media (max-width: @screen-sm) {
+      min-width: 160px;
     }
   }
+
+  .@{countdown-prefix-cls} input {
+    min-width: unset;
+  }
+
+  .ant-divider-inner-text {
+    font-size: 12px;
+    color: @text-color-secondary;
+  }
+}
 </style>

+ 78 - 35
src/views/sys/login/LoginForm.vue

@@ -1,49 +1,63 @@
 <template>
-  <LoginFormTitle v-show="getShow" class="enter-x" />
+  <!-- <LoginFormTitle v-show="getShow" class="enter-x" /> -->
+  <div class="login-form-title">欢迎登录</div>
   <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef" v-show="getShow"
-    @keypress.enter="handleLogin">
+    @keypress.enter="handleLogin" style="position: relative;height: calc(100% - 80px);">
     <FormItem name="account" class="enter-x">
-      <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" class="fix-auto-fill" />
+      <!-- <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" class="fix-auto-fill" /> -->
+      <a-input placeholder="用户名" v-model:value="formData.account">
+        <template #prefix>
+          <img :src="userPng" alt="">
+        </template>
+      </a-input>
     </FormItem>
     <FormItem name="password" class="enter-x">
-      <InputPassword size="large" visibilityToggle v-model:value="formData.password"
-        :placeholder="t('sys.login.password')" />
+      <!-- <InputPassword size="large" visibilityToggle v-model:value="formData.password"
+        :placeholder="t('sys.login.password')" /> -->
+      <a-input-password v-model:value="formData.password" placeholder="密码">
+        <template #prefix>
+          <!-- <LockOutlined /> -->
+          <img :src="passPng" alt="">
+        </template>
+      </a-input-password>
     </FormItem>
 
-    <ARow class="enter-x">
-      <ACol :span="12">
-        <FormItem>
-          <Checkbox v-model:checked="rememberMe" size="small">
-            {{ t('sys.login.rememberMe') }}
-          </Checkbox>
-        </FormItem>
-      </ACol>
-      <ACol :span="12">
-        <FormItem style="text-align: right">
-          <Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)">
-            {{ t('sys.login.forgetPassword') }}
-          </Button>
-        </FormItem>
-      </ACol>
-    </ARow>
+    <!-- <ARow class="enter-x"> -->
+    <!-- <ACol :span="12"> -->
+    <!-- <FormItem> -->
+    <!-- <Checkbox v-model:checked="rememberMe" size="small"> -->
+    <!-- {{ t('sys.login.rememberMe') }} -->
+    <!-- </Checkbox> -->
+    <!-- </FormItem> -->
+    <!-- </ACol> -->
+    <!-- <ACol :span="12"> -->
+    <!-- <FormItem style="text-align: right"> -->
+    <!-- <Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)"> -->
+    <!-- {{ t('sys.login.forgetPassword') }} -->
+    <!-- </Button> -->
+    <!-- </FormItem> -->
+    <!-- </ACol> -->
+    <!-- </ARow> -->
 
-    <FormItem class="enter-x">
-      <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
+    <FormItem class="enter-x" style="position:absolute;bottom: 0;width: 100%;margin-bottom: 0;">
+      <Button type="primary" size="large" block @click="handleLogin" :loading="loading" style="background: linear-gradient(90deg, #0E7FFF, #04CAF5);
+box-shadow: 0px 12px 8px 0px rgba(3,30,55,0.2);
+border-radius: 2px;">
         {{ t('sys.login.loginButton') }}
       </Button>
     </FormItem>
-    <ARow class="enter-x flex justify-between">
-      <ACol :md="11" :xs="24">
-        <Button block @click="setLoginState(LoginStateEnum.LOGIN)">
-          {{ t('sys.login.userNameInFormTitle') }}
-        </Button>
-      </ACol>
-      <ACol :md="11" :xs="24">
-        <Button block @click="setLoginState(LoginStateEnum.MOBILE)">
-          {{ t('sys.login.mobileSignInFormTitle') }}
-        </Button>
-      </ACol>
-    </ARow>
+    <!-- <ARow class="enter-x flex justify-between"> -->
+    <!-- <ACol :md="11" :xs="24"> -->
+    <!-- <Button block @click="setLoginState(LoginStateEnum.LOGIN)"> -->
+    <!-- {{ t('sys.login.userNameInFormTitle') }} -->
+    <!-- </Button> -->
+    <!-- </ACol> -->
+    <!-- <ACol :md="11" :xs="24"> -->
+    <!-- <Button block @click="setLoginState(LoginStateEnum.MOBILE)"> -->
+    <!-- {{ t('sys.login.mobileSignInFormTitle') }} -->
+    <!-- </Button> -->
+    <!-- </ACol> -->
+    <!-- </ARow> -->
   </Form>
 </template>
 <script lang="ts" setup>
@@ -59,6 +73,9 @@ import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './use
 import { useDesign } from '/@/hooks/web/useDesign';
 import { getPlatForm } from '/@/api/oem';
 import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
+import { UserOutlined, LockOutlined } from '@ant-design/icons-vue';
+import userPng from '/@/assets/images/login/user-icon.png';
+import passPng from '/@/assets/images/login/password-icon.png';
 
 const ACol = Col;
 const ARow = Row;
@@ -142,3 +159,29 @@ async function handleLogin() {
   loading.value = false;
 }
 </script>
+<style lang="less" scoped>
+.login-form-title {
+  font-size: 24px;
+  font-family: Source Han Sans CN;
+  font-weight: bold;
+  color: #FFFFFF;
+  line-height: 80px;
+  background: linear-gradient(0deg, #FFEEA1 0%, #FFFFFF 100%);
+  background-clip: text;
+  -webkit-text-fill-color: transparent;
+  text-align: center;
+}
+.enter-x{
+  ::v-deep .ant-input-affix-wrapper{
+    background: #164062;
+    box-shadow: inset 0px 0px 10px 0px #16C0FF;
+    border: 1px solid #798e9f;
+    input{
+      padding-left: 10px;
+      background: transparent;
+      color: #FFFFFF;
+      font-size: 16px;
+    }
+  }
+}
+</style>

+ 228 - 99
src/views/systemAdmin/system/tag/index.vue

@@ -1,50 +1,73 @@
 <template>
     <div class="p-4">
-        <div class="tag-header">
-            <div class="tag-title">标签管理</div>
-            <div class="handle-btns">
-                <span class="label">查询类型:</span>
-                <a-select v-model:value="searchType" style="width: 120px">
-                    <a-select-option value="name">标签名称</a-select-option>
-                    <a-select-option value="code">标签编码</a-select-option>
-                    <a-select-option value="type">标签类型</a-select-option>
-                    <a-select-option value="time">创建时间</a-select-option>
-                </a-select>
-                <a-input v-model:value="searchValue" placeholder="输入关键字查询" allow-clear />
-                <a-button class="btn" type="primary" @click="searchTable">查询</a-button>
+        <div class="tagType-box">
+            <div class="tag-header">
+                <div class="tag-title">标签类型管理</div>
+            </div>
+            <div class="tag-body">
+                <div class="body-header">
+                    <div class="item-title">标签类型列表</div>
+                    <div class="table-btns">
+                        <a-button class="btn" type="primary" @click="openDialog('add', {})">新增</a-button>
+                    </div>
+                </div>
+                <div class="body-content">
+                    <a-table :columns="columns" :data-source="tableData" :bordered="true" @change="tableChange">
+                        <template #operation="{ record }">
+                            <a-tooltip title="编辑" color="yellow">
+                                <a @click="openDialog('edit', record)">
+                                    <EditOutlined />
+                                </a>
+                            </a-tooltip>
+                        </template>
+                    </a-table>
+                </div>
             </div>
         </div>
-        <div class="tag-body">
-            <div class="body-header">
-                <div class="item-title">标签列表</div>
-                <div class="table-btns">
-                    <a-button class="btn" type="primary" @click="getTagsData" title="刷新">
-                        <RedoOutlined />
-                    </a-button>
-                    <a-button class="btn" type="primary" @click="openDialog('add', {})">新增标签</a-button>
-                    <a-popconfirm :title="delAllBtnTitle" @confirm="delAllData">
-                        <a-button class="btn" :disabled="!hasSelected">批量删除</a-button>
-                    </a-popconfirm>
+        <div class="tag-box">
+            <div class="tag-header">
+                <div class="tag-title">标签管理</div>
+                <div class="handle-btns">
+                    <span class="label">查询类型:</span>
+                    <a-select v-model:value="searchType" style="width: 120px">
+                        <a-select-option value="name">标签名称</a-select-option>
+                        <a-select-option value="code">标签编码</a-select-option>
+                        <a-select-option value="type">标签类型</a-select-option>
+                        <a-select-option value="time">创建时间</a-select-option>
+                    </a-select>
+                    <a-input v-model:value="searchValue" placeholder="输入关键字查询" allow-clear />
+                    <a-button class="btn" type="primary" @click="searchTable">查询</a-button>
                 </div>
             </div>
-            <div class="body-content">
-                <a-table :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :columns="columns"
-                    :data-source="tableData" :bordered="true" @change="tableChange">
-                    <template #operation="{ record }">
-                        <a-tooltip title="编辑" color="yellow">
-                            <a @click="openDialog('edit', record)">
-                                <EditOutlined />
-                            </a>
-                        </a-tooltip>
-                        <a-popconfirm v-if="tableData.length" title="确定删除该标签?" @confirm="onDelete(record.id)">
+            <div class="tag-body">
+                <div class="body-header">
+                    <div class="item-title">标签列表</div>
+                    <div class="table-btns">
+                        <!-- <a-button class="btn" type="primary" @click="getTagsData" title="刷新">
+                            <RedoOutlined />
+                        </a-button> -->
+                        <a-button class="btn" type="primary" @click="openDialog('add', {})">新增</a-button>
+                        <!-- <a-popconfirm :title="delAllBtnTitle" @confirm="delAllData">
+                            <a-button class="btn" :disabled="!hasSelected">批量删除</a-button>
+                        </a-popconfirm> -->
+                    </div>
+                </div>
+                <div class="body-content">
+                    <a-table :columns="columns" :data-source="tableData" :bordered="true" @change="tableChange">
+                        <template #operation="{ record }">
+                            <a-tooltip title="编辑" color="yellow">
+                                <a @click="openDialog('edit', record)">
+                                    <EditOutlined />
+                                </a>
+                            </a-tooltip>
                             <a-tooltip title="删除" color="red">
-                                <a>
+                                <a @click="onDelete(record.id)">
                                     <DeleteOutlined />
                                 </a>
                             </a-tooltip>
-                        </a-popconfirm>
-                    </template>
-                </a-table>
+                        </template>
+                    </a-table>
+                </div>
             </div>
         </div>
         <TagDrawer v-if="ifShowDialog" @closeDialog="ifShowDialog = false" :formData="formData" :drawerTitle="drawerTitle"
@@ -54,17 +77,17 @@
 </template>
 
 <script>
-import { defineComponent, reactive, ref, toRefs, computed, onMounted, watch } from 'vue';
+import { defineComponent, reactive, ref, toRefs, computed, onMounted, watch, createVNode } from 'vue';
 import TagDrawer from './TagDrawer.vue';
 import { getAllTags, deleteTag } from '/@/api/sys/tag';
-import { message } from 'ant-design-vue';
-import { EditOutlined, DeleteOutlined, RedoOutlined } from '@ant-design/icons-vue';
+import { message, Modal } from 'ant-design-vue';
+import { EditOutlined, DeleteOutlined, RedoOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue';
 import moment from 'moment'
 import { session } from '/@/utils/Memory';
 
 export default defineComponent({
     name: 'tag',
-    components: { TagDrawer, EditOutlined, DeleteOutlined, RedoOutlined },
+    components: { TagDrawer, EditOutlined, DeleteOutlined, RedoOutlined, ExclamationCircleOutlined },
     setup() {
         const drawerRef = ref(null)
         onMounted(() => {
@@ -126,7 +149,7 @@ export default defineComponent({
                     onFilter: (value, record) => record.name.includes(value),
                     sorter: (a, b) => a.name.length - b.name.length,
                     sortOrder: sorted.columnKey === 'name' && sorted.order,
-                    width: "500px"
+                    // width: "500px"
                 },
                 {
                     title: '标签编码',
@@ -136,7 +159,7 @@ export default defineComponent({
                     onFilter: (value, record) => record.code.includes(value),
                     sorter: (a, b) => a.code.length - b.code.length,
                     sortOrder: sorted.columnKey === 'code' && sorted.order,
-                    width: "400px"
+                    // width: "400px"
                 },
                 {
                     title: '标签类型',
@@ -146,7 +169,7 @@ export default defineComponent({
                     onFilter: (value, record) => record.type.includes(value),
                     sorter: (a, b) => a.type.length - b.type.length,
                     sortOrder: sorted.columnKey === 'type' && sorted.order,
-                    width: "230px"
+                    // width: "230px"
                 },
                 {
                     title: '启用状态',
@@ -154,7 +177,7 @@ export default defineComponent({
                     key: 'state',
                     filteredValue: filtered.state || null,
                     onFilter: (value, record) => record.state.includes(value),
-                    width: "100px"
+                    // width: "100px"
                 },
                 {
                     title: '创建时间',
@@ -164,7 +187,7 @@ export default defineComponent({
                     onFilter: (value, record) => record.time.includes(value),
                     sorter: (a, b) => a.time.length - b.time.length,
                     sortOrder: sorted.columnKey === 'time' && sorted.order,
-                    width: "230px"
+                    // width: "230px"
                 },
                 {
                     title: '操作',
@@ -233,15 +256,26 @@ export default defineComponent({
         }
         //删除单个数据
         const onDelete = (id) => {
-            let param = {
-                1: session.getItem('tokenV2'),
-                2: JSON.stringify({}),
-                3: JSON.stringify([id])
-            }
-            deleteTag(param).then(res => {
-                message.success('操作成功');
-                getTagsData();
-            })
+            Modal.confirm({
+                title: '删除提示',
+                icon: createVNode(ExclamationCircleOutlined),
+                content: '确定删除改标签?',
+                centered: true,
+                okText: '确定',
+                okType: 'danger',
+                cancelText: '取消',
+                onOk: (() => {
+                    let param = {
+                        1: session.getItem('tokenV2'),
+                        2: JSON.stringify({}),
+                        3: JSON.stringify([id])
+                    }
+                    deleteTag(param).then(res => {
+                        message.success('操作成功');
+                        getTagsData();
+                    })
+                })
+            });
         }
         //弹窗确认
         const onSubmit = (e) => {
@@ -274,78 +308,173 @@ export default defineComponent({
 
 <style lang="less" scoped>
 .p-4 {
+    width: 100%;
     height: 100%;
+    display: flex;
+    justify-content: space-between;
 
-    .tag-header {
-        padding: 10px;
-        width: 100%;
-        height: 70px;
-        background-color: #fff;
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-
-        .tag-title {
-            font-size: 16px;
-            font-weight: 500;
-            margin-left: 20px;
-            user-select: none;
-        }
+    .tag-box {
+        width: 50%;
+        // margin-right: 20px;
+        height: 100%;
 
-        .handle-btns {
-            margin-right: 20px;
+        .tag-header {
+            padding: 10px;
+            width: 100%;
+            height: 70px;
+            background-color: #fff;
             display: flex;
+            justify-content: space-between;
             align-items: center;
 
-            .label {
-                width: 150px;
+            .tag-title {
+                font-size: 16px;
+                font-weight: 500;
+                margin-left: 20px;
+                user-select: none;
             }
 
-            .btn {
-                margin-left: 10px;
+            .handle-btns {
+                margin-right: 20px;
+                display: flex;
+                align-items: center;
+
+                .label {
+                    width: 150px;
+                }
+
+                .btn {
+                    margin-left: 10px;
+                }
+            }
+        }
+
+        .tag-body {
+            padding: 0 30px;
+            margin-top: 20px;
+            width: 100%;
+            // height: 800px;
+            height: calc(100% - 90px);
+
+            background-color: #fff;
+
+
+            .body-header {
+                display: flex;
+                height: 80px;
+                width: 100%;
+                // justify-content: space-between;
+                align-items: center;
+
+                .item-title {
+                    height: 40px;
+                    line-height: 40px;
+                    font-size: 16px;
+                    user-select: none;
+                    margin-right: 20px;
+                }
+
+                .table-btns {
+                    .btn {
+                        margin-right: 10px;
+
+                        &:last-child {
+                            margin-right: 0;
+                        }
+                    }
+                }
+            }
+
+            .body-content {
+                padding-bottom: 20px;
+                min-height: 713px;
+                max-height: 830px;
+                overflow: auto;
+                height: calc(100% - 80px);
+
+                a {
+                    margin-right: 10px;
+                }
             }
         }
     }
 
-    .tag-body {
-        padding: 0 30px;
-        margin-top: 20px;
-        width: 100%;
-        // height: 800px;
-        height: calc(100% - 90px);
-        background-color: #fff;
+    .tagType-box {
+        width: calc(50% - 20px);
+        margin-right: 20px;
 
-        .body-header {
-            display: flex;
-            height: 80px;
+        .tag-header {
+            padding: 10px;
             width: 100%;
+            height: 70px;
+            background-color: #fff;
+            display: flex;
             justify-content: space-between;
             align-items: center;
 
-            .item-title {
-                height: 40px;
-                line-height: 40px;
+            .tag-title {
                 font-size: 16px;
+                font-weight: 500;
+                margin-left: 20px;
                 user-select: none;
             }
 
-            .table-btns {
+            .handle-btns {
+                margin-right: 20px;
+                display: flex;
+                align-items: center;
+
+                .label {
+                    width: 150px;
+                }
+
                 .btn {
-                    margin-right: 10px;
+                    margin-left: 10px;
+                }
+            }
+        }
+
+        .tag-body {
+            padding: 0 30px;
+            margin-top: 20px;
+            width: 100%;
+            // height: 800px;
+            height: calc(100% - 90px);
+            background-color: #fff;
+
+            .body-header {
+                display: flex;
+                height: 80px;
+                width: 100%;
+                // justify-content: space-between;
+                align-items: center;
+
+                .item-title {
+                    margin-right: 20px;
+                    height: 40px;
+                    line-height: 40px;
+                    font-size: 16px;
+                    user-select: none;
+                }
 
-                    &:last-child {
-                        margin-right: 0;
+                .table-btns {
+                    .btn {
+                        margin-right: 10px;
+
+                        &:last-child {
+                            margin-right: 0;
+                        }
                     }
                 }
             }
-        }
 
-        .body-content {
-            padding-bottom: 20px;
-            height: calc(100% - 80px);
+            .body-content {
+                padding-bottom: 20px;
+                height: calc(100% - 80px);
 
-            a {
-                margin-right: 10px;
+                a {
+                    margin-right: 10px;
+                }
             }
         }
     }