Browse Source

Merge branch 'master' of http://git.fmode.cn:3000/bin/edu-textbook

warrior 8 months ago
parent
commit
a6d994f045

+ 36 - 1
README.md

@@ -15,7 +15,7 @@ npm run start
 ```
 
 
-## 生产环境
+## 线上开发环境
 - 服务器
     - root@8.140.98.43
 - 数据库
@@ -26,12 +26,47 @@ npm run start
 ALTER USER postgres WITH PASSWORD 'Edu2024textbask';
 ```
 
+## 线上生产环境
+
+
+-- 生产用户
+psql --dbname=postgresql://textbook:Edu2024textbask@pgm-2zehqf5x28989whc.pg.rds.aliyuncs.com:5432/textbook
+
+CREATE DATABASE textbook;
+CREATE USER textbook WITH PASSWORD 'Edu2024textbask';
+GRANT ALL PRIVILEGES ON DATABASE textbook TO textbook;
+GRANT ALL PRIVILEGES ON SCHEMA public TO textbook;
+
+--rds--  PostgreSQL
+
+psql --dbname=postgresql://admin_user@pgm-2zehqf5x28989whc.pg.rds.aliyuncs.com:5432/
+
+实例ID: pgm-2zehqf5x28989whc
+内网地址:pgm-2zehqf5x28989whc.pg.rds.aliyuncs.com
+公网地址:pgm-2zehqf5x28989whc1o.pg.rds.aliyuncs.com
+高权限账号:admin_user  密码:DCG!MfwW7fpvA
+----注意高权限账号建库建表后要回收,给普通权限账号----
+
+---oss---
+Bucket: hep-textbook
+用户登录名称 hep-textbook-api@cloudhep.onaliyun.com
+AccessKey ID: LTAI5t6AbTiAvXmeoVdJZhL3
+AccessKey Secret: KLtQRdIW69KLP7jnzHNUf7eKmdptxH
+内网地址:oss-cn-beijing.aliyuncs.com
+外网地址:oss-cn-beijing-internal.aliyuncs.com
+
 ## Authing 用户服务
 ### 管理员
 https://lljydpt8egql.u2-dev.hep.com.cn/
 - 用户名 hanlei
 - 密码 13581837652
 
+### AKSK
+AccessKey ID:
+6686bffb373d06911e24a969
+AccessKey Secret:
+4e978331675938d1bc81fb109e67d59a
+
 ### 单页面应用
 AppID 6682ab96b7bd5db59d6785a0
 

+ 54 - 5
package-lock.json

@@ -22,6 +22,7 @@
         "@ionic/angular": "^8.2.2",
         "@ngx-translate/core": "^15.0.0",
         "@types/parse": "^3.0.9",
+        "authing-node-sdk": "^3.1.0",
         "ng-zorro-antd": "^18.0.0",
         "parse": "^5.1.0",
         "rxjs": "~7.8.0",
@@ -5744,6 +5745,42 @@
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
       "dev": true
     },
+    "node_modules/authing-node-sdk": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/authing-node-sdk/-/authing-node-sdk-3.1.0.tgz",
+      "integrity": "sha512-lpL/kzrfXk/jBapZzTLur4HTZg6m3yDNYG6PHt3vSIs8ALvXpyEtOS4toA19nzlBBJBUN7eft7xhlTV7ZW+6zg==",
+      "dependencies": {
+        "axios": "^0.26.1",
+        "base64url": "^3.0.1",
+        "buffer": "^6.0.3",
+        "crypto-js": "^4.1.1",
+        "jose": "4",
+        "ws": "^8.12.0"
+      }
+    },
+    "node_modules/authing-node-sdk/node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
     "node_modules/autoprefixer": {
       "version": "10.4.19",
       "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.19.tgz",
@@ -5880,7 +5917,6 @@
       "version": "1.5.1",
       "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -5905,6 +5941,14 @@
         "node": "^4.5.0 || >= 5.9"
       }
     },
+    "node_modules/base64url": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/base64url/-/base64url-3.0.1.tgz",
+      "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/batch": {
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz",
@@ -6864,8 +6908,7 @@
     "node_modules/crypto-js": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
-      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
-      "optional": true
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
     },
     "node_modules/css-loader": {
       "version": "7.1.1",
@@ -8437,7 +8480,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -9079,6 +9121,14 @@
         "jiti": "bin/jiti.js"
       }
     },
+    "node_modules/jose": {
+      "version": "4.15.9",
+      "resolved": "https://registry.npmmirror.com/jose/-/jose-4.15.9.tgz",
+      "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -14263,7 +14313,6 @@
       "version": "8.17.1",
       "resolved": "https://registry.npmmirror.com/ws/-/ws-8.17.1.tgz",
       "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
-      "dev": true,
       "engines": {
         "node": ">=10.0.0"
       },

+ 12 - 0
server/cloud/aliyun/func-aliyun-oss.js

@@ -0,0 +1,12 @@
+
+const argv = require('yargs').argv
+
+
+async function getAliyunOssAccessToken(){
+
+}
+
+module.exports.getAliyunOssAccessToken = getAliyunOssAccessToken
+if(argv?.test){
+    getAliyunOssAccessToken()
+}

+ 139 - 0
server/cloud/authing/func-authing-org-sync.js

@@ -0,0 +1,139 @@
+const { ManagementClient } = require('authing-node-sdk')
+const managementClient  = new ManagementClient({
+    accessKeyId: '6686bffb373d06911e24a969',
+    accessKeySecret: "4e978331675938d1bc81fb109e67d59a",
+    host: 'https://textbook.u2-dev.hep.com.cn', // 应用的认证地址
+})
+
+
+// const pgp = require('pg-promise')();
+// const pgClient = () => {return pgp("postgresql://textbook:Edu2024textbask@oss-cn-beijing-internal.aliyuncs.com:5432/textbook");}
+
+import { pgClient } from '../../db/pg-instance'
+export function defineAuthingDepartSync(){
+// function defineAuthingLogin(){
+    Parse.Cloud.define("authingDepartSync", async (request) => {
+        let result = await syncOrganizationsFromAuthing()
+        return result
+    });
+}
+  
+
+/**
+ * 同步全部组织架构 From Authing
+ * @desc
+ * https://docs.authing.cn/v3/reference/sdk/node/management/管理组织机构/list-organizations.html
+ * @param {*} token 
+ * @returns 
+ */
+async function syncOrganizationsFromAuthing(){
+    // 通过用户的 id_token 初始化之后获取用户信息
+    console.log("syncOrganizationsFromAuthing 2")
+    
+    console.log("managementClient")
+    let orgList = []
+    try{
+
+        let result = await managementClient.listOrganizations({
+            page: 1,
+            limit: 50,
+            withPost: true,
+            withCustomData: true
+        });
+        if(result?.data?.list?.length){
+            orgList = orgList.concat(result?.data?.list)
+            let departList = await getAllChildDepartments(orgList[0])
+            console.log(departList)
+            console.log(departList?.length)
+            let insertRes = await InsertAllDepartment(departList)
+            console.log(insertRes)
+            return {code:200,count:departList?.length,message:`成功导入${departList?.length}条`}
+        }
+        
+    }catch(err){
+        console.error(err)
+    }
+    return
+    // console.log(user)
+
+}
+module.exports.syncOrganizationsFromAuthing = syncOrganizationsFromAuthing
+
+async function InsertAllDepartment(departList){
+    // {
+        //     departmentId: '66868df17adf199d1c77875d',
+    //     organizationCode: '1000000',
+    //     name: '河北人民出版社有限责任公司',
+    //     description: '',
+    //     code: '30000095',
+    //     hasChildren: false,
+    //     isVirtualNode: false,
+    //     i18n: { name: [Object] },
+    //     customData: {},
+    //     status: true
+    //     createdAt: '2024-07-04T11:56:33.813Z',
+    //     updatedAt: '2024-07-04T11:56:33.813Z',
+    //   },
+    let rowData = []
+    departList.forEach(depart=>{
+        let objectId = depart?.departmentId
+        rowData.push([
+            objectId,depart?.organizationCode,depart?.name,depart?.description,depart?.parent?.name,
+            depart?.parent?.departmentId,depart?.code,depart?.createdAt || new Date(),depart?.updatedAt || new Date(),depart?.status])
+    })
+    let flattenedParams = rowData.flat();
+
+    let syncDepartSQL = `
+    INSERT INTO "Department" ("objectId", "organizationCode", "name", "description","branch","parent","code","createdAt","updatedAt","status")
+    VALUES
+        ${rowData.map((_, i) => `($${i * 10 + 1}, $${i * 10 + 2}, $${i * 10 + 3}, $${i * 10 + 4}, $${i * 10 + 5}, $${i * 10 + 6}, $${i * 10 + 7}, $${i * 10 + 8}, $${i * 10 + 9}, $${i * 10 + 10})`).join(',\n')}    
+    ON CONFLICT ("objectId") DO UPDATE
+    SET 
+        "organizationCode" = EXCLUDED."organizationCode",
+        "name" = EXCLUDED."name",
+        "description" = EXCLUDED."description",
+        "branch" = EXCLUDED."branch",
+        "parent" = EXCLUDED."parent",
+        "code" = EXCLUDED."code",
+        "status" = EXCLUDED."status",
+        "createdAt" = EXCLUDED."createdAt",
+        "updatedAt" = EXCLUDED."updatedAt";
+    `
+    let result = await pgClient().any(syncDepartSQL,flattenedParams);
+    return result
+}
+
+async function getAllChildDepartments(depart){
+    if(!depart?.hasChildren) return []
+    let departmentList = []
+
+    let childDepartList = await getDepartmentOfOrg(depart?.organizationCode,depart?.departmentId)
+    departmentList = departmentList.concat(childDepartList)
+    // console.log("childDepartList",childDepartList)
+    let pList = childDepartList.map(item=>getAllChildDepartments(item))
+    let resList = await Promise.all(pList);
+    resList.forEach((list,index)=>{
+        list = list.map(item=>{item.parent = childDepartList[index];return item})
+        departmentList = departmentList.concat(list)
+    })
+    return departmentList
+}
+
+async function getDepartmentOfOrg(organizationCode,departmentId){
+    let result = await managementClient.listChildrenDepartments({
+        // 替换组织 Code 和部门 ID
+        organizationCode: organizationCode,
+        departmentId: departmentId,
+        departmentIdType: 'department_id',
+        withCustomData: true
+      });
+      if(result?.data?.list?.length) return result?.data?.list
+      return []
+}
+
+// const crypto = require('crypto');
+// function generateObjectId(inputString) {
+//     const hash = crypto.createHash('sha256').update(inputString).digest('hex');
+//     const objectId = hash;
+//     return objectId;
+// }

+ 26 - 8
server/cloud/authing/func-authing-session-sync.js

@@ -42,26 +42,44 @@ async function syncSessionWithIdToken(token){
     let sessionObjectId = generateObjectId(user?.id+user?.token)
     let username = user?.phone || user?.username || user?.email
     let syncSessionSQL = `
-    INSERT INTO "_User" ("objectId", "username","mobile", "createdAt", "updatedAt")
+    INSERT INTO "_User" (
+        "objectId", "username","mobile","phone", "createdAt", "updatedAt",
+        "lastIP","lastLogin","userSourceType","loginsCount"
+        )
     VALUES
-    ($2,$7,$8,$5,$6)
+    (
+        $2,$7,$8,$8,$5,$6,
+        $9,$10,$11,$12
+        )
     ON conflict("objectId") DO UPDATE
     SET 
     "username" = excluded."username",
-    "updatedAt"=excluded."updatedAt";
+    "updatedAt"=excluded."updatedAt",
+    "mobile"=excluded."mobile",
+    "phone"=excluded."phone",
+    "lastIP"=excluded."lastIP",
+    "lastLogin"=excluded."lastLogin",
+    "userSourceType"=excluded."userSourceType",
+    "loginsCount"=excluded."loginsCount";
 
 
-    INSERT INTO "_Session" ("objectId", "user", "sessionToken","expiresAt", "createdAt", "updatedAt")
+    INSERT INTO "_Session" ("objectId", "user", "sessionToken","expiresAt", "createdAt")
     VALUES
-    ($1, $2,$3,$4,$5,$6)
+    ($1, $2,$3,$4,$5)
     ON conflict("objectId") DO UPDATE
     SET 
     "user" = excluded."user",
     "sessionToken" = excluded."sessionToken",
-    "expiresAt"=excluded."expiresAt",
-    "updatedAt"=excluded."updatedAt";
+    "expiresAt"=excluded."expiresAt";
     `
-    let params = [sessionObjectId,user?.id,user?.token,user?.tokenExpiredAt,new Date(),new Date(),username,user?.phone]
+    let params = [
+        // 1-4
+        sessionObjectId,user?.id,user?.token,user?.tokenExpiredAt,
+        // 5-8
+        new Date(),new Date(),username,user?.phone,
+        // 9-12
+        user?.lastIP, user?.lastLogin, user?.userSourceType,user?.loginsCount
+    ]
     if(user?.id&&user?.token){
         try {
             // 查询:数据库版本信息

+ 2 - 1
server/cloud/authing/index.js

@@ -1 +1,2 @@
-export * from "./func-authing-session-sync"
+export * from "./func-authing-session-sync"
+export * from "./func-authing-org-sync"

+ 15 - 0
server/cloud/authing/test/test-authing-org-sync.js

@@ -0,0 +1,15 @@
+const { syncOrganizationsFromAuthing } = require("../func-authing-org-sync");
+
+function main(){
+    console.log("syncOrganizationsFromAuthing")
+
+    syncOrganizationsFromAuthing().then(data=>{
+        
+    })
+}
+main()
+
+/**
+ * Cloud Code test
+ curl -X POST -H "Content-Type: application/json" -H 'X-Parse-Application-Id: edu-textbook' http://8.140.98.43/parse/functions/authingDepartSync
+ */

+ 13 - 0
server/cloud/authing/test/test-authing-session-sync.js

@@ -7,3 +7,16 @@ syncSessionWithIdToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cGRhdGVkX2F0Ijo
  * Cloud Code test
  curl -X POST -H "Content-Type: application/json" -H 'X-Parse-Application-Id: edu-textbook' -d '{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cGRhdGVkX2F0IjoiMjAyNC0wNy0wM1QwMjoxMTo1Ny44NDJaIiwiYWRkcmVzcyI6eyJjb3VudHJ5IjpudWxsLCJwb3N0YWxfY29kZSI6bnVsbCwicmVnaW9uIjpudWxsLCJmb3JtYXR0ZWQiOm51bGx9LCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOnRydWUsInBob25lX251bWJlciI6IjE4NjkxNzcwMzQzIiwibG9jYWxlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwiYmlydGhkYXRlIjpudWxsLCJnZW5kZXIiOiJVIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJlbWFpbCI6bnVsbCwid2Vic2l0ZSI6bnVsbCwicGljdHVyZSI6Imh0dHBzOi8vZmlsZXMuYXV0aGluZy5jby9hdXRoaW5nLWNvbnNvbGUvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcm9maWxlIjpudWxsLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsIm5pY2tuYW1lIjpudWxsLCJtaWRkbGVfbmFtZSI6bnVsbCwiZmFtaWx5X25hbWUiOm51bGwsImdpdmVuX25hbWUiOm51bGwsIm5hbWUiOm51bGwsInN1YiI6IjY2ODJiZmU4MzcxNWIzYmIwNmM4ZGNiMiIsImV4dGVybmFsX2lkIjpudWxsLCJ1bmlvbmlkIjpudWxsLCJ1c2VybmFtZSI6bnVsbCwic2Vjb25kYXJ5VXNlcklkcyI6bnVsbCwiZGF0YSI6eyJ0eXBlIjoidXNlciIsInVzZXJQb29sSWQiOiI2NjcyNTQwZDg3NTZhNTAzYzZmNmYwM2UiLCJhcHBJZCI6IjY2ODJhYjk2YjdiZDVkYjU5ZDY3ODVhMCIsImlkIjoiNjY4MmJmZTgzNzE1YjNiYjA2YzhkY2IyIiwidXNlcklkIjoiNjY4MmJmZTgzNzE1YjNiYjA2YzhkY2IyIiwiX2lkIjoiNjY4MmJmZTgzNzE1YjNiYjA2YzhkY2IyIiwicGhvbmUiOiIxODY5MTc3MDM0MyIsImVtYWlsIjpudWxsLCJ1c2VybmFtZSI6bnVsbCwidW5pb25pZCI6bnVsbCwib3BlbmlkIjpudWxsLCJjbGllbnRJZCI6IjY2NzI1NDBkODc1NmE1MDNjNmY2ZjAzZSJ9LCJ1c2VycG9vbF9pZCI6IjY2NzI1NDBkODc1NmE1MDNjNmY2ZjAzZSIsImF1ZCI6IjY2ODJhYjk2YjdiZDVkYjU5ZDY3ODVhMCIsImV4cCI6MTcyMTE4MzI0NCwiaWF0IjoxNzE5OTczNjQ0LCJpc3MiOiJodHRwczovL3RleHRib29rLnUyLWRldi5oZXAuY29tLmNuL29pZGMifQ.AH-rjp1RYBZy5VrOeZPLoX2vOjtfIy7dPKS5R7WorNk" }' http://8.140.98.43/parse/functions/authingLogin
  */
+
+
+ /*
+
+ALTER TABLE "_Session" ADD CONSTRAINT unique_objectId UNIQUE ("objectId");
+
+ curl -X POST \
+  -H "X-Parse-Application-Id: edu-textbook" \
+  -H "X-Parse-Revocable-Session: 1" \
+  -H "Content-Type: application/json" \
+  -d '{"username":"bookadmin","password":"bk2024"}' \
+  http://8.140.98.43//parse/login
+  */

+ 1 - 0
server/config.js

@@ -5,4 +5,5 @@ module.exports = {
     "PARSE_APPID":"edu-textbook",
     "PARSE_MASTERKEY":"EDU2024",
     "DATABASE_LOCAL":false, // 加载本地测试数据库
+    "DATABASE_DBNAME": "postgresql://textbook:Edu2024textbask@pgm-2zehqf5x28989whc.pg.rds.aliyuncs.com:5432/textbook"
 }

+ 1 - 1
server/db/index.js

@@ -11,7 +11,7 @@ import { Department } from "./schemas/Department"
 export const EduSchemas = [
     _User,
     _Role,
-    _Session,
+    // _Session,
     Company,
     EduTextbook,
     Profile,

+ 4 - 16
server/db/pg-instance.js

@@ -3,27 +3,15 @@ const pgp = require('pg-promise')();
 // 连接到数据库
 var PgInstanse;
 export const pgClient = function(){
-    let pgconfig = {
-        user: 'postgres',
-        password: 'Edu2024textbask',
-        host: '127.0.0.1',
-        port: 25432,
-        database: 'postgres'
-    }
+    let pgConns = global.config['DATABASE_DBNAME']
     
     if(global.config['LOCAL']) {
-        pgconfig = {
-            user: 'postgres',
-            password: 'postgres',
-            host: '127.0.0.1',
-            port: 25432,
-            database: 'postgres'
-        }
+        pgConns = `postgres://postgres:postgres@127.0.0.1:25432/postgres`
     }
     
     if(!PgInstanse){
-        console.log(pgconfig)
-        PgInstanse = pgp(pgconfig);
+        // console.log(pgconfig)
+        PgInstanse = pgp(pgConns);
     }
     return PgInstanse;
 }

+ 13 - 0
server/db/schemas/_User.js

@@ -10,6 +10,19 @@ export const _User = {
         "mobile": {
             "type": "String"
         },
+        // Authing 提供信息
+        "phone": {
+            "type": "String"
+        },
+        "lastLogin": {
+            "type": "Date"
+        },
+        "userSourceType":{
+            "type": "String"
+        },
+        "loginsCount":{
+            "type": "Number"
+        }
     }
 }
 module.exports._User = _User

+ 2 - 1
server/lib/pg/index.js

@@ -33,7 +33,8 @@ var DBDataDir
  * cp -rf node_modules/@embedded-postgres/windows-x64/native/* bin/pg/bin/
  */
 export async function PostgreSQLKeep(dbconfig){
-    DBDataDir = path.join(OWN_DIR,dbconfig.dbpath)
+    if(!dbconfig?.dbpath) return
+    DBDataDir = path.join(OWN_DIR,dbconfig?.dbpath)
 
     console.log("PostgreSQLKeep",dbconfig)
     // pgStop(dbconfig)

+ 1 - 0
server/package.json

@@ -27,6 +27,7 @@
   "license": "ISC",
   "dependencies": {
     "authing-js-sdk": "^4.23.51",
+    "authing-node-sdk": "^3.1.0",
     "parse-dashboard": "^5.4.0",
     "parse-server": "^7.0.0",
     "yargs":"17.7.2",

+ 7 - 3
server/server.js

@@ -30,6 +30,8 @@ if (OWN_DIR) {
   }
 }
 global.config = global.config || {}
+console.log(appConfig)
+global.config['DATABASE_DBNAME'] = process.env["DATABASE_DBNAME"] || appConfig["DATABASE_DBNAME"] || false
 global.config['DATABASE_LOCAL'] = process.env["DATABASE_LOCAL"] || appConfig["DATABASE_LOCAL"] || false
 global.config['MCENTER_ENABLED'] = process.env["MCENTER_ENABLED"] || appConfig["MCENTER_ENABLED"] || false
 global.config['PARSE_SERVERURL'] = process.env["PARSE_SERVERURL"] || appConfig["PARSE_SERVERURL"] || false
@@ -42,6 +44,7 @@ global.config["LOCAL"] = argv.local || process.env["LOCAL"] || appConfig["LOCAL"
 
 import  {textbookRouter} from "./api/textbook/routes";
 import { defineAuthingLogin } from "./cloud/authing"
+import { defineAuthingDepartSync } from "./cloud/authing"
 import { importData } from "./db/func/import-data"
 
 
@@ -82,7 +85,7 @@ global.parseConfig = {
 }
 
 global.parseConfig.serverURL = `http://localhost:${global.parseConfig?.port}/parse`
-global.parseConfig.databaseURI = "postgresql://postgres:Edu2024textbask@127.0.0.1:25432/"
+global.parseConfig.databaseURI = global.config['DATABASE_DBNAME'];
 if(global.config['LOCAL']) {
   global.parseConfig.databaseURI = "postgresql://postgres@127.0.0.1:25432/"
 }
@@ -97,9 +100,9 @@ Parse.serverURL = global.parseConfig.serverURL;
 async function startParse(){
   if(global.config['LOCAL']) {
     console.log("PostgreSQLKeep")
-    await PostgreSQLKeep({
-        username:"postgres",password:"postgres",port:"25432",dbpath:"database/edudata"
+    await PostgreSQLKeep({username:"postgres",password:"postgres",port:"25432",dbpath:"database/edudata"
     })
+    // await PostgreSQLKeep(global.config['DATABASE_DBNAME'], "database/edudata/" )
   }
   // 挂载微服务
   console.log(global.parseConfig)
@@ -174,6 +177,7 @@ async function initParseAndDatabase(){
       }, 500);
       // 导入CloudCode
       defineAuthingLogin()
+      defineAuthingDepartSync()
     });
  
     console.log("正在启动管理看板...")