diff --git a/__init__.py b/__init__.py
new file mode 100644
index 00000000..50ed18aa
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1 @@
+# -*-coding:utf-8-*-
diff --git a/jikimo_model_viewer/__init__.py b/jikimo_model_viewer/__init__.py
new file mode 100644
index 00000000..0650744f
--- /dev/null
+++ b/jikimo_model_viewer/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/jikimo_model_viewer/__manifest__.py b/jikimo_model_viewer/__manifest__.py
new file mode 100644
index 00000000..b91c7b2b
--- /dev/null
+++ b/jikimo_model_viewer/__manifest__.py
@@ -0,0 +1,22 @@
+{
+ "name": "Jikimo 3D模型展示模块",
+ "summary": "Jikimo 3D模型展示模块。",
+ "description": "Jikimo 3D模型展示模块(限odoo16)",
+ "author": "Van",
+ "website": "https://jikimo.com",
+ "category": "Tutorials",
+ "version": "16.0.0.1",
+ "depends": ['web','sale','sale_management'],
+ "demo": [],
+ "data": [
+ 'views/views.xml', #这是为了测试的效果,可以删除
+ ],
+ 'assets': {
+ 'web.assets_qweb': [
+ 'jikimo_model_viewer/static/src/js/3d_viewer.xml',
+ ],
+ 'web.assets_backend': [
+ 'jikimo_model_viewer/static/src/js/*',
+ ],
+ }
+}
\ No newline at end of file
diff --git a/owl_demo/models/__init__.py b/jikimo_model_viewer/models/__init__.py
similarity index 100%
rename from owl_demo/models/__init__.py
rename to jikimo_model_viewer/models/__init__.py
diff --git a/owl_demo/models/sale_order.py b/jikimo_model_viewer/models/sale_order.py
similarity index 100%
rename from owl_demo/models/sale_order.py
rename to jikimo_model_viewer/models/sale_order.py
diff --git a/jikimo_model_viewer/readme.md b/jikimo_model_viewer/readme.md
new file mode 100644
index 00000000..ba98626a
--- /dev/null
+++ b/jikimo_model_viewer/readme.md
@@ -0,0 +1,25 @@
+# 演示DEMO
+## 先给销售订单添加一个Binary字段
+
+ class SaleOrder(models.Model):
+ _inherit = "sale.order"
+
+ step_file = fields.Binary("Step File")
+
+## 然后在销售订单详情的表单视中增加一个带有widget的标签
+
+
+ sale.order.form.inherit
+ sale.order
+
+
+
+
+
+
+
+
+
+
+ ## 然后就可以到销售订单页面上查看效果
+
\ No newline at end of file
diff --git a/jikimo_model_viewer/static/src/images/img.png b/jikimo_model_viewer/static/src/images/img.png
new file mode 100644
index 00000000..54080e49
Binary files /dev/null and b/jikimo_model_viewer/static/src/images/img.png differ
diff --git a/jikimo_model_viewer/static/src/js/3d_viewer.js b/jikimo_model_viewer/static/src/js/3d_viewer.js
new file mode 100644
index 00000000..f3eb56cf
--- /dev/null
+++ b/jikimo_model_viewer/static/src/js/3d_viewer.js
@@ -0,0 +1,62 @@
+/** @odoo-module **/
+
+import { registry } from "@web/core/registry";//注册
+import { _lt } from "@web/core/l10n/translation";//翻译
+import { standardFieldProps } from "@web/views/fields/standard_field_props";
+import { useInputField } from "@web/views/fields/input_field_hook";
+import { FileUploader } from "@web/views/fields/file_handler";
+import { session } from "@web/session";//登录会话
+import { useService } from "@web/core/utils/hooks";
+import { isBinarySize } from "@web/core/utils/binary";
+import { download } from "@web/core/network/download";
+import utils from 'web.utils';
+
+import core from 'web.core';
+import rpc from 'web.rpc';
+
+var QWeb = core.qweb;
+
+import { Component, onWillUpdateProps, useState, useRef, useEffect } from "@odoo/owl";
+
+export class StepViewer extends Component {
+ setup() {
+ this.props.url = this.formatUrl();
+ }
+
+ formatUrl(){
+ var url = '';
+ if (this.props.value) {
+ if (utils.is_bin_size(this.props.value)) {
+ var url_props = {
+ base_url: session['web.base.url'],
+ model: this.props.record.resModel,
+ id: JSON.stringify(this.props.record.data['id']),
+ field: this.props.name}
+ url = url_props['base_url']+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true'
+
+ } else {
+ url = "data:model/gltf-binary;base64," + this.props.value;
+ }
+ }
+ return url
+ }
+
+}
+
+StepViewer.template = "jikimo_model_viewer.BinaryField3d";
+
+StepViewer.displayName = _lt("3D File");
+StepViewer.supportedTypes = ["binary"];
+
+StepViewer.props = {
+ ...standardFieldProps,
+ url: { type: String, optional: true },
+};
+
+StepViewer.extractProps = ({ attrs }) => {
+ return {
+ url: attrs.options.url,
+ };
+};
+
+registry.category("fields").add("Viewer3D", StepViewer);
diff --git a/jikimo_model_viewer/static/src/js/3d_viewer.xml b/jikimo_model_viewer/static/src/js/3d_viewer.xml
new file mode 100644
index 00000000..8a64338f
--- /dev/null
+++ b/jikimo_model_viewer/static/src/js/3d_viewer.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jikimo_model_viewer/static/src/js/test.glb b/jikimo_model_viewer/static/src/js/test.glb
new file mode 100644
index 00000000..c4a6352b
Binary files /dev/null and b/jikimo_model_viewer/static/src/js/test.glb differ
diff --git a/jikimo_model_viewer/views/views.xml b/jikimo_model_viewer/views/views.xml
new file mode 100644
index 00000000..2baada6e
--- /dev/null
+++ b/jikimo_model_viewer/views/views.xml
@@ -0,0 +1,19 @@
+
+
+
+ sale.order.form.inherit
+ sale.order
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/owl_demo/__init__.py b/owl_demo/__init__.py
index f7209b17..e046e49f 100644
--- a/owl_demo/__init__.py
+++ b/owl_demo/__init__.py
@@ -1,2 +1 @@
-from . import models
from . import controllers
diff --git a/owl_demo/__manifest__.py b/owl_demo/__manifest__.py
index 93565bfa..8011e065 100644
--- a/owl_demo/__manifest__.py
+++ b/owl_demo/__manifest__.py
@@ -6,7 +6,7 @@
"website": "https://topodoo.com",
"category": "Tutorials",
"version": "15.0.0.1",
- "depends": ["sale", "sale_management"],
+ "depends": ["sale", "sale_management","web_widget_model_viewer"],
"demo": [],
"data": [
#'report/test_sale_report.xml',
diff --git a/owl_demo/views/views.xml b/owl_demo/views/views.xml
deleted file mode 100644
index b558e85b..00000000
--- a/owl_demo/views/views.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- sale.order.form.inherit
- sale.order
-
-
-
-
-
-
-
-
-
-
-
-
- sale.order.tree.inherit
- sale.order
-
-
-
- CTemplate
- {'template':'owl_demo.field_partner_id'}
-
-
-
-
-
-
-
-
-
\ No newline at end of file