Procházet zdrojové kódy

应用中心copy页

11wqe1 před 1 měsícem
rodič
revize
0fcd3c626a

+ 4 - 0
src/assets/images/appStoreCopy/appde.svg

@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5 2.5C5 2.22386 5.22386 2 5.5 2H13.5C13.7761 2 14 2.22386 14 2.5V4.5C14 4.77614 13.7761 5 13.5 5H5.5C5.22386 5 5 4.77614 5 4.5V4H3V7H5.5C5.77614 7 6 7.22386 6 7.5C6 7.77614 5.77614 8 5.5 8H2.5C2.22386 8 2 7.77614 2 7.5V3.5C2 3.22386 2.22386 3 2.5 3H5V2.5ZM6 4H13V3H6V4ZM10 8.5C10 8.22386 10.2239 8 10.5 8H13.5C13.7761 8 14 8.22386 14 8.5V12.5C14 12.7761 13.7761 13 13.5 13H11V13.5C11 13.7761 10.7761 14 10.5 14H4.5C4.22386 14 4 13.7761 4 13.5V11.5C4 11.2239 4.22386 11 4.5 11H10.5C10.7761 11 11 11.2239 11 11.5V12H13V9H10.5C10.2239 9 10 8.77614 10 8.5ZM10 12H5V13H10V12Z" fill="#969BA3"/>
+<path d="M6.77637 6.05283C6.94564 5.96819 7.14833 5.98628 7.2998 6.0997L9.2998 7.5997C9.42571 7.69413 9.5 7.84272 9.5 8.00009C9.5 8.15747 9.42571 8.30606 9.2998 8.40048L7.2998 9.90048C7.14833 10.0139 6.94564 10.032 6.77637 9.94736C6.60698 9.86266 6.5 9.68948 6.5 9.50009V6.50009C6.5 6.31071 6.60698 6.13752 6.77637 6.05283Z" fill="#0354D7"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/arrowL.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16.9498 7.05025H7.05033M7.05033 7.05025V16.9497M7.05033 7.05025L16.9498 16.9497" stroke="#969BA3" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/backPage.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.34299 12L16.414 19.071L15 20.485L7.22199 12.707C7.03451 12.5195 6.9292 12.2652 6.9292 12C6.9292 11.7348 7.03451 11.4805 7.22199 11.293L15 3.515L16.414 4.929L9.34299 12Z" fill="black"/>
+</svg>

binární
src/assets/images/appStoreCopy/cocoloading.gif


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 7 - 0
src/assets/images/appStoreCopy/comp.svg


+ 4 - 0
src/assets/images/appStoreCopy/copyIco.svg

@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.7188 4H5.78125C4.79749 4 4 4.79749 4 5.78125V12.7188C4 13.7025 4.79749 14.5 5.78125 14.5H12.7188C13.7025 14.5 14.5 13.7025 14.5 12.7188V5.78125C14.5 4.79749 13.7025 4 12.7188 4Z" stroke="white" stroke-linejoin="round"/>
+<path d="M11.9844 4L12 3.25C11.9987 2.78628 11.8139 2.34192 11.486 2.01402C11.1581 1.68612 10.7137 1.50132 10.25 1.5H3.5C2.97005 1.50157 2.46225 1.71278 2.08752 2.08752C1.71278 2.46225 1.50157 2.97005 1.5 3.5V10.25C1.50132 10.7137 1.68612 11.1581 2.01402 11.486C2.34192 11.8139 2.78628 11.9987 3.25 12H4" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 4 - 0
src/assets/images/appStoreCopy/logOut.svg

@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="12" fill="#F06643" fill-opacity="0.2"/>
+<path d="M15.0401 7.62667L14.0734 8.59333C14.6608 8.9471 15.1469 9.44662 15.4844 10.0435C15.822 10.6403 15.9996 11.3143 16.0001 12C16.0001 13.0609 15.5787 14.0783 14.8285 14.8284C14.0784 15.5786 13.0609 16 12.0001 16C10.9392 16 9.9218 15.5786 9.17166 14.8284C8.42151 14.0783 8.00008 13.0609 8.00008 12C8.00008 10.5533 8.77342 9.29333 9.92008 8.58667L8.96008 7.62667C8.25197 8.11515 7.67324 8.76846 7.27372 9.53032C6.87421 10.2922 6.66591 11.1397 6.66675 12C6.66675 13.4145 7.22865 14.771 8.22885 15.7712C9.22904 16.7714 10.5856 17.3333 12.0001 17.3333C13.4146 17.3333 14.7711 16.7714 15.7713 15.7712C16.7715 14.771 17.3334 13.4145 17.3334 12C17.3334 10.1867 16.4267 8.58667 15.0401 7.62667ZM12.6668 6H11.3334V12.6667H12.6668" fill="#F06643"/>
+</svg>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 6 - 0
src/assets/images/appStoreCopy/popimg.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 2 - 0
src/assets/images/appStoreCopy/sch.svg


+ 3 - 0
src/assets/images/appStoreCopy/serImg.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5 2C9.1446 2.00012 7.80887 2.32436 6.60427 2.94569C5.39966 3.56702 4.3611 4.46742 3.57525 5.57175C2.78939 6.67609 2.27902 7.95235 2.08672 9.29404C1.89442 10.6357 2.02576 12.004 2.46979 13.2846C2.91382 14.5652 3.65766 15.7211 4.63925 16.6557C5.62084 17.5904 6.81171 18.2768 8.11252 18.6576C9.41333 19.0384 10.7864 19.1026 12.117 18.8449C13.4477 18.5872 14.6975 18.015 15.762 17.176L19.414 20.828C19.6026 21.0102 19.8552 21.111 20.1174 21.1087C20.3796 21.1064 20.6304 21.0012 20.8158 20.8158C21.0012 20.6304 21.1064 20.3796 21.1087 20.1174C21.111 19.8552 21.0102 19.6026 20.828 19.414L17.176 15.762C18.164 14.5086 18.7792 13.0024 18.9511 11.4157C19.123 9.82905 18.8448 8.22602 18.1482 6.79009C17.4517 5.35417 16.3649 4.14336 15.0123 3.29623C13.6597 2.44911 12.096 1.99989 10.5 2ZM4.00001 10.5C4.00001 8.77609 4.68483 7.12279 5.90382 5.90381C7.1228 4.68482 8.7761 4 10.5 4C12.2239 4 13.8772 4.68482 15.0962 5.90381C16.3152 7.12279 17 8.77609 17 10.5C17 12.2239 16.3152 13.8772 15.0962 15.0962C13.8772 16.3152 12.2239 17 10.5 17C8.7761 17 7.1228 16.3152 5.90382 15.0962C4.68483 13.8772 4.00001 12.2239 4.00001 10.5Z" fill="#969BA3"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/star.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.99976 2.88333C8.01285 2.88333 8.02833 2.88503 8.04663 2.89017L8.11011 2.91751C8.11691 2.92139 8.12408 2.92638 8.13159 2.93509L8.15503 2.9761L8.15601 2.97708L9.40601 5.94388L9.52319 6.2222L9.823 6.24857L13.0378 6.52982C13.0781 6.53613 13.1037 6.54407 13.1189 6.55032L13.1375 6.56009C13.147 6.56852 13.1576 6.57906 13.1677 6.59427L13.197 6.65384C13.2031 6.67049 13.2067 6.68652 13.2078 6.70267L13.2029 6.75345C13.2007 6.76365 13.1933 6.78732 13.1492 6.82669L10.7068 8.93802L10.4783 9.13626L10.5466 9.43021L11.2791 12.5777V12.5786C11.2849 12.6041 11.2858 12.6206 11.2849 12.6304L11.282 12.6441C11.2706 12.668 11.2575 12.6884 11.2429 12.7066L11.1941 12.7544C11.1746 12.7695 11.1506 12.7819 11.1072 12.7857C11.1002 12.7863 11.0918 12.7855 11.0808 12.7827L11.0359 12.7622L11.0242 12.7554L8.25757 11.0884L7.99976 10.9331L7.74194 11.0884L4.97534 12.7544L4.9646 12.7613C4.92652 12.7855 4.90659 12.786 4.89136 12.7847L4.84058 12.774L4.80737 12.7554C4.76993 12.7263 4.74023 12.6907 4.71753 12.6431C4.71622 12.6403 4.71513 12.6372 4.7146 12.6314C4.71399 12.6243 4.7141 12.6076 4.72046 12.5796L5.45386 9.43021L5.52222 9.13626L5.2937 8.93802L2.84937 6.82669C2.82826 6.80745 2.81571 6.79199 2.80835 6.77982L2.79761 6.75247C2.79358 6.73368 2.79161 6.71691 2.79272 6.70071L2.80347 6.65286C2.81245 6.62807 2.8227 6.60929 2.83276 6.59427L2.86304 6.55911C2.86785 6.55574 2.89436 6.54025 2.9646 6.52982L6.17651 6.24857L6.47729 6.2222L6.59448 5.94388L7.84448 2.97708V2.9761C7.85255 2.95675 7.86053 2.94371 7.86792 2.93509L7.8894 2.91751C7.93881 2.88933 7.97377 2.88337 7.99976 2.88333Z" stroke="#969BA3"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/star1.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.99998 11.5167L5.23331 13.1833C5.11109 13.2611 4.98331 13.2944 4.84998 13.2833C4.71664 13.2722 4.59998 13.2278 4.49998 13.15C4.39998 13.0722 4.3222 12.9751 4.26664 12.8587C4.21109 12.7422 4.19998 12.6116 4.23331 12.4667L4.96664 9.31666L2.51664 7.2C2.40553 7.1 2.3362 6.986 2.30864 6.858C2.28109 6.73 2.28931 6.60511 2.33331 6.48333C2.37731 6.36155 2.44398 6.26155 2.53331 6.18333C2.62264 6.10511 2.74486 6.05511 2.89998 6.03333L6.13331 5.75L7.38331 2.78333C7.43886 2.65 7.52509 2.55 7.64198 2.48333C7.75886 2.41666 7.8782 2.38333 7.99998 2.38333C8.12175 2.38333 8.24109 2.41666 8.35798 2.48333C8.47486 2.55 8.56109 2.65 8.61664 2.78333L9.86664 5.75L13.1 6.03333C13.2555 6.05555 13.3778 6.10555 13.4666 6.18333C13.5555 6.26111 13.6222 6.36111 13.6666 6.48333C13.7111 6.60555 13.7195 6.73066 13.692 6.85866C13.6644 6.98666 13.5949 7.10044 13.4833 7.2L11.0333 9.31666L11.7666 12.4667C11.8 12.6111 11.7889 12.7418 11.7333 12.8587C11.6778 12.9756 11.6 13.0727 11.5 13.15C11.4 13.2273 11.2833 13.2718 11.15 13.2833C11.0166 13.2949 10.8889 13.2616 10.7666 13.1833L7.99998 11.5167Z" fill="#FFCB01"/>
+</svg>

+ 5 - 0
src/assets/images/appStoreCopy/tel.svg

@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="12" fill="#D9D9D9"/>
+<path d="M15 5C15.2652 5 15.5196 5.10536 15.7071 5.29289C15.8946 5.48043 16 5.73478 16 6V18C16 18.2652 15.8946 18.5196 15.7071 18.7071C15.5196 18.8946 15.2652 19 15 19H9C8.73478 19 8.48043 18.8946 8.29289 18.7071C8.10536 18.5196 8 18.2652 8 18V6C8 5.73478 8.10536 5.48043 8.29289 5.29289C8.48043 5.10536 8.73478 5 9 5H15ZM9 4C8.46957 4 7.96086 4.21071 7.58579 4.58579C7.21071 4.96086 7 5.46957 7 6V18C7 18.5304 7.21071 19.0391 7.58579 19.4142C7.96086 19.7893 8.46957 20 9 20H15C15.5304 20 16.0391 19.7893 16.4142 19.4142C16.7893 19.0391 17 18.5304 17 18V6C17 5.46957 16.7893 4.96086 16.4142 4.58579C16.0391 4.21071 15.5304 4 15 4H9Z" fill="#0663FE"/>
+<path d="M12 18C12.2652 18 12.5196 17.8946 12.7071 17.7071C12.8946 17.5196 13 17.2652 13 17C13 16.7348 12.8946 16.4804 12.7071 16.2929C12.5196 16.1054 12.2652 16 12 16C11.7348 16 11.4804 16.1054 11.2929 16.2929C11.1054 16.4804 11 16.7348 11 17C11 17.2652 11.1054 17.5196 11.2929 17.7071C11.4804 17.8946 11.7348 18 12 18Z" fill="#0663FE"/>
+</svg>

+ 5 - 0
src/assets/images/appStoreCopy/topR.svg

@@ -0,0 +1,5 @@
+<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="3" y="5.78049" width="18" height="2" rx="1" fill="black"/>
+<rect x="3" y="11.7805" width="18" height="2" rx="1" fill="black"/>
+<rect x="3" y="17.7805" width="18" height="2" rx="1" fill="black"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/topl.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5 2C9.1446 2.00012 7.80887 2.32436 6.60427 2.94569C5.39966 3.56702 4.3611 4.46742 3.57525 5.57175C2.78939 6.67609 2.27902 7.95235 2.08672 9.29404C1.89442 10.6357 2.02576 12.004 2.46979 13.2846C2.91382 14.5652 3.65766 15.7211 4.63925 16.6557C5.62084 17.5904 6.81171 18.2768 8.11252 18.6576C9.41333 19.0384 10.7864 19.1026 12.117 18.8449C13.4477 18.5872 14.6975 18.015 15.762 17.176L19.414 20.828C19.6026 21.0102 19.8552 21.111 20.1174 21.1087C20.3796 21.1064 20.6304 21.0012 20.8158 20.8158C21.0012 20.6304 21.1064 20.3796 21.1087 20.1174C21.111 19.8552 21.0102 19.6026 20.828 19.414L17.176 15.762C18.164 14.5086 18.7792 13.0024 18.9511 11.4157C19.123 9.82905 18.8448 8.22602 18.1482 6.79009C17.4517 5.35417 16.3649 4.14336 15.0123 3.29623C13.6597 2.44911 12.096 1.99989 10.5 2ZM4.00001 10.5C4.00001 8.77609 4.68483 7.12279 5.90382 5.90381C7.1228 4.68482 8.7761 4 10.5 4C12.2239 4 13.8772 4.68482 15.0962 5.90381C16.3152 7.12279 17 8.77609 17 10.5C17 12.2239 16.3152 13.8772 15.0962 15.0962C13.8772 16.3152 12.2239 17 10.5 17C8.7761 17 7.1228 16.3152 5.90382 15.0962C4.68483 13.8772 4.00001 12.2239 4.00001 10.5Z" fill="black"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/xin.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.4 4C12.0214 4.00003 13.3335 5.20499 13.3336 6.68652C13.3336 7.62737 12.9492 8.45814 12.3678 9.19629L12.1071 9.50781C11.5639 10.1184 10.8953 10.6621 10.2194 11.1504L9.54553 11.6211L7.99963 12.666L6.45471 11.6211C5.67583 11.0933 4.85258 10.4945 4.17346 9.80762L3.89221 9.50781C3.16797 8.69398 2.66663 7.76188 2.66663 6.68652C2.66671 5.20497 3.97886 4 5.60022 4C6.29654 4.00007 6.9367 4.28728 7.44397 4.70312L7.65393 4.88867L7.99963 5.22168L8.34631 4.88867C8.88086 4.3748 9.60345 4 10.4 4Z" stroke="#969BA3"/>
+</svg>

+ 3 - 0
src/assets/images/appStoreCopy/xin1.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.59996 3.5C3.74663 3.5 2.16663 4.88667 2.16663 6.68667C2.16663 7.92867 2.74796 8.974 3.51863 9.84C4.28729 10.7033 5.27863 11.428 6.17396 12.0347L7.71996 13.0813C7.80264 13.1372 7.90016 13.1671 7.99996 13.1671C8.09976 13.1671 8.19728 13.1372 8.27996 13.0813L9.82596 12.0347C10.722 11.428 11.7126 10.7033 12.4806 9.84C13.252 8.974 13.8333 7.92867 13.8333 6.68667C13.8333 4.88667 12.2533 3.5 10.4 3.5C9.44396 3.5 8.60329 3.948 7.99996 4.528C7.39663 3.948 6.55529 3.5 5.59996 3.5Z" fill="#F06643"/>
+</svg>

+ 2 - 0
src/plugins/vant.js

@@ -30,6 +30,7 @@ import {
   ActionSheet,
   ActionSheet,
   Popover,
   Popover,
 	Picker,
 	Picker,
+  Loading
 
 
 } from 'vant'
 } from 'vant'
 Vue.use(Button)
 Vue.use(Button)
@@ -61,3 +62,4 @@ Vue.use(Button)
   .use(ActionSheet)
   .use(ActionSheet)
   .use(Popover)
   .use(Popover)
 	.use(Picker)
 	.use(Picker)
+  .use(Loading)

+ 21 - 0
src/router/router.config.js

@@ -23,6 +23,27 @@ export const constantRouterMap = [
       keepAlive: false
       keepAlive: false
     }
     }
   },
   },
+  {
+    path: '/searchL',
+    component: () => import('@/views/appStoreCopy/components/searchL'),
+    meta: {
+      title: '搜索页面',
+      keepAlive: false
+    }
+  },
+  {
+    path: '/userInfoPage',
+    component: () => import('@/views/appStoreCopy/components/userInfoPage'),
+    meta: {
+      title: '个人信息页',
+      keepAlive: false
+    }
+  },
+  {
+    path: '/appStoreCopy',
+    component: () => import('@/views/appStoreCopy/index'),
+    meta: {title: '应用管理',keepAlive: false}
+  },
   {
   {
     path: '/',
     path: '/',
     component: () => import('@/views/layouts'),
     component: () => import('@/views/layouts'),

+ 179 - 0
src/views/appStoreCopy/components/appStorePopup.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="popup">
+    <van-popup v-model="show" style="width: 95%;height: calc(100% - 50px);" closeable :zIndex="10">
+			<div class="popupTitle">
+				<span v-if="type==1">添加应用</span>
+				<span v-if="type==2">修改应用</span>
+			</div>
+      <div class="box" v-loading="loading">
+        <el-form :model="form" :rules="rules" ref="ruleForm">
+          <el-form-item label="应用名称" prop="nname">
+            <el-input v-model="form.nname" placeholder="请输入应用名称"></el-input>
+          </el-form-item>
+          <div style="display: flex;width: 100%;justify-content: space-between;">
+            <el-form-item label="应用标签" prop="nlabel">
+              <el-input v-model="form.nlabel" placeholder="请输入应用标签" style="width: 170px"></el-input>
+            </el-form-item>
+            <el-form-item label="应用类型" prop="ntype">
+              <el-select v-model="form.ntype" placeholder="请选择应用类型" style="width: 170px;">
+                <el-option  style="z-index: 2024;" v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+              </el-select>
+            </el-form-item>
+          </div>
+          <el-form-item label="应用链接" prop="nurl">
+            <el-input v-model="form.nurl" placeholder="请输入应用链接"></el-input>
+          </el-form-item>
+          <el-form-item label="应用简介" prop="ndetail">
+            <el-input
+              type="textarea"
+              v-model="form.ndetail"
+              style="width: 100%;"
+              :rows="3"
+              resize="none"
+              placeholder="请输入应用简介"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="权限管理" style="display: flex;flex-direction: column;align-items: flex-start;">
+            <el-radio-group v-model="form.njuri">
+              <el-radio label="1">私有</el-radio>
+              <el-radio label="2">公开组织</el-radio>
+              <el-radio label="3">公开所有人</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+
+				<div class="b_bottom">
+					<el-button size="mini" @click="close()">取消</el-button>
+					<el-button size="mini" type="primary" @click="submitBtn('ruleForm')">确定</el-button>
+				</div>
+      </div>
+    </van-popup>
+  </div>
+</template>
+
+<script>
+let validUrl = (rule, value, callback) => {
+  if (value) {
+    // 验证链接是否有效
+    try {
+      new URL(value)
+      callback()
+    } catch (error) {
+      return callback(new Error('请输入有效的链接'))
+    }
+  }
+}
+
+export default {
+  props: {
+    typeList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      show: false,
+			loading:false,
+			type:1,
+      form: {
+        nname: '',
+        nlabel: '',
+        nurl: '',
+        ntype: '',
+        njuri: '1',
+        nstand: '',
+        njson: ''
+      },
+      rules: {
+        nname: [{ required: true, message: '请输入应用名称', trigger: 'blur' }],
+        nurl: [{ required: true, message: '请输入应用链接', trigger: 'blur' }],
+        nlabel: [{ required: true, message: '请输入应用标签', trigger: 'blur' }],
+        ntype: [{ required: true, message: '请选择应用类型', trigger: 'blur' }],
+        // ndetail:[{required:true,message:"请输入应用简介",trigger:"blur"}],
+        njuri: [{ required: true, message: '请选择权限管理', trigger: 'blur' }],
+        nurl: [
+          { required: true, message: '请输入应用链接', trigger: 'blur' },
+          { validator: validUrl, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    open(data) {
+      if (data && data.type === 2) {
+        this.form = data.form
+        this.type = data.type
+      } else {
+        this.form = {
+          nname: '',
+          nlabel: '',
+          ndetail: '',
+          nurl: '',
+          ntype: '',
+          njuri: '1',
+          nstand: 'cn',
+          njson: ''
+        }
+      }
+      this.loading = false
+      this.show = true
+    },
+    close(flag = false) {
+      if (this.loading && !flag) return this.$message.info('请稍等...')
+      this.show = false
+      this.init()
+    },
+    init() {
+      this.form = {
+        nname: '',
+        nlabel: '',
+        ndetail: '',
+        nurl: '',
+        ntype: '',
+        njuri: '1',
+        nstand: 'cn',
+        njson: ''
+      }
+      this.loading = false
+    },
+    submitBtn(ref) {
+      if (this.loading) return this.$message.info('请稍等...')
+      this.$refs[ref].validate(valid => {
+        if (valid) {
+          this.loading = true
+          this.$emit('success', this.form, this.type)
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  height: 100%;
+  padding: 40px 20px 20px 20px;
+  overflow: auto;
+	box-sizing: border-box
+}
+
+.popupTitle{
+	font-size: 18px;
+	font-weight: bold;
+	position: absolute;
+	top: 10px;
+	left:20px;
+}
+
+.b_bottom{
+	position: absolute;
+	right: 20px;
+	bottom:20px;
+}
+
+:deep(.el-select-dropdown){
+	z-index: 2003 !important;
+}
+</style>

+ 142 - 0
src/views/appStoreCopy/components/searchL.vue

@@ -0,0 +1,142 @@
+<template>
+    <div class="sera">
+        <div class="seraTop">
+            <img @click="backPage" src="../../../assets/images/appStoreCopy/backPage.svg" alt="">
+            <van-search left-icon="" @change="getData" style="flex: 1;" shape="round" v-model="seraval" placeholder="请输入搜索关键词" />
+            <img @click="getData" src="../../../assets/images/appStoreCopy/serImg.svg" alt="">
+        </div>
+        <!-- <div v-if="isShow" 
+            class="zzcl"
+          >
+              加载中...
+        </div> -->
+        
+            <div class="serCon" v-if="seraval">
+                <div>{{ seraval }}</div>
+                <div class="serConL">
+                    <div>共{{ dataList.length }}条数据</div>
+                    <img src="../../../assets/images/appStoreCopy/arrowL.svg" alt="">
+                </div>
+            </div>
+            <template v-if="dataList.length">
+                <div @click="openUrl(i.url)" class="serCon" v-for="(i,ind) in dataList" :key="ind">
+                    <div>{{ i.name }}</div>
+                    <div class="serConL">
+                        <img src="../../../assets/images/appStoreCopy/arrowL.svg" alt="">
+                    </div>
+                </div>
+            </template>
+        
+        
+        
+    </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import {  getStore } from '@/api/appStore'
+    export default {
+        data(){
+            return{
+                seraval:'',
+                dataList:[],
+                isShow:false
+            }
+        },
+        computed: {
+            ...mapGetters(['userinfo']),
+        },
+        watch:{
+            seraval(){
+                if (this.seraval.trim() == '') this.dataList = []
+            }
+        },
+        methods:{
+            backPage(){
+                this.$router.push('/appStoreCopy')
+            },
+            openUrl(url) {
+                window.open(url, '_blank')
+            },
+            // 查询应用数据
+            getData() {
+                if (this.seraval.trim() == '') return
+                this.isShow = true
+                let params = {
+                    uid: this.userinfo.userid,
+                    name: this.seraval,
+                    label: '',
+                    type: '',
+                    juri: 3,
+                    stand: 'cn'
+                }
+
+                getStore(params)
+                    .then(res => {
+                        let _data = res[0]
+                        if (_data.length > 0) {
+                            _data.forEach(i => {
+                            if (i.json) {
+                                i.json = JSON.parse(i.json)
+                            }
+                            })
+
+                            this.dataList = _data
+                        } else {
+                            this.dataList = []
+                        }
+                        this.isShow = false
+                    })
+                    .catch(err => {
+                        this.isShow = false
+                        this.$toast.error('查询应用数据失败')
+                    })
+            },
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+.sera{
+    width: 100vw;
+    height: 100vh;
+    background: #fff;
+    position: relative;
+}
+.seraTop{
+    width: 100%;
+    padding: 10px 15px 0;
+    box-sizing: border-box;
+    display: flex;
+    border-bottom: 0.5px solid #D9D9D9;
+    img{
+        width: 23px;
+    }
+}
+.zzcl{
+      position: absolute;
+      left: 0%;top: 0%;
+      background: #fff;
+      width: 100%;height: 100%;opacity: .6;
+      display: flex;justify-content: center;line-height: 350px;
+      font-size: 16px;
+      color: #000;
+}
+.serCon{
+    display: flex;
+    padding: 10px 18px;
+    align-items: center;
+    justify-content: space-between;
+    font-family: PingFang HK;
+    font-weight: 300;
+    font-size: 13px;
+    line-height: 20px;
+    color: #969BA3;
+    border-bottom: 0.5px solid #D9D9D9;
+    .serConL{
+        display: flex;
+        align-items: center;
+
+    }
+}
+</style>

+ 129 - 0
src/views/appStoreCopy/components/userInfoPage.vue

@@ -0,0 +1,129 @@
+<template>
+    <div class="appStore">
+        <div class="topC">
+            <img  @click="backPage" src="../../../assets/images/appStoreCopy/backPage.svg" alt="">
+            <div>{{ userinfo.username }}</div>
+        </div>
+        <div class="infoCon">
+            <div>账号</div>
+            <div class="Blo">
+                <div style="display: flex;align-items: center;gap: 10px;">
+                    <img src="../../../assets/images/appStoreCopy/tel.svg" alt="">
+                    账号
+                </div>
+                {{ userinfo.accountNumber }}
+            </div>
+            <div class="Blo">
+                <div style="display: flex;align-items: center;gap: 10px;">
+                    <img src="../../../assets/images/appStoreCopy/sch.svg" alt="">
+                    学校
+                </div>
+                {{ userinfo.schoolName }}
+            </div>
+            <div @click="exitLogin" class="Blo">
+                <div style="display: flex;align-items: center;gap: 10px;">
+                    <img src="../../../assets/images/appStoreCopy/logOut.svg" alt="">
+                    退出登录
+                </div>
+            </div>
+        </div>
+
+    </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { loginOut } from '@/api/user'
+
+    export default {
+        data(){
+            return{
+
+            }
+        },
+        computed: {
+            ...mapGetters(['userinfo']),
+        },
+        methods:{
+            backPage(){
+                this.$router.push('/appStoreCopy')
+            },
+            // 退出登录
+            exitLogin() {
+                this.$dialog({
+                    message: '是否退出' + this.userinfo.username + '账号',
+                    showCancelButton: true,
+                    beforeClose: (action, done) => {
+                    if (action === 'confirm') {
+                        loginOut()
+                        .then(res => {
+                            this.$toast({
+                            message: '退出成功',
+                            type: 'success'
+                            })
+                            this.$store.dispatch('user/logout')
+                            window.location.reload()
+                            done()
+                        })
+                        .catch(err => {
+                            console.error(err)
+                            done()
+                        })
+                    } else {
+                        // 拦截取消操作
+                        done()
+                    }
+                    }
+                })
+            },
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+.appStore {
+  width: 100vw;
+  height: 100vh;
+  box-sizing: border-box;
+  // padding: 5px;
+  background-color: #f9f8f8;
+  display: flex;
+  flex-direction: column;
+  overflow: auto;
+}
+.topC {
+    display: flex;
+    justify-content: center;
+    width: 100%;
+    align-items: center;
+    height: 50px;
+    padding: 0px 12px;
+    box-sizing: border-box;
+    position: relative;
+    font-family: PingFang HK;
+    font-weight: 600;
+    font-size: 15px;
+    line-height: 20px;
+
+  img{
+    position: absolute;top: 50%;left: 10px;transform: translate(0,-50%);
+    width: 23px;
+  }
+}
+.infoCon{
+    margin-top: 35px;
+    padding: 15px;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    gap: 10px;
+    .Blo{
+        display: flex;
+        justify-content: space-between;
+        background: #fff;
+        align-items: center;
+        padding: 15px 20px;
+        border-radius: 10px;
+    }
+}
+</style>

+ 765 - 0
src/views/appStoreCopy/index.vue

@@ -0,0 +1,765 @@
+<template>
+  <div class="appStore">
+    <div class="topC">
+      <img
+        style="width: 24px;height: 24px;object-fit: contain;"
+        src="../../assets/images/appStoreCopy/topR.svg"
+        @click.stop="openCe"
+        alt=""
+      />
+      <img
+        @click="searchPage"
+        style="width: 24px;height: 24px;object-fit: contain;"
+        src="../../assets/images/appStoreCopy/topl.svg"
+        alt=""
+      />
+    </div>
+
+    <div id="appStoreCon" class="bodyCon">
+      <van-popup
+        round
+        v-model="CeShow"
+        :overlay="false"
+        get-container="#appStoreCon"
+        position="left"
+        :overlay-style="{ opacity: 0 }"
+        :style="{ height: '92vh', transform: 'translate3d(0,0%, 0)', width: '45%', minWidth: '150px', opacity: 0.9 }"
+      >
+        <div class="popupCon">
+          <div class="popTop">
+            <div style="color: #0663FE;">【{{ userinfo.orgName }}】</div>
+            <div>CocoFlow</div>
+            <div @click="comShow = true">使用电脑端</div>
+            <div>关注公众号</div>
+          </div>
+          <div class="popupBot" @click="goInfo">
+            <img style="width: 24px;height: 100%;" src="../../assets/images/appStoreCopy/popimg.svg" alt="" />
+            <div>
+              <div>李老师</div>
+              <div>cococlass341683</div>
+            </div>
+          </div>
+        </div>
+      </van-popup>
+
+      <van-tabs
+        @change="getData"
+        @touchmove.stop="handleTouchMove"
+        background="#F9F8F8"
+        :line-height="0"
+        title-active-color="#0663FE"
+        v-model="tabType"
+      >
+        <van-tab v-for="(i, index) in typeList" class="appBlocks" :key="index" :name="i.id" :title="i.name">
+          <template v-if="dataList.length">
+            <div v-for="(i, ind) in dataList" @click="openUrl(i.url)" :key="ind + 'a'" class="appBlock">
+              <div class="appBlockTop">
+                <img class="appBlockTopImg" :src="i.json.icon" alt="" />
+                <div class="appBlockTopTit">{{ i.name }}</div>
+                <div style="display: flex;align-items: center;">
+                  <img src="../../assets/images/appStoreCopy/appde.svg" alt="" />
+                  <div style="display: flex;gap: 5px;margin-left: 8px;">
+                    <span class="ATag">{{ i.label == 'workflow' ? '工作流' :'智能体' }}</span>
+                  </div>
+                </div>
+              </div>
+              <div class="appBlockBot">
+                <span>{{ i.username }}</span>
+                <div class="appBlockBotCol">
+                  <div @click.stop="addLike(i.id)" style="display: flex;align-items: center;">
+                    <img src="../../assets/images/appStoreCopy/star.svg" alt="" />
+                    {{ i.likeCount }}
+                  </div>
+                  <div @click.stop="addColl(i.id)" style="display: flex;align-items: center;">
+                    <img src="../../assets/images/appStoreCopy/xin.svg" alt="" />
+                    {{ i.collectCount }}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </template>
+          <div v-else style="position: absolute;left: 50%;top: 30%;transform: translate(-50%,-50%);">
+            暂无数据哦~
+          </div>
+          <div v-if="isShow" 
+            class="zzcl"
+          >
+              加载中...
+          </div>
+        </van-tab>
+      </van-tabs>
+    </div>
+
+    <!-- 侧边栏遮罩层 -->
+    <div
+      v-if="CeShow"
+      @click="openCeY"
+      style="position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: #000;opacity: 0"
+    ></div>
+
+    <van-popup 
+    overlay-class="comCss" 
+    v-model="comShow" 
+    round 
+    :closeable="true"
+    position="bottom" 
+    class="Vpop"
+     >
+    <div class="comCssTit">
+        电脑端开启更多高效体验
+    </div>
+    <img style="width: 170px;" src="../../assets/images/appStoreCopy/comp.svg" alt="">
+    <div class="cpmUrl"  @click="copyUrl">
+      <div>
+        https://cloud.cocorobo.cn/
+      </div>
+      <img style="margin-left: 5px;height: 16.8px;" src="../../assets/images/appStoreCopy/copyIco.svg" alt="">
+    </div>
+    <div class="comBot">
+      复制网址,去电脑端浏览器访问吧
+    </div>
+  </van-popup>
+    <!-- <div class="as_header">
+      <div class="as_h_top">
+        <span>应用管理</span>
+        <div class="exit" @click="exitLogin">退出</div>
+
+      </div>
+      <div class="as_h_bottom">
+        <el-input v-model="searchText" style="width:40%;" placeholder="请输入应用名称" size="small"></el-input>
+        <el-select v-model="selectJuri" placeholder="请选择权限" size="small" style="width:39%;margin-left:10px;font-size: 16px;" @change="getData()">
+          <el-option v-for="item in selectList" :key="item.index" :label="item.label" :value="item.index"></el-option>
+        </el-select>
+        <el-button
+          type="primary"
+          size="mini"
+          @click="getData()"
+          icon="el-icon-search"
+          style="margin-left: 10px;"
+        ></el-button>
+      </div>
+      <div class="as_h_typeList">
+				<span :class="{'typeActive':showType==''}" @click="changeType('')">全部</span>
+				<span v-for="(item,index) in typeList" :key="item.id" :class="{'typeActive':item.id==showType}" @click="changeType(item.id)">{{item.name}}</span>
+
+      </div>
+    </div>
+    <div class="as_content">
+      <div class="as_c_item" v-for="(item, index) in dataList" :key="item.id" @click="closeCard()">
+        <div class="as_c_i_top">
+          <div class="as_c_i_t_icon">
+            <svg
+              t="1732605901531"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="4275"
+              width="200"
+              height="200"
+							v-if="!item.json.icon"
+            >
+              <path
+                d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
+                fill="#2C6DD2"
+                p-id="4276"
+              ></path>
+              <path
+                d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
+                fill="#20C997"
+                p-id="4277"
+              ></path>
+            </svg>
+						<img :src="item.json.icon" alt="" v-else>
+          </div>
+          <div class="as_c_i_t_message">
+            <div>{{ item.name }}</div>
+            <span v-if="item.label==='agent'">智能体</span>
+						<span v-if="item.label==='workflow'">工作流</span>
+          </div>
+					<div class="ac_c_i_t_popover" v-if="showMenu(item)">
+						<svg t="1732786015570" @click.stop="showCard(item.id)" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9199" width="200" height="200"><path d="M192 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM512 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM832 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-34.133333-68.266667-68.266667-68.266667z" fill="#111111" p-id="9200"></path></svg>
+						<div class="popoverBox" v-if="showCardId===item.id">
+							<div v-if="item.userid===userinfo.userid" @click="editAppFn(item)">
+								<img src="../../assets/images/appStore/edit.svg"> 
+								<span>编辑</span>
+							</div>
+							<div v-if="item.json && item.json.copy==='1'" @click="copyAppFn(item)">
+								<img src="../../assets/images/appStore/copy.svg"> 
+								<span>复制</span>
+							</div>
+							<div v-if="item.userid===userinfo.userid" @click="deleteAppFn(item)">
+								<img src="../../assets/images/appStore/del.svg"> 
+								<span>删除</span>
+							</div>
+						</div>
+					</div>
+        </div>
+        <div class="as_c_i_bottom">
+          <div>{{ item.detail }}</div>
+          <span @click="openUrl(item.url)">{{ item.url }}</span>
+        </div>
+      </div>
+      <span class="as_c_empty" v-if="dataList.length === 0">
+        暂无应用...
+      </span>
+    </div>
+		<appStorePopup ref="appStorePopupRef" :typeList="typeList" @success="appStorePopupSuccess"/> -->
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getStoreType, getStore, addApp, editApp, insertSave, deleteApp } from '@/api/appStore'
+import appStorePopup from './components/appStorePopup.vue'
+import { Dialog, Toast } from 'vant'
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function(event) {
+      console.log('event', event)
+      console.log('村上春树')
+
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event)
+      }
+    }
+    // 在文档上添加点击事件监听器
+    document.addEventListener('tap', el.clickOutsideEvent)
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener('tap', el.clickOutsideEvent)
+  }
+}
+
+export default {
+  name: 'appStore',
+  components: {
+    appStorePopup
+  },
+  directives: {
+    'click-outside': clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      tabType: 0,
+      CeShow: false,
+      isShow: false, //loading
+      comShow:false, //电脑端链接
+      dataList: [],
+      typeList: [],
+      showType: '',
+      searchText: '',
+      selectJuri: 3,
+      selectList: [
+        { index: 1, label: '我的' },
+        { index: 2, label: '组织' },
+        { index: 3, label: '所有人' }
+      ],
+      showCardId: null
+    }
+  },
+  computed: {
+    ...mapGetters(['userinfo']),
+    showMenu() {
+      return data => {
+        let _result = false
+        if (data && this.userinfo.userid) {
+          if (data.userid === this.userinfo.userid || (data.json && data.json.copy === '1')) {
+            _result = true
+          }
+        }
+
+        return _result
+      }
+    }
+  },
+  methods: {
+    
+    async copyUrl() {
+      const url = "https://cloud.cocorobo.cn/";
+      try {
+        await navigator.clipboard.writeText(url);
+        Toast({
+          message: '链接已复制!',
+          position: 'top',
+        });
+      } catch (err) {
+        console.error("复制失败:", err);
+        Toast({
+          message: '复制失败,请手动复制',
+          position: 'top',
+        });
+      }
+    },
+    // 跳转个人信息页
+    goInfo(){
+      this.$router.push('/userInfoPage')
+    },
+    // 跳转查询页面
+    searchPage(){
+      this.$router.push('/searchL')
+    },
+    // 阻止触摸移动事件的默认行为
+    handleTouchMove(event) {
+      event.preventDefault()
+    },
+    // 打开与关闭侧边栏
+    openCe() {
+      this.CeShow = !this.CeShow
+    },
+    // 点击遮罩层关闭侧边栏
+    openCeY() {
+      this.CeShow = false
+    },
+
+    // 查询应用数据
+    getData(val = '') {
+      this.isShow = true
+      let params = {
+        uid: this.userinfo.userid,
+        name: this.searchText,
+        label: '',
+        type: val,
+        juri: this.selectJuri,
+        stand: 'cn'
+      }
+
+      getStore(params)
+        .then(res => {
+          let _data = res[0]
+          if (_data.length > 0) {
+            _data.forEach(i => {
+              if (i.json) {
+                i.json = JSON.parse(i.json)
+              }
+            })
+
+            this.dataList = _data
+          } else {
+            this.dataList = []
+          }
+          this.isShow = false
+        })
+        .catch(err => {
+          this.isShow = false
+          this.$toast.error('获取应用数据失败')
+        })
+    },
+    // 喜欢
+    addLike(){
+      
+    },
+    // 收藏
+    addColl(){
+
+    },
+
+    getAllStoreType() {
+      let params = {
+        suserid: this.userinfo.userid,
+        sorg: this.userinfo.org,
+        soid: this.userinfo.organizeid,
+        sstand: 'cn'
+      }
+
+      getStoreType(params)
+        .then(res => {
+          let _data = res[0]
+          if (_data.length > 0) {
+            this.typeList = _data
+            this.typeList.unshift({ id: '', name: '全部' })
+          } else {
+            this.typeList = []
+          }
+        })
+        .catch(err => {
+          console.log(err)
+          this.$toast.error('获取应用类型失败')
+        })
+    },
+    openUrl(url) {
+      window.open(url, '_blank')
+    },
+    addAppFn() {
+      this.$refs.appStorePopupRef.open({ type: 1 })
+    },
+    editAppFn(data) {
+      this.$refs.appStorePopupRef.open({
+        type: 2,
+        form: {
+          id: data.id,
+          nname: data.name,
+          nlabel: data.label,
+          ndetail: data.detail,
+          nurl: data.url,
+          ntype: data.type,
+          njuri: data.juri,
+          nstand: data.stand,
+          njson: data.json
+        }
+      })
+    },
+    copyAppFn(item) {
+      Dialog.confirm({
+        title: '复制应用',
+        message: `确定复制《${item.name}》这个应用吗?`
+      })
+        .then(_ => {
+          let params = [
+            {
+              name: `${item.name}_copy`,
+              userid: this.userinfo.userid,
+              label: item.label,
+              detail: item.detail,
+              url: item.url,
+              type: item.type,
+              juri: '1',
+              stand: 'cn',
+              json: JSON.stringify(item.json)
+            }
+          ]
+
+          addApp(params)
+            .then(res => {
+              if (res == 1) {
+                this.insertSaveFn(item, 3)
+                Toast.success('已复制到我的列表')
+              } else {
+                this.$toast.fail('复制失败')
+              }
+              this.getData()
+            })
+            .catch(e => {
+              console.log(e)
+              this.$toast.fail('复制失败')
+            })
+        })
+        .catch(_ => {})
+    },
+    deleteAppFn(item) {
+      Dialog.confirm({
+        title: '删除应用',
+        message: `确定删除《${item.name}》这个应用吗?`
+      })
+        .then(_ => {
+          let params = [
+            {
+              uid: this.userinfo.userid,
+              aid: item.id
+            }
+          ]
+          deleteApp(params)
+            .then(res => {
+              if (res == 1) {
+                this.$toast.success('删除应用成功')
+              } else {
+                this.$toast.fail('删除应用失败')
+              }
+              this.getData()
+            })
+            .catch(e => {
+              console.log(e)
+              this.$toast.fail('删除应用失败')
+            })
+        })
+        .catch(_ => {
+          console.log('取消删除')
+        })
+    },
+    insertSaveFn(item, type) {
+      return new Promise(resolve => {
+        let params = [
+          {
+            uid: this.userinfo.userid,
+            type: type,
+            aid: item.id,
+            json: ''
+          }
+        ]
+        insertSave(params)
+          .then(res => {
+            if (res) {
+              resolve(1)
+            } else {
+              resolve(0)
+            }
+          })
+          .catch(e => {
+            console.log(e)
+            resolve(0)
+          })
+      })
+    },
+    appStorePopupSuccess(data, type) {
+      if (type === 1) {
+        //添加
+        let params = [
+          {
+            nname: data.nname, //app名称
+            nuserid: this.userinfo.userid, //创建的用户ID
+            nlabel: data.nlabel, //app标签
+            ndetail: data.ndetail, //app简介
+            nurl: data.nurl, //app链接
+            ntype: data.ntype, //app类型
+            njuri: data.njuri, //app权限 1:我的 2:组织 3:所有人
+            nstand: 'cn', //语言
+            njson: '' //其他信息
+          }
+        ]
+        addApp(params)
+          .then(res => {
+            if (res == 1) {
+              this.$message.success('添加成功')
+              this.$refs.appStorePopupRef.close(true)
+              this.getData()
+            } else {
+              this.$message.error('添加失败')
+              this.$refs.appStorePopupRef.loading = false
+            }
+          })
+          .catch(err => {
+            console.log(err)
+            this.$message.error('添加失败')
+          })
+      } else if (type === 2) {
+        let params = [
+          {
+            aid: data.id,
+            nname: data.nname, //app名称
+            nuserid: this.userinfo.userid, //创建的用户ID
+            nlabel: data.nlabel, //app标签
+            ndetail: data.ndetail, //app简介
+            nurl: data.nurl, //app链接
+            ntype: data.ntype, //app类型
+            njuri: data.njuri, //app权限 1:我的 2:组织 3:所有人
+            nstand: 'cn', //语言
+            njson: data.njson //其他信息
+          }
+        ]
+        editApp(params)
+          .then(res => {
+            if (res == 1) {
+              this.$message.success('修改成功')
+              this.$refs.appStorePopupRef.close(true)
+              this.getData()
+            } else {
+              this.$message.error('修改失败')
+              this.$refs.appStorePopupRef.loading = false
+            }
+          })
+          .catch(err => {
+            console.log(err)
+            this.$message.error('修改失败')
+          })
+      }
+    },
+    showCard(id) {
+      if (this.showCardId == id) return (this.showCardId = null)
+      this.showCardId = id
+    },
+    changeType(id) {
+      if (this.showType !== id) {
+        this.showType = id
+        this.getData()
+      }
+    },
+    closeCard() {
+      this.showCardId = null
+    }
+  },
+  mounted() {
+    this.getData()
+    this.getAllStoreType()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.appStore {
+  width: 100vw;
+  height: 100vh;
+  box-sizing: border-box;
+  // padding: 5px;
+  background-color: #f9f8f8;
+  display: flex;
+  flex-direction: column;
+  overflow: auto;
+}
+.topC {
+  display: flex;
+  justify-content: space-between;
+  width: 100%;
+  align-items: center;
+  height: 80px;
+  padding: 0px 12px;
+  box-sizing: border-box;
+}
+.bodyCon {
+  height: 100%;
+}
+:deep .van-popup--left {
+  top: auto !important;
+}
+.popupCon {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  padding: 20px 20px 40px 20px;
+  height: 100%;
+  box-sizing: border-box;
+  .popTop {
+    color: #000;
+    display: flex;
+    flex-direction: column;
+    font-size: 12px;
+    gap: 15px;
+    font-family: PingFang SC;
+    font-weight: 600;
+  }
+
+  .popupBot {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
+}
+.appBlocks {
+  display: grid;
+  position: relative;
+  grid-template-columns: repeat(2, 1fr);
+  // grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
+  padding: 10px;
+  box-sizing: border-box;
+  gap: 10px;
+  grid-auto-rows: 150px; /* 统一高度 */
+  background: #f9f8f8;
+  overflow: auto;
+  .appBlock {
+    min-width: 100px;
+    max-height: 145px;
+    background: #f8f8f8;
+    border-radius: 10px;
+    box-shadow: 0px 4px 10px 0px #00000033;
+    .appBlockTop {
+      border-radius: 10px;
+      padding: 10px;
+      background: #fff;
+      box-sizing: border-box;
+      .appBlockTopImg {
+        width: 30px;
+        height: 30px;
+        object-fit: contain;
+        border-radius: 50%;
+        padding: 3px;
+        box-sizing: border-box;
+        border: 0.5px #d9d9d9 solid;
+        margin-bottom: 10px;
+      }
+      .appBlockTopTit {
+        font-family: PingFang SC;
+        font-weight: 600;
+        font-size: 14px;
+        line-height: 15px;
+        margin-bottom: 10px;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+      .ATag {
+        font-family: PingFang SC;
+        font-weight: 400;
+        font-size: 10px;
+        line-height: 16px;
+        background: #f3f3f3;
+        padding: 2px;
+        border-radius: 2px;
+        box-sizing: border-box;
+      }
+    }
+    .appBlockBot {
+      background: #f8f8f8;
+      display: flex;
+      padding: 10px;
+      border-radius: 0 0 10px 10px;
+      justify-content: space-between;
+      box-sizing: border-box;
+      .appBlockBotCol {
+        display: flex;
+        gap: 8px;
+      }
+    }
+  }
+}
+// /deep/ .van-tab {
+//   width: 100px;
+//   text-align: center;
+// }
+
+// /deep/ .van-tabs__line {
+//   width: 90px;
+//   height: 2px;
+//   flex-shrink: 0;
+//   background: #4a8efc;
+// }
+
+/deep/ .van-tab__pane {
+  height: calc(92vh - 44px);
+  overflow-y: auto;
+  overflow-x: hidden;
+  width: 100%;
+}
+/deep/ .comCss{
+    background: rgba(158, 152, 152, 0.4);
+    backdrop-filter: blur(3px);
+}
+.Vpop{
+      padding: 20px 30px;
+      box-sizing: border-box;
+      height: 350px;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+}
+.comCssTit{
+  font-family: PingFang HK;
+  font-weight: 600;
+  font-size: 20px;
+  line-height: 20px;
+  color: #0663FE;
+  margin-bottom: 20px;
+}
+.cpmUrl{
+  background: #3681FC;
+  border-radius: 12px;
+  padding: 10px 20px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #fff;
+  font-family: PingFang HK;
+  font-weight: 600;
+  font-size: 12px;
+  margin: 10px 0 20px;
+}
+.comBot{
+  font-family: PingFang HK;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #000;
+}
+.zzcl{
+      position: absolute;
+      left: 0%;top: 0%;
+      background: #fff;
+      width: 100%;height: 100%;opacity: .6;
+      display: flex;justify-content: center;line-height: 350px;
+      font-size: 16px;
+      color: #000;
+}
+</style>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů