diff --git a/module/testcase/ui/browsescene.html.php b/module/testcase/ui/browsescene.html.php
new file mode 100644
index 0000000000..a382404b92
--- /dev/null
+++ b/module/testcase/ui/browsescene.html.php
@@ -0,0 +1,80 @@
+
+ * @package testcase
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+jsVar('modules', $modulePairs);
+
+include 'header.html.php';
+
+$footToolbar = null;
+$canBatchChangeModule = common::canModify('product', $product) && hasPriv('testcase', 'batchChangeModule') && !empty($productID) && ((isset($product->type) && $product->type == 'normal') || $branch !== 'all');
+if($canBatchChangeModule)
+{
+ $moduleItems = array();
+ foreach($modules as $changeModuleID => $module) $moduleItems[] = array('text' => $module, 'innerClass' => 'batch-btn ajax-btn not-open-url', 'data-url' => helper::createLink('testcase', 'batchChangeModule', "moduleID={$changeModuleID}"));
+ $footToolbar = array('items' => array
+ (
+ array('caret' => 'up', 'text' => $lang->testcase->moduleAB, 'type' => 'dropdown', 'items' => $moduleItems, 'data-placement' => 'top-start', 'data-menu' => array('searchBox' => true))
+ ), 'btnProps' => array('size' => 'sm', 'btnType' => 'secondary'));
+}
+
+$subSceneCount = count(array_filter(array_map(function($scene){return $scene->grade > 1;}, $scenes)));
+
+$cols = $this->config->scene->dtable->fieldList;
+$cols['title']['nestedToggle'] = $subSceneCount > 0;
+
+initTableData($scenes, $cols, $this->testcase);
+
+div
+(
+ dtable
+ (
+ set::id('scenes'),
+ set::plugins(array('sortable')),
+ set::nested(true),
+ set::sortable(true),
+ set::onSortEnd(jsRaw('window.onSortEnd')),
+ set::canSortTo(jsRaw('window.canSortTo')),
+ set::onRenderCell(jsRaw('window.onRenderCell')),
+ set::sortLink(inlink('browseScene', "productID=$product->id&branch=$branch&moduleID=$moduleID&orderBy={name}_{sortType}")),
+ set::checkable($canBatchChangeModule),
+ set::cols($cols),
+ set::data(array_values($scenes)),
+ set::userMap($users),
+ set::orderBy($orderBy),
+ set::footPager(usePager()),
+ set::footToolbar($footToolbar),
+ set::emptyTip($lang->testcase->noScene),
+ set::createTip($lang->testcase->createScene),
+ set::createLink($canCreateScene ? $createSceneLink : ''),
+ set::customData(array('modules' => $modulePairs))
+ )
+);
+
+modal
+(
+ setID('dragModal'),
+ set::title($lang->testcase->dragModalTitle),
+ set::size('sm'),
+ divider(),
+ div(setClass('my-4'), $lang->testcase->dragModalDesc),
+ div($lang->testcase->dragModalOrder),
+ div($lang->testcase->dragModalScene),
+ div(setClass('my-4'), $lang->testcase->dragModalAction),
+ divider(),
+ div
+ (
+ setClass('mt-4 pull-right'),
+ btn(setClass('primary mr-2'), $lang->testcase->dragModalChangeScene, set('data-on', 'click'), set('data-call', 'clickChangeScenen')),
+ btn(setClass('primary mr-2'), $lang->testcase->dragModalChangeOrder, set('data-on', 'click'), set('data-call', 'clickChangeOrder')),
+ btn($lang->close, set('data-dismiss', 'modal'))
+ )
+);
\ No newline at end of file