Parcourir la source

添加queentree黑色主题

liwei il y a 1 an
Parent
commit
dccfe65839

+ 1 - 1
package.json

@@ -53,7 +53,7 @@
     "lodash": "^4.17.21",
     "moment": "^2.29.4",
     "nanoid": "^4.0.2",
-    "nats.ws": "^1.12.0",
+    "nats.ws": "^1.15.0",
     "proto.gl": "^1.0.0",
     "queen3d": "^0.0.80",
     "queenjs": "^1.0.0-beta.72",

+ 168 - 0
src/controllers/natsController.ts

@@ -0,0 +1,168 @@
+import { queenApi } from "queenjs";
+import { connect, StringCodec, Empty, ErrorCode } from "nats.ws";
+
+export class BusController {
+  _params = new URLSearchParams(decodeURIComponent(location.search));
+
+  _conn: any;
+  _isConned = false;
+  _startInit = false;
+
+  getQuery(name: string): string {
+    return this._params.get(name) as string;
+  }
+
+  async init(host?: string) {
+    if (this._startInit) return;
+    this._startInit = true;
+    
+    queenApi.showLoading("服务连接中...");
+    const wsHost = host ? host : this.getQuery("host");
+
+    console.log("ws host=>", wsHost)
+    
+    let ret = false;
+    try {
+      this._conn = await connect({ servers: wsHost });
+      this._isConned = !!this._conn;
+
+      ret = true;
+    } catch (error) {
+      console.log(error);
+      queenApi.messageError("连接失败!");
+    }
+    queenApi.hideLoading();
+    this._startInit = false;
+
+    return ret;
+  }
+
+  async subscribe(subject: string, callback: any) {
+    if (!this._isConned) {
+      await this.init();
+    }
+
+    if (!this._isConned) {
+      console.error("建立连接失败");
+      return;
+    }
+
+    const sc = StringCodec();
+    const sub = this._conn.subscribe(subject);
+    console.log(sub);
+
+    (async () => {
+      for await (const m of sub) {
+        console.log(sub);
+
+        const ret = sc.decode(m.data);
+        console.log(subject, "=>recieved");
+        try {
+          if (ret) {
+            const msg = JSON.parse(ret);
+            callback(msg);
+          } else {
+            callback(ret);
+          }
+        } catch (error) {
+          console.log(subject, "=>recieved json parse eror", ret);
+          console.log(error);
+        }
+      }
+      console.log(subject, "subscription closed");
+    })();
+    return function () {
+      sub.unsubscribe();
+    };
+  }
+  async requestApi(subject: string, data?: any, timeout?: number) {
+     const ret = await this.request(subject, data, timeout)
+     console.log("request api=>", ret)
+     
+     if (ret.error || (ret.result.ErrorNo && ret.result.ErrorNo != 200) ) {
+       queenApi.messageError(ret.error || ret.result.ErrorDesc );
+       return
+     }
+     try {
+        const retJson = ret.result.Result;
+        if (!retJson) return;
+        if (retJson[0] != '{' && retJson[0] != '[') return retJson;
+        return JSON.parse(retJson)
+     } catch (error) {
+        console.log( ret );
+        console.error(error);
+     }
+  }
+
+  RequestWebView(name: string, data:any) {
+    return new Promise((r)=>{
+      let cancel:any = null;
+      this.subscribe("webview.close."+name, function(payload:any){
+        cancel&&cancel();
+        r(payload)
+      }).then(c=>{
+         cancel = c;
+      })
+      this.requestApi("webview.open", {...data, name})
+    })
+  }
+
+  async request(subject: string, data?: any, timeout?: number) {
+    if (!this._isConned) {
+      await this.init();
+    }
+
+    const ret: { error: string; result: any } = { error: "", result: null };
+    if (!this._isConned) {
+      console.error("建立连接失败");
+      ret.error = "建立连接失败";
+
+      queenApi.showConfirm({
+        title: "数据请求失败",
+        content: "请求数据失败,请重新启动后再试",
+        type: "danger",
+      });
+      return ret;
+    }
+
+    const sc = StringCodec();
+    try {
+      let req = Empty;
+      if (data) {
+        if (typeof data != "string") {
+          req = sc.encode(JSON.stringify(data));
+        } else {
+          req = sc.encode(data);
+        }
+      }
+      const options = { timeout: 5000 };
+      if (timeout) {
+        options.timeout = timeout;
+      }
+      const m = await this._conn.request(subject, req, options);
+      let payload = sc.decode(m.data);
+      try {
+        payload = JSON.parse(payload);
+        console.log("m=>", payload);
+      } catch (error) {
+        console.log(error);
+      }
+      ret.result = payload;
+    } catch (error: any) {
+      console.error(error);
+      ret.error = error.message || "请求" + subject + "出错";
+      if (ret.error == "503") {
+        //NoResponders
+        ret.error = "网路异常,请重新服务";
+      }
+    }
+    return ret;
+  }
+
+  close() {
+    if (!this._isConned) {
+      return;
+    }
+    return this._conn.close();
+  }
+}

+ 19 - 0
src/controllers/queentreeController.ts

@@ -0,0 +1,19 @@
+import { BusController } from "./natsController";
+
+export class  TreeController {
+    _bus: BusController
+    constructor(bus: BusController) {
+        this._bus = bus
+    }
+
+    async selectOneMat() {
+        const bus = this._bus;
+        const route = await bus.requestApi("queentree.local.router", {name:"selmat"})
+        if (!route || !route.Url ) return;
+        const url = route.Url;
+        const payload = {}
+        const ret:any = await bus.RequestWebView("selmat", {dev:true, height: 600, width: 900, payload, url, alwaysOnTop:true,})
+        console.log("selmat=>", ret);
+        return ret.payload;
+    }
+}

+ 7 - 0
src/dict/apis.ts

@@ -4,7 +4,14 @@ const localURL = "http://192.168.110.180:8889";
 const baseVersion = "/cloud/v1";
 const treeVersion = "/tree/v1";
 
+const _params = new URLSearchParams(decodeURIComponent(location.search))
+const base =  _params.get("base") || ""
+const user =  _params.get("user") || ""
+console.log("base=>",base, user);
+
 const Dict_Apis = {
+  authLocal: user,
+  queentreeLocal: base,
   auth: `${baseURL}${baseVersion}/usercenter`,
   queentree: `${baseURL}${treeVersion}/assetcenter`,
   promotion: `${baseURL}${baseVersion}/promotion`,

+ 16 - 16
src/modules/_default/viewerStorage.ts

@@ -7,7 +7,7 @@ import {
 import { nanoid } from "nanoid";
 
 // 设置资源面板Tab页
-QueentreeExplorer_Storage.setVersion("1.0.6");
+QueentreeExplorer_Storage.setVersion("1.0.5");
 QueentreeExplorer_Storage.setDefaultValue(() => {
   const expHosts: { [name: string]: HostRootItem } = {};
 
@@ -34,23 +34,23 @@ QueentreeExplorer_Storage.setDefaultValue(() => {
 
   const myRootNodes = [cloudRootNode];
 
-  // if (Dict_Apis.queentree) {
-  //   const localNodeRoot: NodeRootItem = {
-  //     names: ["本地"],
-  //     ids: [nanoid()],
-  //     nodeType: "host",
-  //     tabPerms: ["rename"],
-  //     nodePerms: ["editable", "saveAs"],
-  //   };
+  if (Dict_Apis.queentreeLocal) {
+    const localNodeRoot: NodeRootItem = {
+      names: ["本地"],
+      ids: [nanoid()],
+      nodeType: "host",
+      tabPerms: ["rename"],
+      nodePerms: ["editable", "saveAs"],
+    };
 
-  //   myRootNodes.unshift(localNodeRoot);
+    myRootNodes.unshift(localNodeRoot);
 
-  //   expHosts[localNodeRoot.ids[0]] = {
-  //     baseURL: Dict_Apis.queentree,
-  //     authURL: Dict_Apis.auth,
-  //     authKey: "queentreesku3d",
-  //   };
-  // }
+    expHosts[localNodeRoot.ids[0]] = {
+      baseURL: Dict_Apis.queentreeLocal,
+      authURL: Dict_Apis.authLocal,
+      authKey: "queentreesku3d",
+    };
+  }
 
   expHosts[cloudRootNode.ids[0]] = {
     baseURL: Dict_Apis.queentree,

+ 3 - 0
src/modules/editor/index.ts

@@ -6,6 +6,7 @@ import config from "./config";
 import { HistoryCtrl } from "./controllers/HistoryCtrl";
 import { store } from "./stores";
 import { helpers } from "./helpers";
+import { BusController } from "@/controllers/natsController";
 
 export class EditorModule extends ModuleRoot {
   config = this.setConfig(config);
@@ -19,7 +20,9 @@ export class EditorModule extends ModuleRoot {
     historyCtrl: new HistoryCtrl(this),
   };
 
+  
   onReady() {
+    debugger
     this.actions.init();
   }
 }

+ 6 - 1
src/modules/resource/index.ts

@@ -6,6 +6,8 @@ import { compoents } from "./components";
 import { helper } from "./helper";
 import { http } from "./http";
 import { store } from "./store";
+import { BusController } from "@/controllers/natsController";
+import { TreeController } from "@/controllers/queentreeController";
 
 export class ResourceModule extends ModuleRoot {
   config = this.setConfig({
@@ -35,6 +37,8 @@ export class ResourceModule extends ModuleRoot {
     materialImageListCtrl: new PageListController(this.config?.httpConfig),
     materialVideoListCtrl: new PageListController(this.config?.httpConfig),
   };
+  natsBus = new BusController();
+  treeController = new TreeController(this.natsBus);
 
   onReady() {
     this.controls.promotionListCtrl.setCrudPrefix("/h5");
@@ -53,7 +57,8 @@ export class ResourceModule extends ModuleRoot {
     this.controls.materialVideoListCtrl.setCrudPrefix("/source")
     this.controls.materialVideoListCtrl.state.size = 18;
     this.controls.materialVideoListCtrl.state.query = {fileType:"video"}
-    
+
+    this.natsBus.init()
   }
 }
 

+ 29 - 0
src/pages/queentree/App.tsx

@@ -0,0 +1,29 @@
+import { queenApi } from "queenjs";
+import { Provider } from "queenjs/adapter/vue";
+import { createApp, defineComponent } from "vue";
+import { Router } from "vue-router";
+import "../../styles/tree";
+
+let setModuleHooks: any[] = [];
+
+const App = defineComponent(() => {
+  setModuleHooks.forEach((hook) => hook());
+  setModuleHooks = [];
+  return () => (
+    <Provider>
+      <router-view></router-view>
+    </Provider>
+  );
+});
+
+export function startApp(
+  router: Router,
+  hooks: any[] = [],
+  callback?: (app: ReturnType<typeof createApp>) => void
+) {
+  setModuleHooks = hooks;
+  queenApi.router = router;
+  const app = createApp(App);
+  callback?.(app);
+  app.use(router).mount("#app");
+}

+ 3 - 0
src/pages/queentree/index.ts

@@ -0,0 +1,3 @@
+import { startApp } from "./App";
+import router from "./router";
+startApp(router, []);

+ 18 - 0
src/pages/queentree/router.ts

@@ -0,0 +1,18 @@
+import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
+const routes: Array<RouteRecordRaw> = [
+  {
+    path: "/",
+    name: "home",
+    // meta: {
+    //   needAuth: true,
+    // },
+    component: () => import("./selectMat"),
+  },
+];
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes,
+});
+
+export default router;

+ 24 - 0
src/pages/queentree/selectMat.tsx

@@ -0,0 +1,24 @@
+import { computed, defineComponent, reactive } from "vue";
+import LibraryModal from "../website/CreateMat/components/LibraryModal";
+import { css, cx } from "@linaria/core";
+
+export default defineComponent({
+  setup() {
+
+
+    return () =>(
+        <div class={rootStyles}>
+            <LibraryModal nodeTypes={["matGroupItem", "mat", "packMat"]} />
+        </div>
+        
+        // <div>hello</div>
+      );
+  },
+});
+
+
+const rootStyles = css`
+  > div {
+    margin: unset !important;
+  }
+`;

+ 12 - 27
src/pages/website/CreateMat/components/LeftPanel.tsx

@@ -47,33 +47,18 @@ export default defineComponent({
     };
 
     const replaceMat = async (record: any) => {
-      // console.error("replace=>", record);
-      const branchFolder = await resource.showModal<AssetItemFile>(
-        <LibraryModal nodeTypes={["matGroupItem", "mat", "packMat"]} />,
-        { width: "900px" }
-      );
-      // console.error("branchFolder: ", branchFolder);
-      const data = await branchFolder.getAssetDetail();
-      // console.error("data: ", data);
-
-      let mat;
-      switch (branchFolder.nodeType) {
-        case "matGroupItem":
-          mat = (data as IQueentree.IAssetMatGroup).source.colorCards.find(
-            (d: PackMat) => d.id == branchFolder.state.id
-          );
-          break;
-        case "packMat":
-          mat = (data.source as Pack["source"]).mats.find(
-            (d: PackMat) => d.id == branchFolder.state.id
-          );
-          break;
-        case "mat":
-          mat = data.source as PackMat;
-          break;
-      }
+     
+      // const branchFolder = await resource.showModal<AssetItemFile>(
+      //   <LibraryModal nodeTypes={["matGroupItem", "mat", "packMat"]} />,
+      //   { width: "900px" }
+      // );
+      // const mat:any = await branchFolder.getAssetDetail();
+      // // console.error("data: ", data);
+      const mat = await resource.treeController.selectOneMat();
+      if (!mat) return;
+
+      console.log("vvv=>", mat);
 
-      if (data && mat) {
         const matConf = resource.store.matSlots.find(
           (item) => item.id == record.id
         );
@@ -83,7 +68,7 @@ export default defineComponent({
           const matSlot = { id: record.id, material: mat };
           resource.store.matSlots.push(matSlot);
         }
-      }
+      
       // console.error("resource.store.matSlots: ", resource.store.matSlots);
 
       const targetComp = getTargetProCom();

+ 5 - 3
src/pages/website/CreateMat/components/LibraryModal.tsx

@@ -17,7 +17,7 @@ export default defineComponent({
 
   setup(props) {
     const stepCtrol = new StepController(1);
-    const modal = useModal();
+    // const modal = useModal();
 
     initQueentreeExplorer({
       config: {
@@ -29,7 +29,7 @@ export default defineComponent({
     async function submit() {
       try {
         const branchFolder = stepCtrol.state.data.pickNodes[0];
-        modal.submit(branchFolder);
+        // modal.submit(branchFolder);
       } catch (error: any) {
         Exception.error(error?.toString());
       }
@@ -40,7 +40,9 @@ export default defineComponent({
       return (
         <PickNodeSteps
           onSubmit={submit}
-          onCancel={() => modal.cancel()}
+          onCancel={() =>{
+            console.log("cancel")
+          }}
           control={stepCtrol}
           lastStepText="发送"
           steps={[

+ 55 - 0
src/styles/tree.less

@@ -0,0 +1,55 @@
+@import "./theme";
+
+html,
+body {
+  color: @inf-text-color;
+  background-color: @inf-layout-bg;
+}
+
+.text-color {
+  color: @inf-text-color;
+}
+.text-sub-color {
+  color: @inf-text-sub-color;
+}
+.text-less-color {
+  color: @inf-text-less-color;
+}
+.primary-color {
+  color: @inf-primary-color;
+}
+.bg-layout {
+  background-color: @inf-layout-bg;
+}
+.bg-component {
+  background-color: @inf-component-bg;
+}
+
+@direction: top, bottom, left, right;
+each(@direction, {
+  .border-@{value} {
+    border-@{value}: 1px solid @inf-border-color;
+  }
+});
+
+.scrollbar {
+  overflow: overlay; // 滚动条不会占用宽度
+  &::-webkit-scrollbar {
+    width: 8px;
+    height: 8px;
+  }
+  &::-webkit-scrollbar-track {
+    background: transparent;
+  }
+  &::-webkit-scrollbar-thumb {
+    background: @inf-primary-bg;
+    border-radius: 8px;
+  }
+  &::-webkit-scrollbar-thumb:hover {
+    background: @inf-primary-hover-bg;
+  }
+}
+
+.ck-powered-by {
+  display: none;
+}

+ 3 - 0
src/styles/tree.ts

@@ -0,0 +1,3 @@
+import "windi.css";
+import "./tree.less";
+

+ 1 - 0
vue.config.js

@@ -17,6 +17,7 @@ module.exports = defineConfig({
   pages: {
     index: "src/pages/website/index.ts",
     editor: "src/pages/editor/index.ts",
+    selmat: "src/pages/queentree/index.ts",
   },
   publicPath: publicPath,
   transpileDependencies: [/ckeditor5-[^/\\]+[/\\]src[/\\].+\.js$/],

+ 4 - 4
yarn.lock

@@ -6051,10 +6051,10 @@ nanopop@^2.1.0:
   resolved "http://124.70.149.18:4873/nanopop/-/nanopop-2.3.0.tgz#a5f672fba27d45d6ecbd0b59789c040072915123"
   integrity sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==
 
-nats.ws@^1.12.0:
-  version "1.14.0"
-  resolved "http://124.70.149.18:4873/nats.ws/-/nats.ws-1.14.0.tgz#b7c07fcf0334f58ff4d0ef4354149393de6691ec"
-  integrity sha512-2s/4v1KWG+JG4I11e301t+0oGBbpjsU/arPhVjrCzPRam83w+m1gqF85xSZgLDIge/S1Do2E0bmka1cUH5Qc/Q==
+nats.ws@^1.15.0:
+  version "1.15.0"
+  resolved "http://124.70.149.18:4873/nats.ws/-/nats.ws-1.15.0.tgz#c3d888131a5b2641bdcaa87825ed9128d7699851"
+  integrity sha512-J6np4qe+rRS3y47wesYZbmKC/ez5JHR50uJ0L5yBI+8zVtQo/Nueaaos8jDTeQ2bGV0KVgH9oD1ar1XA27mVbg==
   optionalDependencies:
     nkeys.js "1.0.5"