zhaocg 1 gadu atpakaļ
vecāks
revīzija
cdaba368a7

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+cosmicDev

+ 6 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="KingdeeConventionOfPackageNaming" enabled="false" level="BLOCKER" enabled_by_default="false" />
+  </profile>
+</component>

+ 10 - 0
.idea/libraries/cosmic_lib.xml

@@ -0,0 +1,10 @@
+<component name="libraryTable">
+  <library name="cosmic-lib">
+    <CLASSES>
+      <root url="file://$PROJECT_DIR$/../workspace-server/cosmic" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+    <jarDirectory url="file://$PROJECT_DIR$/../workspace-server/cosmic" recursive="true" />
+  </library>
+</component>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/workspace.iml" filepath="$PROJECT_DIR$/workspace.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 115 - 0
README.MD

@@ -0,0 +1,115 @@
+# 使用说明
+
+## 1.启动服务
+
+### 1) Application中设置好环境必要的参数
+
+- setClusterNumber: 集群编码
+- setTenantNumber: 租户编码
+- setServerIP: 服务端IP
+
+例:
+
+```java
+cosmic.setClusterNumber("cosmic");
+cosmic.setTenantNumber("sample");
+cosmic.setServerIP("192.168.95.177");
+```
+
+使用苍穹5.0之前的版本,需注释掉kd.cosmic.server.Launcher的@SdkPublic标注。
+
+### 2) 启动服务
+
+```java
+kd.cosmic.Application
+```
+首次运行,IDEA会弹出命令行过长的提示,形如:
+```text
+Error running kd.cosmic.Application. Command line is too long. 
+Shorten the command line via JAR manifest or via a classpath file and rerun.
+```
+点击<code>JAR manifest</code>链接执行启动。
+
+参考文章: https://developer.kingdee.com/article/357806944599232512
+
+### 3) 登录
+启动完毕后打开:http://localhost:8080/ierp
+
+### 4) IP变更
+若服务器IP发生变化,则同步做以下修改:
+
+- Application.java:cosmic.setServerIP(...)
+
+- cosmic.properties:MCServerURL的值
+
+- 苍穹虚拟机:苍穹开发助手->服务器管理->初始化设置->一键设置IP
+
+## 2.更新环境
+菜单操作路径:苍穹开发助手-->更新环境
+
+将从MC服务器上更新最新包:cosmic.zip、webapp.zip,解压到当前工程同一个目录下,目录名为"工程名称-server"。
+
+Application.java中已自动设置好解压后的web路径:
+
+```java
+cosmic.setWebPath("C:/Users/xxx/kingdee/myproject-server/webapp")
+```
+
+注意:更新版本时请先停止在正在跑或调试的工程,避免文件占用无法覆盖。
+
+## 3.插件选项
+菜单操作路径:File->Settings->苍穹开发助手
+
+
+## 4.搜索工具窗
+菜单操作路径:View->Tool Windows->苍穹开发助手
+
+若当前为苍穹工程(工程根目录下有cosmic.properties文件),苍穹开发助手自行显示,停靠在右上角。
+
+提供文档检索功能。
+
+
+## 5.菜单-登录开发者门户
+未登录:苍穹开发助手(工具窗)-社区文章-可搜索“开发者社区”文档
+登录后:苍穹开发助手(工具窗)-社区文章-可搜索“开发者社区+开发者门户”文档
+
+
+## 6.工程打包
+给当前工程打jar包,jar包配置文件: cosmic.build.xml。
+
+
+## 7.菜单-服务器管理
+通过SSH远程管理服务器。
+
+
+## 8.设置zk用户密码
+
+1) Application启动中配置:
+```java
+cosmic.setConfigUrl("xxx.xxx.xxx.xxx:2181","user","password");
+```
+
+2) 菜单-服务器管理-初始化设置:
+```properties
+ZK地址=xxx.xxx.xxx.xxx:2181?user=xxx&password=xxx
+```
+
+
+
+## 9.相关文档
+
+### 如何快速搭建二开环境
+
+https://vip.kingdee.com/article/357950002276007424
+
+### 金蝶云·苍穹开发助手
+
+https://vip.kingdee.com/article/355335902929259776
+
+### 苍穹虚拟机下载列表(全)
+
+https://vip.kingdee.com/article/357923047296550912
+
+### IDEA启动命令行过长解决办法
+
+https://vip.kingdee.com/article/357806944599232512

+ 9 - 0
cosmic.build.dtd

@@ -0,0 +1,9 @@
+<!ELEMENT build (jar*)>
+<!ELEMENT jar (manifest?,source+)>
+<!ATTLIST jar file CDATA #REQUIRED>
+<!ELEMENT manifest (attribute+)>
+<!ELEMENT attribute (#PCDATA)>
+<!ATTLIST attribute name CDATA #REQUIRED>
+<!ELEMENT source (exclude*)>
+<!ATTLIST source path CDATA #REQUIRED>
+<!ELEMENT exclude (#PCDATA)>

+ 9 - 0
cosmic.build.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE build SYSTEM "cosmic.build.dtd">
+<build>
+    <jar file="out/cosmicDev.jar">
+        <source path="out/production/cosmicDev/">
+            <exclude>kd/cosmic/**</exclude>
+        </source>
+    </jar>
+</build>

+ 3 - 0
cosmic.properties

@@ -0,0 +1,3 @@
+#[\u683C\u5F0F] http://\u82CD\u7A79\u670D\u52A1IP\u5730\u5740:8090/appstore/dev_env
+#Wed Sep 13 09:44:21 CST 2023
+MCServerURL=http\://127.0.0.1\:268/studio/environment/download/3

+ 0 - 1
demo/demo.txt

@@ -1 +0,0 @@
-111

BIN
out/cosmicDev.jar


BIN
out/production/workspace/kd/cosmic/Application.class


BIN
out/production/workspace/kd/cosmic/server/Launcher.class


+ 56 - 0
out/production/workspace/kd/cosmic/server/log.config.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--30 seconds  scan="true" scanPeriod="1 minutes" from common-->
+<configuration>
+    <property name="LOG_HOME" value="../logs"/>
+    <appender name="metric" class="kd.bos.metric.instruments.logback.MetricAppender"></appender>
+    <appender name="std" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
+        </layout>
+    </appender>
+    <appender name="kafka" class="kd.bos.logging.console.slf4j.logback.KafkaAppender">
+        <topic>{{clusterName}}-log</topic>
+        <brokerList>{{log.kafka.ip_port}}</brokerList>
+        <compressionType>none</compressionType>
+        <syncSend>false</syncSend>
+        <keySerializerClass>org.apache.kafka.common.serialization.StringSerializer</keySerializerClass>
+        <valueSerializerClass>org.apache.kafka.common.serialization.StringSerializer</valueSerializerClass>
+    </appender>
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}(%i).log</FileNamePattern>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+            <maxHistory>5</maxHistory>
+            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>10MB</MaxFileSize>
+            </TimeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <charset>utf-8</charset>
+            <pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
+        </encoder>
+        <append>false</append>
+        <prudent>false</prudent>
+    </appender>
+    <logger name="org.javaswift.joss.command.impl.core.AbstractCommand" additivity="false" level="OFF">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="org.ehcache" additivity="false" level="OFF">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="org.apache" additivity="false" level="ERROR">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="kd.bos.dc.utils.AccountUtils" additivity="false" level="ERROR">
+        <appender-ref ref="kafka"/>
+    </logger>
+    <logger name="kd.bos.license" additivity="false" level="ERROR">
+        <appender-ref ref="std"/>
+    </logger>
+    <root name="DB" additivity="false" level="INFO">
+        <appender-ref ref="std"/>
+    </root>
+    <root level="INFO">
+        <appender-ref ref="file"/>
+    </root>
+</configuration>

+ 33 - 0
src/main/java/kd/cosmic/Application.java

@@ -0,0 +1,33 @@
+package kd.cosmic;
+
+import kd.cosmic.server.Launcher;
+
+/**
+ * 启动本地应用程序(微服务节点)
+ */
+public class Application {
+
+    public static void main(String[] args) {
+        Launcher cosmic = new Launcher();
+
+        cosmic.setClusterNumber("cosmic");
+        cosmic.setTenantNumber("ierp");
+        cosmic.setServerIP("localhost");
+
+        cosmic.setAppName("cosmic-zhaocg-bDBxiJHP");
+        cosmic.setWebPath("D:/cosmic/workspace-server/webapp/static-file-service");
+
+
+        cosmic.setStartWithQing(false);
+
+
+        cosmic.set("lightweightdeploy", "true");  //标注环境为轻量级
+
+        cosmic.set("redismodelcache.enablelua", "false");  //轻量级不能用lua,设为false
+
+        cosmic.set("lightweightdeploy.services" , "");  //设置服务为空。服务由MC启动,这里就不用启动了
+
+        cosmic.setConfigUrl("localhost:2181","zhaocg","zhaocg"); //ip地址、zk端口号、账号、 密码填写安装环境时设置的值
+        cosmic.start();
+    }
+}

+ 178 - 0
src/main/java/kd/cosmic/server/Launcher.java

@@ -0,0 +1,178 @@
+package kd.cosmic.server;
+
+import kd.bos.config.client.util.ConfigUtils;
+import kd.bos.service.webserver.JettyServer;
+import kd.sdk.annotation.SdkPublic;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * cosmic服务启动器,含默认配置,如需更改请在Application中设置。
+ */
+@SdkPublic
+public final class Launcher {
+
+    private boolean setConfigUrl = false;
+
+    public Launcher() {
+        setDefault();
+    }
+
+    private void setDefault() {
+        set("configAppName", "mservice,web");
+        set("webmserviceinone", "true");
+        set("file.encoding", "utf-8");
+        set("mq.consumer.register", "true");
+        set("MONITOR_HTTP_PORT", "9998");
+        set("JMX_HTTP_PORT", "9091");
+        set("dubbo.protocol.port", "28888");
+        set("dubbo.consumer.url", "dubbo://localhost:28888");
+        set("dubbo.consumer.url.qing", "dubbo://localhost:30880");
+        set("dubbo.registry.register", "false");
+        set("dubbo.service.lookup.local", "true");
+        set("appSplit", "false");
+        set("tenant.code.type", "config");
+        set("JETTY_WEB_PORT", "8080");
+        set("domain.contextUrl", "http://localhost:8080/ierp");
+		set("lightweightdeploy", "false");
+        set("redismodelcache.enablelua", "true");
+        set("lightweightdeploy.services", "");
+
+        try {
+            String logConfig = new String(Files.readAllBytes(Paths.get(getClass().getResource("log.config.xml").toURI())), "UTF-8");
+            set("log.config", logConfig);
+        } catch (Exception e) {
+            //ignore
+        }
+
+        setClusterNumber("cosmic");
+        setTenantNumber("sample");
+        setAppName("cosmic-server");
+        setStartWithQing(true);
+        setXdbEnable(false);
+        setSqlOut(true, true);
+    }
+
+    public void start() {
+        JettyServer.main(null);
+    }
+
+    public void set(String key, String value) {
+        System.setProperty(key, value);
+    }
+
+    public String get(String key) {
+        return System.getProperty(key);
+    }
+
+    /**
+     * 设置苍穹服务器IP地址
+     */
+    public void setServerIP(String ip) {
+        setMCServerUrl("http://" + ip + ":8090/mc");
+        if (!setConfigUrl) {
+            setConfigUrl(ip + ":2181");
+        }
+        set("fileserver", "http://" + ip + ":8100/fileserver/");
+        set("imageServer.url", "http://" + ip + ":8100/fileserver/");
+    }
+
+    /**
+     * 设置MC服务地址
+     *
+     * @param mcServerUrl
+     */
+    public void setMCServerUrl(String mcServerUrl) {
+        set("mc.server.url", mcServerUrl);
+    }
+
+    /**
+     * @param configUrl 配置服务地址
+     */
+    public void setConfigUrl(String configUrl) {
+        set(ConfigUtils.CONFIG_URL_KEY, configUrl);
+        setConfigUrl = true;
+    }
+
+    /**
+     * 配置服务地址
+     *
+     * @param connectString zookeeper链接URL,如 127.0.0.1:2181
+     * @param user          用户
+     * @param password      密码
+     */
+    public void setConfigUrl(String connectString, String user, String password) {
+        if (user != null && password != null) {
+            setConfigUrl(connectString + "?user=" + user + "&password=" + password);
+        } else {
+            setConfigUrl(connectString);
+        }
+    }
+
+    /**
+     * @param clusterNumber 集群编码
+     */
+    public void setClusterNumber(String clusterNumber) {
+        set(ConfigUtils.CLUSTER_NAME_KEY, clusterNumber);
+    }
+
+
+    /**
+     * @param appName 本节点服务名称
+     */
+    public void setAppName(String appName) {
+        setAppName(appName, true);
+    }
+
+    public void setAppName(String appName, boolean alsoSetQueueTag) {
+        set(ConfigUtils.APP_NAME_KEY, appName);
+        if (alsoSetQueueTag) {
+            setQueueTag(appName);
+        }
+    }
+
+    public void setStartWithQing(boolean b) {
+        set("bos.app.special.deployalone.ids", b ? " " : "qing");
+    }
+
+    /**
+     * @param tenantNumber 租户编码
+     */
+    public void setTenantNumber(String tenantNumber) {
+        set("domain.tenantCode", tenantNumber);
+    }
+
+    /**
+     * @param enable 是否开启水平分表服务
+     */
+    public void setXdbEnable(boolean enable) {
+        set("xdb.enable", String.valueOf(enable));
+    }
+
+    /**
+     * @param tag 队列标记
+     */
+    public void setQueueTag(String tag) {
+        set("mq.debug.queue.tag", tag);
+    }
+
+    /**
+     * @param path web路徑
+     */
+    public void setWebPath(String path) {
+        set("JETTY_WEBRES_PATH", path);
+    }
+
+    /**
+     * 控制台输出SQL开关
+     *
+     * @param outSQL        是否输出SQL
+     * @param withParameter 是否输出参数
+     */
+    public void setSqlOut(boolean outSQL, boolean withParameter) {
+        set("db.sql.out", String.valueOf(outSQL));
+        set("db.sql.out.withParameter", String.valueOf(withParameter));
+    }
+
+}

+ 56 - 0
src/main/java/kd/cosmic/server/log.config.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--30 seconds  scan="true" scanPeriod="1 minutes" from common-->
+<configuration>
+    <property name="LOG_HOME" value="../logs"/>
+    <appender name="metric" class="kd.bos.metric.instruments.logback.MetricAppender"></appender>
+    <appender name="std" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
+        </layout>
+    </appender>
+    <appender name="kafka" class="kd.bos.logging.console.slf4j.logback.KafkaAppender">
+        <topic>{{clusterName}}-log</topic>
+        <brokerList>{{log.kafka.ip_port}}</brokerList>
+        <compressionType>none</compressionType>
+        <syncSend>false</syncSend>
+        <keySerializerClass>org.apache.kafka.common.serialization.StringSerializer</keySerializerClass>
+        <valueSerializerClass>org.apache.kafka.common.serialization.StringSerializer</valueSerializerClass>
+    </appender>
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}(%i).log</FileNamePattern>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+            <maxHistory>5</maxHistory>
+            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>10MB</MaxFileSize>
+            </TimeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <charset>utf-8</charset>
+            <pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
+        </encoder>
+        <append>false</append>
+        <prudent>false</prudent>
+    </appender>
+    <logger name="org.javaswift.joss.command.impl.core.AbstractCommand" additivity="false" level="OFF">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="org.ehcache" additivity="false" level="OFF">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="org.apache" additivity="false" level="ERROR">
+        <appender-ref ref="std"/>
+    </logger>
+    <logger name="kd.bos.dc.utils.AccountUtils" additivity="false" level="ERROR">
+        <appender-ref ref="kafka"/>
+    </logger>
+    <logger name="kd.bos.license" additivity="false" level="ERROR">
+        <appender-ref ref="std"/>
+    </logger>
+    <root name="DB" additivity="false" level="INFO">
+        <appender-ref ref="std"/>
+    </root>
+    <root level="INFO">
+        <appender-ref ref="file"/>
+    </root>
+</configuration>

+ 12 - 0
workspace.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="newWizard_KINGDEE_COSMIC_MODULE_TYPE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="cosmic-lib" level="project" />
+  </component>
+</module>