snow 4 månader sedan
förälder
incheckning
c1dfb7295a

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/baseUrl-BrxYBTAq.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/baseUrl-CcBiGQlI.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/cost-detail-BnzFdtNX.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/cost-detail-C64dpo5C.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/index-8RdGnwrO.js


+ 0 - 1
dist/assets/index-BpShU-ei.js

@@ -1 +0,0 @@
-import{a0 as S,a1 as g,a2 as M,r as v,a3 as O,a4 as R,a5 as T,u as k,a6 as y,a7 as w,a8 as b,H as C}from"./index-CDe_P95-.js";function W(e){return R()?(T(e),!0):!1}function m(e){return typeof e=="function"?e():k(e)}const h=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const _=e=>e!=null,B=()=>{};function D(e){return e||y()}function U(...e){if(e.length!==1)return S(...e);const t=e[0];return typeof t=="function"?g(M(()=>({get:t,set:B}))):v(t)}function A(e,t){D(t)&&O(e,t)}function E(e){var t;const i=m(e);return(t=i==null?void 0:i.$el)!=null?t:i}const G=h?window:void 0,L=h?window.document:void 0;function $(){const e=v(!1),t=y();return t&&C(()=>{e.value=!0},t),e}function q(e){const t=$();return b(()=>(t.value,!!e()))}function x(e,t,i={}){const{window:s=G,...a}=i;let n;const l=q(()=>s&&"MutationObserver"in s),c=()=>{n&&(n.disconnect(),n=void 0)},r=b(()=>{const u=m(e),p=(Array.isArray(u)?u:[u]).map(E).filter(_);return new Set(p)}),d=w(()=>r.value,u=>{c(),l.value&&s&&u.size&&(n=new MutationObserver(t),u.forEach(p=>n.observe(p,a)))},{immediate:!0,flush:"post"}),f=()=>n==null?void 0:n.takeRecords(),o=()=>{c(),d()};return W(o),{isSupported:l,stop:o,takeRecords:f}}function H(e=null,t={}){var i,s,a;const{document:n=L,restoreOnUnmount:l=o=>o}=t,c=(i=n==null?void 0:n.title)!=null?i:"",r=U((s=e??(n==null?void 0:n.title))!=null?s:null),d=e&&typeof e=="function";function f(o){if(!("titleTemplate"in t))return o;const u=t.titleTemplate||"%s";return typeof u=="function"?u(o):m(u).replace(/%s/g,o)}return w(r,(o,u)=>{o!==u&&n&&(n.title=f(typeof o=="string"?o:""))},{immediate:!0}),t.observe&&!t.titleTemplate&&n&&!d&&x((a=n.head)==null?void 0:a.querySelector("title"),()=>{n&&n.title!==r.value&&(r.value=f(n.title))},{childList:!0}),A(()=>{if(l){const o=l(c,r.value||"");o!=null&&n&&(n.title=o)}}),r}export{H as u};

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 10
dist/assets/index-CDe_P95-.js


+ 1 - 0
dist/assets/index-CGxa7sIV.js

@@ -0,0 +1 @@
+import{l as p}from"./index-IkXu6kUe.js";import{d as f,H as c,a as g,c as w,b as a,w as l,u as s,a1 as h,a2 as x,q as _,v as n,$ as V,a0 as b,o as y,K as T,M as u,l as d,B as k,h as v}from"./index-DUta8A_V.js";import{u as C}from"./index-ibFGNAQW.js";import"./baseUrl-CcBiGQlI.js";const B={class:"w-full h-full relative overflow-hidden"},S=f({__name:"index",setup(q){const i=c();x();const t=g({username:"",password:""});async function m(){try{_({message:"登录中...",forbidClick:!0});const{code:o,data:e}=await p(t);n(),o==0&&(["265","264","132","107","55","81","95"].includes(String(e.id))?(b(e.token),i.push("/home")):V({message:"账号存在,但该账号不能使用本系统",duration:2e3}))}catch(o){console.log(o),n()}}return C("登录"),(o,e)=>(y(),w("div",B,[a(s(h),{class:"max-w-[95%] w-[400px] fixed top-[300px] left-[50%]",style:{transform:"translate(-50%, -50%)"},onSubmit:m},{default:l(()=>[a(s(T),null,{default:l(()=>[a(s(u),null,{default:l(()=>[a(s(d),{modelValue:t.username,"onUpdate:modelValue":e[0]||(e[0]=r=>t.username=r),label:"手机号",placeholder:"请输入手机号",maxlength:"11",rules:[{required:!0,message:"请填写手机号",trigger:"change"}]},null,8,["modelValue"])]),_:1}),a(s(u),null,{default:l(()=>[a(s(d),{modelValue:t.password,"onUpdate:modelValue":e[1]||(e[1]=r=>t.password=r),label:"密码",placeholder:"请输入密码",type:"password",rules:[{required:!0,message:"请填写用户名",trigger:"change"}]},null,8,["modelValue"])]),_:1}),a(s(u),{class:"mt-[16px]"},{default:l(()=>[a(s(k),{block:"",type:"primary","native-type":"submit"},{default:l(()=>e[2]||(e[2]=[v("登录")])),_:1})]),_:1})]),_:1})]),_:1})]))}});export{S as default};

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/index-CIAXXiuA.css


+ 1 - 1
dist/assets/index-bd6OULBi.js → dist/assets/index-CXJvZnEk.js

@@ -1 +1 @@
-import{Q as l,R as i,U as c,V as p,b as m,W as d,X as f}from"./index-CDe_P95-.js";import{s as t,o,n as a}from"./baseUrl-BrxYBTAq.js";let r;const C={title:"",width:"",theme:null,message:"",overlay:!0,callback:null,teleport:"body",className:"",allowHtml:!1,lockScroll:!0,transition:void 0,beforeClose:null,overlayClass:"",overlayStyle:void 0,messageAlign:"",cancelButtonText:"",cancelButtonColor:null,cancelButtonDisabled:!1,confirmButtonText:"",confirmButtonColor:null,confirmButtonDisabled:!1,showConfirmButton:!0,showCancelButton:!1,closeOnPopstate:!0,closeOnClickOverlay:!1};let g=l({},C);function B(){({instance:r}=c({setup(){const{state:s,toggle:n}=p();return()=>m(f,d(s,{"onUpdate:show":n}),null)}}))}function b(e){return i?new Promise((s,n)=>{r||B(),r.open(l({},g,e,{callback:u=>{(u==="confirm"?s:n)(u)}}))}):Promise.resolve(void 0)}const y=e=>b(l({showCancelButton:!0},e)),q=(e,s)=>t.post({url:o+"/admin/consultbidlist",data:e,cancelToken:s}),v=e=>t.post({url:o+"/admin/consultfeadinfo",data:e}),k=e=>t.post({url:o+"/admin/bidscheck",data:e}),S=(e,s)=>t.post({url:a+"/admin/good/list",data:e,cancelToken:s}),x=e=>t.post({url:o+"/admin/goodupinfo",data:e}),O=e=>t.post({url:o+"/admin/goodexam",data:e}),P=e=>t.post({url:a+"user/TaxCategory/listByCompany",data:e}),D=e=>t.post({url:a+"user/supplier/info",data:e}),T=e=>t.post({url:o+"admin/businesssinfo",data:e});export{k as a,P as b,T as c,D as d,S as e,v as f,x as g,O as h,q as r,y as s};
+import{Q as l,R as i,U as c,V as p,b as m,W as d,X as f}from"./index-DUta8A_V.js";import{s as t,o,n as a}from"./baseUrl-CcBiGQlI.js";let r;const C={title:"",width:"",theme:null,message:"",overlay:!0,callback:null,teleport:"body",className:"",allowHtml:!1,lockScroll:!0,transition:void 0,beforeClose:null,overlayClass:"",overlayStyle:void 0,messageAlign:"",cancelButtonText:"",cancelButtonColor:null,cancelButtonDisabled:!1,confirmButtonText:"",confirmButtonColor:null,confirmButtonDisabled:!1,showConfirmButton:!0,showCancelButton:!1,closeOnPopstate:!0,closeOnClickOverlay:!1};let g=l({},C);function B(){({instance:r}=c({setup(){const{state:s,toggle:n}=p();return()=>m(f,d(s,{"onUpdate:show":n}),null)}}))}function b(e){return i?new Promise((s,n)=>{r||B(),r.open(l({},g,e,{callback:u=>{(u==="confirm"?s:n)(u)}}))}):Promise.resolve(void 0)}const y=e=>b(l({showCancelButton:!0},e)),q=(e,s)=>t.post({url:o+"/admin/consultbidlist",data:e,cancelToken:s}),v=e=>t.post({url:o+"/admin/consultfeadinfo",data:e}),k=e=>t.post({url:o+"/admin/bidscheck",data:e}),S=(e,s)=>t.post({url:a+"/admin/good/list",data:e,cancelToken:s}),x=e=>t.post({url:o+"/admin/goodupinfo",data:e}),O=e=>t.post({url:o+"/admin/goodexam",data:e}),P=e=>t.post({url:a+"user/TaxCategory/listByCompany",data:e}),D=e=>t.post({url:a+"user/supplier/info",data:e}),T=e=>t.post({url:o+"admin/businesssinfo",data:e});export{k as a,P as b,T as c,D as d,S as e,v as f,x as g,O as h,q as r,y as s};

+ 0 - 1
dist/assets/index-CrkyJqii.js

@@ -1 +0,0 @@
-import{s as c,o as f}from"./baseUrl-BrxYBTAq.js";import{d as g,a as w,c as h,b as e,w as l,u as a,Y as _,K as x,q as V,v as d,Z as b,_ as v,o as y,J as T,M as n,l as i,B as k,h as C,$ as B}from"./index-CDe_P95-.js";import{u as q}from"./index-BpShU-ei.js";const A=u=>c.post({url:f+"/admin/login",data:u}),F={class:"w-full h-full relative overflow-hidden"},S=g({__name:"index",setup(u){const m=x();B();const t=w({username:"",password:""});async function p(){try{V({message:"登录中...",forbidClick:!0});const{code:o,data:s}=await A(t);d(),o==0&&(["265","264","132","107","55","81","95"].includes(String(s.id))?(v(s.token),m.push("/home")):b({message:"账号存在,但该账号不能使用本系统",duration:2e3}))}catch(o){console.log(o),d()}}return q("登录"),(o,s)=>(y(),h("div",F,[e(a(_),{class:"max-w-[95%] w-[400px] fixed top-[300px] left-[50%]",style:{transform:"translate(-50%, -50%)"},onSubmit:p},{default:l(()=>[e(a(T),null,{default:l(()=>[e(a(n),null,{default:l(()=>[e(a(i),{modelValue:t.username,"onUpdate:modelValue":s[0]||(s[0]=r=>t.username=r),label:"手机号",placeholder:"请输入手机号",maxlength:"11",rules:[{required:!0,message:"请填写手机号",trigger:"change"}]},null,8,["modelValue"])]),_:1}),e(a(n),null,{default:l(()=>[e(a(i),{modelValue:t.password,"onUpdate:modelValue":s[1]||(s[1]=r=>t.password=r),label:"密码",placeholder:"请输入密码",type:"password",rules:[{required:!0,message:"请填写用户名",trigger:"change"}]},null,8,["modelValue"])]),_:1}),e(a(n),{class:"mt-[16px]"},{default:l(()=>[e(a(k),{block:"",type:"primary","native-type":"submit"},{default:l(()=>[C("登录")]),_:1})]),_:1})]),_:1})]),_:1})]))}});export{S as default};

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/index-D62_rE0v.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 5 - 0
dist/assets/index-DUta8A_V.js


+ 1 - 0
dist/assets/index-IkXu6kUe.js

@@ -0,0 +1 @@
+import{s as r,o as s}from"./baseUrl-CcBiGQlI.js";const t=o=>r.post({url:s+"/admin/login",data:o}),e=o=>r.post({url:s+"/admin/userinfo",data:o});export{e as g,t as l};

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/index-TF0ljAmW.js


+ 1 - 0
dist/assets/index-ibFGNAQW.js

@@ -0,0 +1 @@
+import{a3 as h,a4 as S,a5 as M,r as v,a6 as O,a7 as R,a8 as T,u as k,a9 as y,aa as b,ab as w,J as C}from"./index-DUta8A_V.js";function W(e){return R()?(T(e),!0):!1}function m(e){return typeof e=="function"?e():k(e)}const g=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const _=e=>e!=null,B=()=>{};function D(e){return y()}function U(...e){if(e.length!==1)return h(...e);const t=e[0];return typeof t=="function"?S(M(()=>({get:t,set:B}))):v(t)}function A(e,t){D()&&O(e,t)}function E(e){var t;const i=m(e);return(t=i==null?void 0:i.$el)!=null?t:i}const G=g?window:void 0,L=g?window.document:void 0;function $(){const e=v(!1),t=y();return t&&C(()=>{e.value=!0},t),e}function q(e){const t=$();return w(()=>(t.value,!!e()))}function x(e,t,i={}){const{window:s=G,...a}=i;let n;const l=q(()=>s&&"MutationObserver"in s),c=()=>{n&&(n.disconnect(),n=void 0)},r=w(()=>{const u=m(e),p=(Array.isArray(u)?u:[u]).map(E).filter(_);return new Set(p)}),d=b(()=>r.value,u=>{c(),l.value&&u.size&&(n=new MutationObserver(t),u.forEach(p=>n.observe(p,a)))},{immediate:!0,flush:"post"}),f=()=>n==null?void 0:n.takeRecords(),o=()=>{c(),d()};return W(o),{isSupported:l,stop:o,takeRecords:f}}function I(e=null,t={}){var i,s,a;const{document:n=L,restoreOnUnmount:l=o=>o}=t,c=(i=n==null?void 0:n.title)!=null?i:"",r=U((s=e??(n==null?void 0:n.title))!=null?s:null),d=e&&typeof e=="function";function f(o){if(!("titleTemplate"in t))return o;const u=t.titleTemplate||"%s";return typeof u=="function"?u(o):m(u).replace(/%s/g,o)}return b(r,(o,u)=>{o!==u&&n&&(n.title=f(typeof o=="string"?o:""))},{immediate:!0}),t.observe&&!t.titleTemplate&&n&&!d&&x((a=n.head)==null?void 0:a.querySelector("title"),()=>{n&&n.title!==r.value&&(r.value=f(n.title))},{childList:!0}),A(()=>{if(l){const o=l(c,r.value||"");o!=null&&n&&(n.title=o)}}),r}export{I as u};

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/seek-detail-Cg2BS0nr.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/assets/seek-detail-fQ8w6nmo.js


+ 2 - 2
dist/index.html

@@ -6,8 +6,8 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
     <meta name="description" content="Vite Starter Template By Kirk Lin" />
-    <script type="module" crossorigin src="/assets/index-CDe_P95-.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-BunX5Avd.css">
+    <script type="module" crossorigin src="/assets/index-DUta8A_V.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-CIAXXiuA.css">
   <link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
   <body>
     <div id="app">

+ 1 - 1
dist/sw.js

@@ -1 +1 @@
-if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()})).then((()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e})));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let t={};const o=e=>i(e,l),d={module:{uri:l},exports:t,require:o};s[l]=Promise.all(n.map((e=>d[e]||o(e)))).then((e=>(r(...e),t)))}}define(["./workbox-aca2a06f"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/baseUrl-BrxYBTAq.js",revision:null},{url:"assets/cost-detail-C64dpo5C.js",revision:null},{url:"assets/index-bd6OULBi.js",revision:null},{url:"assets/index-BpShU-ei.js",revision:null},{url:"assets/index-BunX5Avd.css",revision:null},{url:"assets/index-CDe_P95-.js",revision:null},{url:"assets/index-CrkyJqii.js",revision:null},{url:"assets/index-TF0ljAmW.js",revision:null},{url:"assets/seek-detail-Cg2BS0nr.js",revision:null},{url:"index.html",revision:"c0c8c91dab5c14767a8c128b6553264f"},{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"favicon.ico",revision:"67d34b0decfd4d725d1c1f2eeadc4756"},{url:"pwa-192x192.png",revision:"f388f89cd644482d0cc1609469ca8f74"},{url:"pwa-512x512.png",revision:"7afda480bbadb46f3b0abc6cb0b47b78"},{url:"manifest.webmanifest",revision:"a0cb89bdb09cbab9b830ee23eab86720"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}));
+if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()})).then((()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e})));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let t={};const o=e=>i(e,l),u={module:{uri:l},exports:t,require:o};s[l]=Promise.all(n.map((e=>u[e]||o(e)))).then((e=>(r(...e),t)))}}define(["./workbox-f283bc42"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/baseUrl-CcBiGQlI.js",revision:null},{url:"assets/cost-detail-BnzFdtNX.js",revision:null},{url:"assets/index-8RdGnwrO.js",revision:null},{url:"assets/index-CGxa7sIV.js",revision:null},{url:"assets/index-CIAXXiuA.css",revision:null},{url:"assets/index-CXJvZnEk.js",revision:null},{url:"assets/index-D62_rE0v.js",revision:null},{url:"assets/index-DUta8A_V.js",revision:null},{url:"assets/index-ibFGNAQW.js",revision:null},{url:"assets/index-IkXu6kUe.js",revision:null},{url:"assets/seek-detail-fQ8w6nmo.js",revision:null},{url:"index.html",revision:"18ee4a5bfdb9298d9eab967601bb1c68"},{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"favicon.ico",revision:"67d34b0decfd4d725d1c1f2eeadc4756"},{url:"pwa-192x192.png",revision:"f388f89cd644482d0cc1609469ca8f74"},{url:"pwa-512x512.png",revision:"7afda480bbadb46f3b0abc6cb0b47b78"},{url:"manifest.webmanifest",revision:"a0cb89bdb09cbab9b830ee23eab86720"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}));

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/workbox-f283bc42.js


+ 1 - 0
package.json

@@ -28,6 +28,7 @@
     "preinstall": "npx only-allow pnpm"
   },
   "dependencies": {
+      "crypto-js": "^4.1.1",
     "@kirklin/logger": "^0.0.2",
     "@kirklin/reset-css": "^0.0.4",
     "@vitejs/plugin-vue-jsx": "^3.1.0",

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 321 - 497
pnpm-lock.yaml


+ 103 - 0
src/pages/accept/index.vue

@@ -0,0 +1,103 @@
+<script setup lang="ts">
+import { reactive } from "vue"
+import CryptoJS from "crypto-js";
+import { getUserInfo, login } from "~/service/modules/login"
+import { CellGroup, Cell, Field, Button, Form, showLoadingToast, closeToast, showToast, allowMultipleToast } from "vant"
+import { setAuthToken } from "~/utils/auth";
+import { useRouter } from "vue-router"
+
+import { useTitle } from "@vueuse/core"
+
+const router = useRouter()
+
+allowMultipleToast()
+
+const formData = reactive({
+  username: '',
+  password: ''
+})
+
+
+function getParameterByName(name) {
+  var url = window.location.href;
+  name = name.replace(/[\[\]]/g, '\\$&');
+  var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');
+  var results = regex.exec(url);
+  if (!results) return null;
+  if (!results[2]) return '';
+  return decodeURIComponent(results[2].replace(/\+/g, ' '));
+}
+
+async function onLogin() {
+  try {
+    showLoadingToast({ message: '登录中...', forbidClick: true })
+    const { code, data } = await login(formData)
+    closeToast()
+
+    if (code == 0) {
+      if (!['265', '264', '132', '107', '55', '81', '95'].includes(String(data.id))) {
+        showToast({ message: '账号存在,但该账号不能使用本系统', duration: 2000 })
+      } else {
+        setAuthToken(data.token)
+        router.push('/home')
+      }
+    }
+  } catch (err) {
+    console.log(err)
+    closeToast()
+  }
+}
+
+onMounted(async () => {
+  const obj = getParameterByName('t')
+
+  if(obj){
+    showLoadingToast({ message: '获取用户信息...', forbidClick: true })
+    const decData = CryptoJS.enc.Base64.parse(obj).toString(
+      CryptoJS.enc.Utf8
+    );
+
+    const decJson = CryptoJS.AES.decrypt(decData, 'key123').toString(
+      CryptoJS.enc.Utf8
+    );
+    const { token } = JSON.parse(decJson);
+    const result = await getUserInfo({ token })
+
+    closeToast()
+
+    if (!['265', '264', '132', '107', '55', '81', '95', '109'].includes(String(result.data.id))) {
+      showToast({ message: '账号存在,但该账号不能使用本系统', duration: 2000 })
+    } else {
+      setAuthToken(result.data.token)
+      router.push('/home')
+    }
+  }
+})
+
+
+useTitle('登录')
+</script>
+
+<template>
+  <div class="w-full h-full relative overflow-hidden">
+    <!-- <NavBar title="登录" /> -->
+    <Form class="max-w-[95%] w-[400px] fixed top-[300px] left-[50%]" style="transform: translate(-50%, -50%)"
+      @submit="onLogin">
+      <CellGroup>
+        <Cell>
+          <Field v-model="formData.username" label="手机号" placeholder="请输入手机号" maxlength="11"
+            :rules="[{ required: true, message: '请填写手机号', trigger: 'change' }]" />
+        </Cell>
+
+        <Cell>
+          <Field v-model="formData.password" label="密码" placeholder="请输入密码" type="password"
+            :rules="[{ required: true, message: '请填写用户名', trigger: 'change' }]" />
+        </Cell>
+
+        <Cell class="mt-[16px]">
+          <Button block type="primary" native-type="submit">登录</Button>
+        </Cell>
+      </CellGroup>
+    </Form>
+  </div>
+</template>

+ 147 - 210
src/pages/home/components/seek-product.vue

@@ -284,21 +284,40 @@ function handleExport() {
     return
   }
 
-  const isOk = selection.value.every(item => item.tax_status == '0')
+  const isOk = selection.value.every(item => item.tax_status == '0' || item.tax_status == '2')
   if(!isOk){
-    showFailToast('只能导出状态为待审核的数据')
+    showFailToast('只能导出状态为待审核或审核驳回的数据')
     return
   }
 
 
-  const data = selection.value.map(item => ({
-    'SKU编号': item.spuCode,
-    '商品名称': item.good_name,
-    '类目编码': item.in_info.merge_code,
-    '类目名称': item.in_info.cat_name,
-    '进项税率': item.tax + '%',
-    '工艺材质': item.cost_desc
-  }))
+  let data = [] 
+
+  const isWait = selection.value[0].tax_status == '0'
+  if(isWait){
+    data = selection.value.map(item => ({
+      'SKU编号': item.spuCode,
+      '商品名称': item.good_name,
+      '类目编码': item.in_info.merge_code,
+      '类目名称': item.in_info.cat_name,
+      '进项税率': item.tax + '%',
+      '工艺材质': item.cost_desc
+    }))
+  } else {
+    data = selection.value.map(item => ({
+      'SKU编号': item.spuCode,
+      '商品名称': item.good_name,
+      '类目编码': item.in_info.merge_code,
+      '类目名称': item.in_info.cat_name,
+      '进项税率': item.tax + '%',
+      '工艺材质': item.cost_desc,
+      '财务驳回原因': item.tax_exam_remark
+    }))
+  }
+
+
+
+
 
   //创建数据表
   const workBook = utils.book_new();
@@ -345,78 +364,43 @@ const isApproval = (item) => item.tax_status == '0'
 
 <template>
   <div class="bg-[#f5f5f5] w-full" style="height:calc(100vh - 50px);overflow: auto">
-    <Tabs style="z-index:1000" class="w-full fixed top-0 left-0" v-model:active="state.status" @change="handleTabChange">
+    <Tabs style="z-index:1000" class="w-full fixed top-0 left-0" v-model:active="state.status"
+      @change="handleTabChange">
       <Tab v-for="tab in tabList" :title="tab.label" :key="tab.value" :name="tab.value" />
     </Tabs>
 
-    <div 
-      class="w-full flex bg-[#fff] fixed top-[43px]  left-0 items-center" 
-      style="z-index:1000; border-bottom: 1px solid #f5f5f5" 
-    >
-      <Search 
-        class="flex-1"
-        v-model="state.skuOrName"
-        placeholder="SKU编号/商品名称" 
-        @clear="onSearch('', true)"
-      />
-      
-      <Button 
-        class="mr-[15px] ml-[-10px]" 
-        type="warning"
-        size="small"
-        @click="onSearch('', true)"
-      >搜索</Button>
+    <div class="w-full flex bg-[#fff] fixed top-[43px]  left-0 items-center"
+      style="z-index:1000; border-bottom: 1px solid #f5f5f5">
+      <Search class="flex-1" v-model="state.skuOrName" placeholder="SKU编号/商品名称" @clear="onSearch('', true)" />
+
+      <Button class="mr-[15px] ml-[-10px]" type="warning" size="small" @click="onSearch('', true)">搜索</Button>
     </div>
 
-   <div 
-      v-if="state.status == 0 && state.status != ''"
-      class="w-full h-[30px] bg-white fixed top-[98px] left-0 flex items-center justify-between" 
-      style="font-size: 14px;border-bottom: 1px solid #f5f5f5;z-index:1000; "
-    >
-      <Checkbox 
-        class="ml-[15px]" 
-        shape="square" 
-        size="small" 
-        style="font-size:12px"
-        :modelValue="state.isCheckAll"
-        :indeterminate="state.isIndeterminate"
-        @click="handleCheckAll"
-        :disabled="list.length === 0"
-      >
+    <div v-if="(state.status == 0 || state.status == 2) && state.status != ''"
+      class="w-full h-[30px] bg-white fixed top-[98px] left-0 flex items-center justify-between"
+      style="font-size: 14px;border-bottom: 1px solid #f5f5f5;z-index:1000; ">
+      <Checkbox class="ml-[15px]" shape="square" size="small" style="font-size:12px" :modelValue="state.isCheckAll"
+        :indeterminate="state.isIndeterminate" @click="handleCheckAll" :disabled="list.length === 0">
         全选
       </Checkbox>
-      
+
       <div>选中 {{ selection.length }} 条 , 显示 {{ list.length }} / {{ state.total }} 条</div>
-      <Button 
-        class="mr-[15px] h-[22px]" size="small"
-        :disabled="list.length === 0"
-        @click="handleExport"
-        type="primary"
-        >导出</Button>
+      <Button class="mr-[15px] h-[22px]" size="small" :disabled="list.length === 0" @click="handleExport"
+        type="primary">导出</Button>
     </div>
-    
-    <List 
-      :class="`w-full ${state.status == 0 && state.status != '' ? 'mt-[120px]' : 'mt-[90px]'}`" 
-      v-model:loading="state.loading" 
-      :finished="state.finished" 
-      finished-text="没有更多了" 
-      @load="onSearch"
-     >
-       <div :show="true" class="bg-[#fff] my-[3px] border-[#f5f5f5]" v-for="item in list" :key="item.id">
+
+    <List
+      :class="`w-full ${(state.status == 0 || state.status == 2) && state.status != '' ? 'mt-[120px]' : 'mt-[90px]'}`"
+      v-model:loading="state.loading" :finished="state.finished" finished-text="没有更多了" @load="onSearch">
+      <div :show="true" class="bg-[#fff] my-[3px] border-[#f5f5f5]" v-for="item in list" :key="item.id">
         <div class="p-[15px] flex items-start">
-          <Checkbox 
-            v-if="state.status == 0"
-             shape="square" 
-             class="w-[24px] mt-[5px] mr-[5px]"
-             :modelValue="mapIds.includes(item.id)"
-             @click="() => handleSelectChange(item)" 
-           />
+          <Checkbox v-if="state.status == 0 || state.status == 2" shape="square" class="w-[24px] mt-[5px] mr-[5px]"
+            :modelValue="mapIds.includes(item.id)" @click="() => handleSelectChange(item)" />
 
           <div class="float-right items-start w-full">
-           <div class="flex flex-col ml-[10px]" style="line-height:22px">
-             <div class="color-[#0f0f0f] flex items-start">
-                <Image 
-                  style="
+            <div class="flex flex-col ml-[10px]" style="line-height:22px">
+              <div class="color-[#0f0f0f] flex items-start">
+                <Image style="
                     height:28px;
                     width:28px;
                     min-height:28px;
@@ -425,145 +409,116 @@ const isApproval = (item) => item.tax_status == '0'
                     border-radius: 2px;
                     border: 1px solid #dcdfe6;
                     overflow:hidden
-                  " 
-                  @click="showImagePreview({ images:[item.good_img], closeable: true  })"
-                  :src="item.good_img"
-                />
+                  " @click="showImagePreview({ images:[item.good_img], closeable: true  })" :src="item.good_img" />
                 <p class="font-[16px] font-700 py-[5px]">{{ item.good_name }}</p>
-             </div>
-             
-            <div class="flex flex-col color-[#34495e] font-500" style="font-size: 13px">
-              <div class="flex">
-                <p  class="w-[65px] text-right pr-[5px]">审核状态:</p>
-                <p>{{ tabList.find(({ value }) => item.tax_status == value)?.label || '--' }}</p>
-              </div>
-
-              <div class="flex">
-                <p class="w-[65px]  text-right pr-[5px]">SKU编号:</p>
-                <p>{{ item.spuCode }}</p>
               </div>
 
-              <template v-if="item.tax_status != 1">
+              <div class="flex flex-col color-[#34495e] font-500" style="font-size: 13px">
                 <div class="flex">
-                  <p class="w-[65px]  text-right pr-[5px]">类目编码:</p>
-                  <p>{{ item.in_info.merge_code }}</p>
+                  <p class="w-[65px] text-right pr-[5px]">审核状态:</p>
+                  <p>{{ tabList.find(({ value }) => item.tax_status == value)?.label || '--' }}</p>
                 </div>
 
                 <div class="flex">
-                  <p  class="w-[65px]  text-right pr-[5px]">类目名称:</p>
-                  <p>{{ item.in_info.cat_name }}</p>
+                  <p class="w-[65px]  text-right pr-[5px]">SKU编号:</p>
+                  <p>{{ item.spuCode }}</p>
                 </div>
-              </template>
 
+                <template v-if="item.tax_status != 1">
+                  <div class="flex">
+                    <p class="w-[65px]  text-right pr-[5px]">类目编码:</p>
+                    <p>{{ item.in_info.merge_code }}</p>
+                  </div>
+
+                  <div class="flex">
+                    <p class="w-[65px]  text-right pr-[5px]">类目名称:</p>
+                    <p>{{ item.in_info.cat_name }}</p>
+                  </div>
+                </template>
+
+
+                <template v-else>
+                  <div class="flex">
+                    <p class="w-[65px]  text-right pr-[5px]">类目编码:</p>
+                    <p>{{ item.out_info.merge_code }}</p>
+                  </div>
+
+                  <div class="flex">
+                    <p class="w-[65px]  text-right pr-[5px]">类目名称:</p>
+                    <p>{{ item.out_info.cat_name }}</p>
+                  </div>
+
+                  <div class="flex">
+                    <p class="w-[65px]  text-right pr-[5px]">销项税率:</p>
+                    <p>{{ String( item.out_tax).includes('%') ? item.out_tax : item.out_tax + '%' }}</p>
+                  </div>
+                </template>
 
-              <template v-else>
-                <div class="flex">
-                  <p class="w-[65px]  text-right pr-[5px]">类目编码:</p>
-                  <p>{{ item.out_info.merge_code }}</p>
-                </div>
 
                 <div class="flex">
-                  <p  class="w-[65px]  text-right pr-[5px]">类目名称:</p>
-                  <p>{{ item.out_info.cat_name }}</p>
+                  <p class="w-[65px] text-right pr-[5px]">工艺材质:</p>
+                  <p>{{ item.cost_desc }}</p>
                 </div>
 
-                <div class="flex">
-                  <p  class="w-[65px]  text-right pr-[5px]">销项税率:</p>
-                  <p>{{ String( item.out_tax).includes('%') ? item.out_tax : item.out_tax + '%' }}</p>
+
+                <div class="flex" v-if="item.tax_status == '2'">
+                  <p class="w-[65px] text-right pr-[5px]">驳回原因:</p>
+                  <p>{{ item.tax_exam_remark }}</p>
                 </div>
-              </template>
 
 
-              <div class="flex">
-                <p  class="w-[65px] text-right pr-[5px]">工艺材质:</p>
-                <p>{{ item.cost_desc }}</p>
-              </div>
 
-           
-
-              <div v-if="isApproval(item)">
-                <p  class="w-[65px] text-right pr-[5px]" style="white-space: nowrap;line-height: 25px">审核结果: </p>
-                <div class="flex ml-[10px] float-right mt-[-25px]" >
-                  <Button
-                    round
-                    class="mr-[10px] px-[15px] h-[25px]"
-                    type="warning" 
-                    plain  
-                    @click="visible = true; currentItem = item"
-                    size="small"
-                  >审核不通过</Button>
-                   <!-- @click="handleOkStatus" -->
-                  <Button
-                    class="px-[15px] h-[25px]"
-                    round
-                    type="warning"
-                    size="small"
-                    @click="handleSubmit(item)"
-                  >提交审核结果</Button>
+                <div v-if="isApproval(item)">
+                  <p class="w-[65px] text-right pr-[5px]" style="white-space: nowrap;line-height: 25px">审核结果: </p>
+                  <div class="flex ml-[10px] float-right mt-[-25px]">
+                    <Button round class="mr-[10px] px-[15px] h-[25px]" type="warning" plain
+                      @click="visible = true; currentItem = item" size="small">审核不通过</Button>
+                    <!-- @click="handleOkStatus" -->
+                    <Button class="px-[15px] h-[25px]" round type="warning" size="small"
+                      @click="handleSubmit(item)">提交审核结果</Button>
+                  </div>
                 </div>
               </div>
-             </div>
-           </div>
-         </div>
+            </div>
+          </div>
         </div>
-       </div>
+      </div>
 
-       <BackTop />
+      <BackTop />
     </List>
 
     <Dialog v-model:show="visible" title="驳回原因" @close="remark = ''">
-      <Field
-        v-model="remark"
-        placeholder="驳回原因"
-        type="textarea"
-        rows="3" 
-      />
+      <Field v-model="remark" placeholder="驳回原因" type="textarea" rows="3" />
 
       <template #footer>
         <div class="flex">
-          <Button 
-            class="flex-1" 
-            @click="visible = false; remark = ''"
-            style="border-radius: 0px"
-          >取消</Button>
-          
-          
-          <Button 
-            class="flex-1" 
-            type="warning" 
-            @click="handleNoStatus" 
-            style="border-radius: 0px"
-          >提交</Button>
+          <Button class="flex-1" @click="visible = false; remark = ''" style="border-radius: 0px">取消</Button>
+
+
+          <Button class="flex-1" type="warning" @click="handleNoStatus" style="border-radius: 0px">提交</Button>
         </div>
       </template>
     </Dialog>
 
-    <Dialog 
-      v-model:show="approvalVisible" 
-      title="提交审核结果"
-      :closeOnClickOverlay="true"
-      @close="handleClose"
-    >
+    <Dialog v-model:show="approvalVisible" title="提交审核结果" :closeOnClickOverlay="true" @close="handleClose">
 
 
-    <div class="w-full flex justify-center my-[10px]" v-if="state.approvalLoading">
-      <Loading size="24px" color="#ed6a0c" vertical>加载中...</Loading>
-    </div>
+      <div class="w-full flex justify-center my-[10px]" v-if="state.approvalLoading">
+        <Loading size="24px" color="#ed6a0c" vertical>加载中...</Loading>
+      </div>
 
-      <div  v-else class="flex flex-col ml-[10px] p-[10px]" style="line-height:22px">
-         <div class="color-[#0f0f0f] flex items-start">
-            <Image 
-              style="height:28px;width:28px;min-height:28px;min-width:28px;margin-right: 10px;border-radius:2px;border:1px solid #dcdfe6;overflow:hidden" 
-              @click="showImagePreview([currentItem.good_img])"
-              :src="currentItem.good_img"
-            />
+      <div v-else class="flex flex-col ml-[10px] p-[10px]" style="line-height:22px">
+        <div class="color-[#0f0f0f] flex items-start">
+          <Image
+            style="height:28px;width:28px;min-height:28px;min-width:28px;margin-right: 10px;border-radius:2px;border:1px solid #dcdfe6;overflow:hidden"
+            @click="showImagePreview([currentItem.good_img])" :src="currentItem.good_img" />
+
+          <p class="font-[16px] font-700 py-[5px]">{{ currentItem.good_name }}</p>
+        </div>
 
-            <p class="font-[16px] font-700 py-[5px]">{{ currentItem.good_name }}</p>
-         </div>
-         
         <div class="flex flex-col color-[#34495e] font-500" style="font-size: 13px">
           <div class="flex">
-            <p  class="w-[85px] text-right pr-[5px]">审核状态:</p>
+            <p class="w-[85px] text-right pr-[5px]">审核状态:</p>
             <p>{{ tabList.find(({ value }) => currentItem.tax_status == value)?.label || '--' }}</p>
           </div>
 
@@ -573,65 +528,47 @@ const isApproval = (item) => item.tax_status == '0'
           </div>
 
           <div class="flex">
-            <p  class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk ? '类目编码:' : '预计类目编码:' }}</p>
+            <p class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk ? '类目编码:' : '预计类目编码:' }}</p>
             <p>{{ currentItem.in_info.merge_code }}</p>
           </div>
 
           <div class="flex">
-            <p  class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk  ? '类目名称:' : '预计类目名称:' }}</p>
+            <p class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk ? '类目名称:' : '预计类目名称:' }}</p>
             <p>{{ currentItem.in_info.cat_name }}</p>
           </div>
 
-          <div class="flex"  v-if="currentItem.isLegalerOk">
-            <p  class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk  ? '进项税率:' : '预计进项税率:' }}</p>
+          <div class="flex" v-if="currentItem.isLegalerOk">
+            <p class="w-[85px]  text-right pr-[5px]">{{ currentItem.isOk ? '进项税率:' : '预计进项税率:' }}</p>
             <p>{{ currentItem.tax }}%</p>
           </div>
 
           <div class="flex">
-            <p  class="w-[85px]  text-right pr-[5px]">工艺材质:</p>
+            <p class="w-[85px]  text-right pr-[5px]">工艺材质:</p>
             <p>{{ currentItem.cost_desc }}</p>
           </div>
 
           <p class="text-center w-full my-[10px] color-red" v-if="!currentItem.isOk">当前业务公司销项没有该类目,请驳回</p>
 
-          <p class="text-center w-full flex"  v-if="!currentItem.isLegalerOk && currentItem.isOk">
-            <p class="w-[125px] text-right pr-[5px]">销项税率:</p>
-            <Field 
-              v-model="currentItem.tax" 
-              is-link readonly 
-              placeholder="点击选择税率" 
-              style="padding: 0"  
-              @click="state.showPicker = true"
-              />
+          <p class="text-center w-full flex" v-if="!currentItem.isLegalerOk && currentItem.isOk">
+          <p class="w-[125px] text-right pr-[5px]">销项税率:</p>
+          <Field v-model="currentItem.tax" is-link readonly placeholder="点击选择税率" style="padding: 0"
+            @click="state.showPicker = true" />
           </p>
-         </div>
-       </div>
-
-       <template #footer>
-          <div class="flex" v-if="!state.approvalLoading">
-            <Button
-              class="flex-1" 
-              @click="handleApprovalResult"
-              style="border-radius: 0px"
-            >驳回</Button>
-            
-            <Button 
-              v-if="currentItem.isOk"
-              style="border-radius: 0px"
-              @click="handleOkStatus"
-              class="flex-1" 
-              type="warning" 
-            >通过</Button>
-          </div>
-       </template>
+        </div>
+      </div>
+
+      <template #footer>
+        <div class="flex" v-if="!state.approvalLoading">
+          <Button class="flex-1" @click="handleApprovalResult" style="border-radius: 0px">驳回</Button>
+
+          <Button v-if="currentItem.isOk" style="border-radius: 0px" @click="handleOkStatus" class="flex-1"
+            type="warning">通过</Button>
+        </div>
+      </template>
     </Dialog>
 
     <Popup v-model:show="state.showPicker" title="选择销项税率" round position="bottom">
-      <Picker 
-        :columns="state.taxs"
-        @cancel="state.showPicker = false"
-        @confirm="handlePickerConfirm"
-      />
+      <Picker :columns="state.taxs" @cancel="state.showPicker = false" @confirm="handlePickerConfirm" />
     </Popup>
   </div>
 </template>

+ 1 - 1
src/router/index.ts

@@ -19,7 +19,7 @@ router.beforeEach((to, from, next) => {
     NProgress.start();
   }
 
-  if(to.path !== '/login' && !getAuthToken()){
+  if (to.path !== '/login' && to.path !== '/accept' && !getAuthToken()){
     next('/login')
   }else{
     next()

+ 5 - 0
src/router/routes/modules/home.ts

@@ -15,6 +15,11 @@ const home = [
     name: "CostDetail",
     component: () => import("~/pages/home/cost-detail.vue"),
   },
+  {
+    path: "/accept",
+    name: "accept",
+    component: () => import("~/pages/accept/index.vue"),
+  },
 ];
 
 export default home;

+ 5 - 0
src/service/modules/login/index.ts

@@ -6,3 +6,8 @@ enum UserAPI { login = "/admin/login" }
 export const login = (data: any) => {
   return service.post<any>({ url: oldApi +  UserAPI.login, data });
 };
+
+
+export const getUserInfo = (data: any) => {
+  return service.post<any>({ url: oldApi + '/admin/userinfo', data });
+};

+ 9 - 297
types/auto-imports.d.ts

@@ -75,6 +75,7 @@ declare global {
   const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
   const onUnmounted: typeof import('vue')['onUnmounted']
   const onUpdated: typeof import('vue')['onUpdated']
+  const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
   const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
   const provide: typeof import('vue')['provide']
   const provideLocal: typeof import('@vueuse/core')['provideLocal']
@@ -187,6 +188,7 @@ declare global {
   const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
   const useHead: typeof import('@vueuse/head')['useHead']
   const useI18n: typeof import('vue-i18n')['useI18n']
+  const useId: typeof import('vue')['useId']
   const useIdle: typeof import('@vueuse/core')['useIdle']
   const useImage: typeof import('@vueuse/core')['useImage']
   const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
@@ -203,6 +205,7 @@ declare global {
   const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
   const useMemoize: typeof import('@vueuse/core')['useMemoize']
   const useMemory: typeof import('@vueuse/core')['useMemory']
+  const useModel: typeof import('vue')['useModel']
   const useMounted: typeof import('@vueuse/core')['useMounted']
   const useMouse: typeof import('@vueuse/core')['useMouse']
   const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
@@ -251,6 +254,7 @@ declare global {
   const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
   const useSupported: typeof import('@vueuse/core')['useSupported']
   const useSwipe: typeof import('@vueuse/core')['useSwipe']
+  const useTemplateRef: typeof import('vue')['useTemplateRef']
   const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
   const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
   const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
@@ -302,7 +306,7 @@ declare global {
 // for type re-export
 declare global {
   // @ts-ignore
-  export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
+  export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
   import('vue')
 }
 // for vue template auto import
@@ -378,6 +382,7 @@ declare module 'vue' {
     readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']>
     readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
+    readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
     readonly provide: UnwrapRef<typeof import('vue')['provide']>
     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']>
@@ -490,6 +495,7 @@ declare module 'vue' {
     readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']>
     readonly useHead: UnwrapRef<typeof import('@vueuse/head')['useHead']>
     readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
+    readonly useId: UnwrapRef<typeof import('vue')['useId']>
     readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']>
     readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']>
     readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']>
@@ -506,6 +512,7 @@ declare module 'vue' {
     readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']>
     readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']>
     readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']>
+    readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
     readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']>
     readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']>
     readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']>
@@ -554,302 +561,7 @@ declare module 'vue' {
     readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']>
     readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']>
     readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']>
-    readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']>
-    readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']>
-    readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']>
-    readonly useTextareaAutosize: UnwrapRef<typeof import('@vueuse/core')['useTextareaAutosize']>
-    readonly useThrottle: UnwrapRef<typeof import('@vueuse/core')['useThrottle']>
-    readonly useThrottleFn: UnwrapRef<typeof import('@vueuse/core')['useThrottleFn']>
-    readonly useThrottledRefHistory: UnwrapRef<typeof import('@vueuse/core')['useThrottledRefHistory']>
-    readonly useTimeAgo: UnwrapRef<typeof import('@vueuse/core')['useTimeAgo']>
-    readonly useTimeout: UnwrapRef<typeof import('@vueuse/core')['useTimeout']>
-    readonly useTimeoutFn: UnwrapRef<typeof import('@vueuse/core')['useTimeoutFn']>
-    readonly useTimeoutPoll: UnwrapRef<typeof import('@vueuse/core')['useTimeoutPoll']>
-    readonly useTimestamp: UnwrapRef<typeof import('@vueuse/core')['useTimestamp']>
-    readonly useTitle: UnwrapRef<typeof import('@vueuse/core')['useTitle']>
-    readonly useToNumber: UnwrapRef<typeof import('@vueuse/core')['useToNumber']>
-    readonly useToString: UnwrapRef<typeof import('@vueuse/core')['useToString']>
-    readonly useToggle: UnwrapRef<typeof import('@vueuse/core')['useToggle']>
-    readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']>
-    readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']>
-    readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']>
-    readonly useVModel: UnwrapRef<typeof import('@vueuse/core')['useVModel']>
-    readonly useVModels: UnwrapRef<typeof import('@vueuse/core')['useVModels']>
-    readonly useVibrate: UnwrapRef<typeof import('@vueuse/core')['useVibrate']>
-    readonly useVirtualList: UnwrapRef<typeof import('@vueuse/core')['useVirtualList']>
-    readonly useWakeLock: UnwrapRef<typeof import('@vueuse/core')['useWakeLock']>
-    readonly useWebNotification: UnwrapRef<typeof import('@vueuse/core')['useWebNotification']>
-    readonly useWebSocket: UnwrapRef<typeof import('@vueuse/core')['useWebSocket']>
-    readonly useWebWorker: UnwrapRef<typeof import('@vueuse/core')['useWebWorker']>
-    readonly useWebWorkerFn: UnwrapRef<typeof import('@vueuse/core')['useWebWorkerFn']>
-    readonly useWindowFocus: UnwrapRef<typeof import('@vueuse/core')['useWindowFocus']>
-    readonly useWindowScroll: UnwrapRef<typeof import('@vueuse/core')['useWindowScroll']>
-    readonly useWindowSize: UnwrapRef<typeof import('@vueuse/core')['useWindowSize']>
-    readonly watch: UnwrapRef<typeof import('vue')['watch']>
-    readonly watchArray: UnwrapRef<typeof import('@vueuse/core')['watchArray']>
-    readonly watchAtMost: UnwrapRef<typeof import('@vueuse/core')['watchAtMost']>
-    readonly watchDebounced: UnwrapRef<typeof import('@vueuse/core')['watchDebounced']>
-    readonly watchDeep: UnwrapRef<typeof import('@vueuse/core')['watchDeep']>
-    readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>
-    readonly watchIgnorable: UnwrapRef<typeof import('@vueuse/core')['watchIgnorable']>
-    readonly watchImmediate: UnwrapRef<typeof import('@vueuse/core')['watchImmediate']>
-    readonly watchOnce: UnwrapRef<typeof import('@vueuse/core')['watchOnce']>
-    readonly watchPausable: UnwrapRef<typeof import('@vueuse/core')['watchPausable']>
-    readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']>
-    readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']>
-    readonly watchThrottled: UnwrapRef<typeof import('@vueuse/core')['watchThrottled']>
-    readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']>
-    readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']>
-    readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']>
-  }
-}
-declare module '@vue/runtime-core' {
-  interface GlobalComponents {}
-  interface ComponentCustomProperties {
-    readonly $$: UnwrapRef<typeof import('vue/macros')['$$']>
-    readonly $: UnwrapRef<typeof import('vue/macros')['$']>
-    readonly $computed: UnwrapRef<typeof import('vue/macros')['$computed']>
-    readonly $customRef: UnwrapRef<typeof import('vue/macros')['$customRef']>
-    readonly $ref: UnwrapRef<typeof import('vue/macros')['$ref']>
-    readonly $shallowRef: UnwrapRef<typeof import('vue/macros')['$shallowRef']>
-    readonly $toRef: UnwrapRef<typeof import('vue/macros')['$toRef']>
-    readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
-    readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
-    readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
-    readonly computed: UnwrapRef<typeof import('vue')['computed']>
-    readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
-    readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
-    readonly computedInject: UnwrapRef<typeof import('@vueuse/core')['computedInject']>
-    readonly computedWithControl: UnwrapRef<typeof import('@vueuse/core')['computedWithControl']>
-    readonly controlledComputed: UnwrapRef<typeof import('@vueuse/core')['controlledComputed']>
-    readonly controlledRef: UnwrapRef<typeof import('@vueuse/core')['controlledRef']>
-    readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
-    readonly createEventHook: UnwrapRef<typeof import('@vueuse/core')['createEventHook']>
-    readonly createGlobalState: UnwrapRef<typeof import('@vueuse/core')['createGlobalState']>
-    readonly createInjectionState: UnwrapRef<typeof import('@vueuse/core')['createInjectionState']>
-    readonly createReactiveFn: UnwrapRef<typeof import('@vueuse/core')['createReactiveFn']>
-    readonly createReusableTemplate: UnwrapRef<typeof import('@vueuse/core')['createReusableTemplate']>
-    readonly createSharedComposable: UnwrapRef<typeof import('@vueuse/core')['createSharedComposable']>
-    readonly createTemplatePromise: UnwrapRef<typeof import('@vueuse/core')['createTemplatePromise']>
-    readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']>
-    readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
-    readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']>
-    readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
-    readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
-    readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
-    readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
-    readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
-    readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']>
-    readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
-    readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
-    readonly h: UnwrapRef<typeof import('vue')['h']>
-    readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']>
-    readonly inject: UnwrapRef<typeof import('vue')['inject']>
-    readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']>
-    readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']>
-    readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']>
-    readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
-    readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
-    readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
-    readonly languagesNameList: UnwrapRef<typeof import('../src/composables/langugage')['languagesNameList']>
-    readonly makeDestructurable: UnwrapRef<typeof import('@vueuse/core')['makeDestructurable']>
-    readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
-    readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
-    readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
-    readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
-    readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']>
-    readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']>
-    readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
-    readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
-    readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
-    readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
-    readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
-    readonly onKeyStroke: UnwrapRef<typeof import('@vueuse/core')['onKeyStroke']>
-    readonly onLongPress: UnwrapRef<typeof import('@vueuse/core')['onLongPress']>
-    readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']>
-    readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']>
-    readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']>
-    readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']>
-    readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']>
-    readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']>
-    readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
-    readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
-    readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
-    readonly provide: UnwrapRef<typeof import('vue')['provide']>
-    readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']>
-    readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']>
-    readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']>
-    readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
-    readonly reactiveComputed: UnwrapRef<typeof import('@vueuse/core')['reactiveComputed']>
-    readonly reactiveOmit: UnwrapRef<typeof import('@vueuse/core')['reactiveOmit']>
-    readonly reactivePick: UnwrapRef<typeof import('@vueuse/core')['reactivePick']>
-    readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
-    readonly ref: UnwrapRef<typeof import('vue')['ref']>
-    readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
-    readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
-    readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
-    readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
-    readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
-    readonly registerStore: UnwrapRef<typeof import('../src/store/index')['registerStore']>
-    readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
-    readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
-    readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
-    readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
-    readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
-    readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
-    readonly store: UnwrapRef<typeof import('../src/store/index')['default']>
-    readonly syncRef: UnwrapRef<typeof import('@vueuse/core')['syncRef']>
-    readonly syncRefs: UnwrapRef<typeof import('@vueuse/core')['syncRefs']>
-    readonly templateRef: UnwrapRef<typeof import('@vueuse/core')['templateRef']>
-    readonly throttledRef: UnwrapRef<typeof import('@vueuse/core')['throttledRef']>
-    readonly throttledWatch: UnwrapRef<typeof import('@vueuse/core')['throttledWatch']>
-    readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']>
-    readonly toReactive: UnwrapRef<typeof import('@vueuse/core')['toReactive']>
-    readonly toRef: UnwrapRef<typeof import('vue')['toRef']>
-    readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']>
-    readonly toValue: UnwrapRef<typeof import('vue')['toValue']>
-    readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
-    readonly tryOnBeforeMount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeMount']>
-    readonly tryOnBeforeUnmount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeUnmount']>
-    readonly tryOnMounted: UnwrapRef<typeof import('@vueuse/core')['tryOnMounted']>
-    readonly tryOnScopeDispose: UnwrapRef<typeof import('@vueuse/core')['tryOnScopeDispose']>
-    readonly tryOnUnmounted: UnwrapRef<typeof import('@vueuse/core')['tryOnUnmounted']>
-    readonly unref: UnwrapRef<typeof import('vue')['unref']>
-    readonly unrefElement: UnwrapRef<typeof import('@vueuse/core')['unrefElement']>
-    readonly until: UnwrapRef<typeof import('@vueuse/core')['until']>
-    readonly useActiveElement: UnwrapRef<typeof import('@vueuse/core')['useActiveElement']>
-    readonly useAnimate: UnwrapRef<typeof import('@vueuse/core')['useAnimate']>
-    readonly useArrayDifference: UnwrapRef<typeof import('@vueuse/core')['useArrayDifference']>
-    readonly useArrayEvery: UnwrapRef<typeof import('@vueuse/core')['useArrayEvery']>
-    readonly useArrayFilter: UnwrapRef<typeof import('@vueuse/core')['useArrayFilter']>
-    readonly useArrayFind: UnwrapRef<typeof import('@vueuse/core')['useArrayFind']>
-    readonly useArrayFindIndex: UnwrapRef<typeof import('@vueuse/core')['useArrayFindIndex']>
-    readonly useArrayFindLast: UnwrapRef<typeof import('@vueuse/core')['useArrayFindLast']>
-    readonly useArrayIncludes: UnwrapRef<typeof import('@vueuse/core')['useArrayIncludes']>
-    readonly useArrayJoin: UnwrapRef<typeof import('@vueuse/core')['useArrayJoin']>
-    readonly useArrayMap: UnwrapRef<typeof import('@vueuse/core')['useArrayMap']>
-    readonly useArrayReduce: UnwrapRef<typeof import('@vueuse/core')['useArrayReduce']>
-    readonly useArraySome: UnwrapRef<typeof import('@vueuse/core')['useArraySome']>
-    readonly useArrayUnique: UnwrapRef<typeof import('@vueuse/core')['useArrayUnique']>
-    readonly useAsyncQueue: UnwrapRef<typeof import('@vueuse/core')['useAsyncQueue']>
-    readonly useAsyncState: UnwrapRef<typeof import('@vueuse/core')['useAsyncState']>
-    readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
-    readonly useBase64: UnwrapRef<typeof import('@vueuse/core')['useBase64']>
-    readonly useBattery: UnwrapRef<typeof import('@vueuse/core')['useBattery']>
-    readonly useBluetooth: UnwrapRef<typeof import('@vueuse/core')['useBluetooth']>
-    readonly useBreakpoints: UnwrapRef<typeof import('@vueuse/core')['useBreakpoints']>
-    readonly useBroadcastChannel: UnwrapRef<typeof import('@vueuse/core')['useBroadcastChannel']>
-    readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']>
-    readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']>
-    readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']>
-    readonly useClipboardItems: UnwrapRef<typeof import('@vueuse/core')['useClipboardItems']>
-    readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']>
-    readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']>
-    readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']>
-    readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']>
-    readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
-    readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']>
-    readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
-    readonly useCurrentElement: UnwrapRef<typeof import('@vueuse/core')['useCurrentElement']>
-    readonly useCycleList: UnwrapRef<typeof import('@vueuse/core')['useCycleList']>
-    readonly useDark: UnwrapRef<typeof import('@vueuse/core')['useDark']>
-    readonly useDateFormat: UnwrapRef<typeof import('@vueuse/core')['useDateFormat']>
-    readonly useDebounce: UnwrapRef<typeof import('@vueuse/core')['useDebounce']>
-    readonly useDebounceFn: UnwrapRef<typeof import('@vueuse/core')['useDebounceFn']>
-    readonly useDebouncedRefHistory: UnwrapRef<typeof import('@vueuse/core')['useDebouncedRefHistory']>
-    readonly useDeviceMotion: UnwrapRef<typeof import('@vueuse/core')['useDeviceMotion']>
-    readonly useDeviceOrientation: UnwrapRef<typeof import('@vueuse/core')['useDeviceOrientation']>
-    readonly useDevicePixelRatio: UnwrapRef<typeof import('@vueuse/core')['useDevicePixelRatio']>
-    readonly useDevicesList: UnwrapRef<typeof import('@vueuse/core')['useDevicesList']>
-    readonly useDisplayMedia: UnwrapRef<typeof import('@vueuse/core')['useDisplayMedia']>
-    readonly useDocumentVisibility: UnwrapRef<typeof import('@vueuse/core')['useDocumentVisibility']>
-    readonly useDraggable: UnwrapRef<typeof import('@vueuse/core')['useDraggable']>
-    readonly useDropZone: UnwrapRef<typeof import('@vueuse/core')['useDropZone']>
-    readonly useElementBounding: UnwrapRef<typeof import('@vueuse/core')['useElementBounding']>
-    readonly useElementByPoint: UnwrapRef<typeof import('@vueuse/core')['useElementByPoint']>
-    readonly useElementHover: UnwrapRef<typeof import('@vueuse/core')['useElementHover']>
-    readonly useElementSize: UnwrapRef<typeof import('@vueuse/core')['useElementSize']>
-    readonly useElementVisibility: UnwrapRef<typeof import('@vueuse/core')['useElementVisibility']>
-    readonly useEventBus: UnwrapRef<typeof import('@vueuse/core')['useEventBus']>
-    readonly useEventListener: UnwrapRef<typeof import('@vueuse/core')['useEventListener']>
-    readonly useEventSource: UnwrapRef<typeof import('@vueuse/core')['useEventSource']>
-    readonly useEyeDropper: UnwrapRef<typeof import('@vueuse/core')['useEyeDropper']>
-    readonly useFavicon: UnwrapRef<typeof import('@vueuse/core')['useFavicon']>
-    readonly useFetch: UnwrapRef<typeof import('@vueuse/core')['useFetch']>
-    readonly useFileDialog: UnwrapRef<typeof import('@vueuse/core')['useFileDialog']>
-    readonly useFileSystemAccess: UnwrapRef<typeof import('@vueuse/core')['useFileSystemAccess']>
-    readonly useFocus: UnwrapRef<typeof import('@vueuse/core')['useFocus']>
-    readonly useFocusWithin: UnwrapRef<typeof import('@vueuse/core')['useFocusWithin']>
-    readonly useFps: UnwrapRef<typeof import('@vueuse/core')['useFps']>
-    readonly useFullscreen: UnwrapRef<typeof import('@vueuse/core')['useFullscreen']>
-    readonly useGamepad: UnwrapRef<typeof import('@vueuse/core')['useGamepad']>
-    readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']>
-    readonly useHead: UnwrapRef<typeof import('@vueuse/head')['useHead']>
-    readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
-    readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']>
-    readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']>
-    readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']>
-    readonly useIntersectionObserver: UnwrapRef<typeof import('@vueuse/core')['useIntersectionObserver']>
-    readonly useInterval: UnwrapRef<typeof import('@vueuse/core')['useInterval']>
-    readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
-    readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
-    readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
-    readonly useLink: UnwrapRef<typeof import('vue-router')['useLink']>
-    readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
-    readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']>
-    readonly useManualRefHistory: UnwrapRef<typeof import('@vueuse/core')['useManualRefHistory']>
-    readonly useMediaControls: UnwrapRef<typeof import('@vueuse/core')['useMediaControls']>
-    readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']>
-    readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']>
-    readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']>
-    readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']>
-    readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']>
-    readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']>
-    readonly useMousePressed: UnwrapRef<typeof import('@vueuse/core')['useMousePressed']>
-    readonly useMutationObserver: UnwrapRef<typeof import('@vueuse/core')['useMutationObserver']>
-    readonly useNavigatorLanguage: UnwrapRef<typeof import('@vueuse/core')['useNavigatorLanguage']>
-    readonly useNetwork: UnwrapRef<typeof import('@vueuse/core')['useNetwork']>
-    readonly useNow: UnwrapRef<typeof import('@vueuse/core')['useNow']>
-    readonly useObjectUrl: UnwrapRef<typeof import('@vueuse/core')['useObjectUrl']>
-    readonly useOffsetPagination: UnwrapRef<typeof import('@vueuse/core')['useOffsetPagination']>
-    readonly useOnline: UnwrapRef<typeof import('@vueuse/core')['useOnline']>
-    readonly usePageLeave: UnwrapRef<typeof import('@vueuse/core')['usePageLeave']>
-    readonly useParallax: UnwrapRef<typeof import('@vueuse/core')['useParallax']>
-    readonly useParentElement: UnwrapRef<typeof import('@vueuse/core')['useParentElement']>
-    readonly usePerformanceObserver: UnwrapRef<typeof import('@vueuse/core')['usePerformanceObserver']>
-    readonly usePermission: UnwrapRef<typeof import('@vueuse/core')['usePermission']>
-    readonly usePointer: UnwrapRef<typeof import('@vueuse/core')['usePointer']>
-    readonly usePointerLock: UnwrapRef<typeof import('@vueuse/core')['usePointerLock']>
-    readonly usePointerSwipe: UnwrapRef<typeof import('@vueuse/core')['usePointerSwipe']>
-    readonly usePreferredColorScheme: UnwrapRef<typeof import('@vueuse/core')['usePreferredColorScheme']>
-    readonly usePreferredContrast: UnwrapRef<typeof import('@vueuse/core')['usePreferredContrast']>
-    readonly usePreferredDark: UnwrapRef<typeof import('@vueuse/core')['usePreferredDark']>
-    readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']>
-    readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
-    readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']>
-    readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
-    readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
-    readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
-    readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
-    readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
-    readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
-    readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
-    readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
-    readonly useScroll: UnwrapRef<typeof import('@vueuse/core')['useScroll']>
-    readonly useScrollLock: UnwrapRef<typeof import('@vueuse/core')['useScrollLock']>
-    readonly useSeoMeta: UnwrapRef<typeof import('@vueuse/head')['useSeoMeta']>
-    readonly useSessionStorage: UnwrapRef<typeof import('@vueuse/core')['useSessionStorage']>
-    readonly useShare: UnwrapRef<typeof import('@vueuse/core')['useShare']>
-    readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
-    readonly useSorted: UnwrapRef<typeof import('@vueuse/core')['useSorted']>
-    readonly useSpeechRecognition: UnwrapRef<typeof import('@vueuse/core')['useSpeechRecognition']>
-    readonly useSpeechSynthesis: UnwrapRef<typeof import('@vueuse/core')['useSpeechSynthesis']>
-    readonly useStepper: UnwrapRef<typeof import('@vueuse/core')['useStepper']>
-    readonly useStorage: UnwrapRef<typeof import('@vueuse/core')['useStorage']>
-    readonly useStorageAsync: UnwrapRef<typeof import('@vueuse/core')['useStorageAsync']>
-    readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']>
-    readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']>
-    readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']>
+    readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
     readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']>
     readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']>
     readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']>

Vissa filer visades inte eftersom för många filer har ändrats