杰 创建的主题
  • jquery系 92 0 1 发布

    简介

    easyui 是一种基于 jQuery 的用户界面插件集合。

    easyui 为创建现代化,互动,JavaScript 应用程序,提供必要的功能。

    使用 easyui 你不需要写很多代码,你只需要通过编写一些简单 HTML 标记,就可以定义用户界面。

    easyui 是个完美支持 HTML5 网页的完整框架。

    easyui 节省您网页开发的时间和规模。

    easyui 很简单但功能强大的。

    官网地址:http://www.jeasyui.com/index.php

    文档地址:

    中文文档英文文档快速入门 弹出对话框 demo

    第一步: 下载 Jquery EasyUI

    你在使用和进行开发时,请遵守官方相应的条款,尊重他们的知识版权。

    目前官方最新版本是:jQuery EasyUI 1.5,官方提供了两个版本供下载,GPL 版本和商业版本,你根据自己的需要下载

    GPL 版本 GPL 版本在 GPl 协议下有效,你能在任何遵循 GPl 协议的项目下使用它。商业版本 商业版在 Commercial 协议下有效,你能在任何非 GPL/专有的协议下使用。

    第二步:创建 html 文件,并添加相关引用

    创建项目的文件夹

    easydemo // 项目根目录 ├── index.html // 我们的测试页面 └── lib // 第三方组件 └── jquery-easyui-1.5.5.2 // 下载的easyui的压缩包解压后的文件夹 ├── easyloader.js // easyui的动态加载组件的js ├── jquery.easyui.min.js // 压缩后的包!!!关键!! ├── jquery.easyui.mobile.js ├── jquery.min.js // 依赖的jq的文件 ├── locale // 本地语言的文件夹 ├── plugins // 拆分的组件 └── themes // 样式主题文件夹

    第三步: 修改 index.html 文件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <!-- easyui的样式,可以选择其他主题 --> <link rel="stylesheet" href="./lib/jquery-easyui-1.5.5.2/themes/bootstrap/easyui.css"> <!-- easyui的图标css文件 --> <link rel="stylesheet" href="./lib/jquery-easyui-1.5.5.2/themes/icon.css"> <!-- easyui 依赖jq --> <script src="./lib/jquery-easyui-1.5.5.2/jquery.min.js"></script> <!-- jq easyui的js脚本 --> <script src="./lib/jquery-easyui-1.5.5.2/jquery.easyui.min.js"></script> <!-- 引用语言包 --> <script src="./lib/jquery-easyui-1.5.5.2/locale/easyui-lang-zh_CN.js"></script> <title>AICODER jQuery EasyUI Demos</title> </head> <body> <!-- 功能:点击按钮弹出模态对话框 --> <input type="button" value="弹出模态对话框" id="btnOpenDialog"> <!-- 设置弹出来的对话框div,首先设置为隐藏 --> <div id="addDialog" style="display: none;"> <h3>添加的对话框</h3> </div> <script> $(function () { $('#btnOpenDialog').on('click', function () { // 弹出对话框 $('#addDialog').dialog({ modal: true, // 是否是模态对话框 title: 'AICODER全栈实习--添加用户!', // 弹出来的窗口的标题 width: 400, // 窗口的宽度 height: 400, // 窗口的高度 }); }); }); </script> </body> </html>

    结果如下:

    easyui 的布局

    jq easyui 把网页分成了 上、下、左、中、右,分别对应:North、South、West、Center、East。

    easyui 增加了自定义的属性:data-options,通过它可以设置 easyui 组件的选项。

    <body class="easyui-layout"> <div data-options="region:'north',split:true" style="height:100px;"></div> <div data-options="region:'south',split:true" style="height:100px;"></div> <div data-options="region:'east',title:'East',split:true" style="width:100px;"></div> <div data-options="region:'west',title:'West',split:true" style="width:100px;"></div> <div data-options="region:'center',title:'center title'" style="padding:5px;background:#eee;"> <input type="button" value="弹出模态对话框" id="btnOpenDialog"> </div> </body> 布局区域选项说明选项类型说明默认值regionString所处的方位,可取值:North、South、West、Center、EastnulltitleString区域的标题nullsplitBoolean是否跟其他区域进行分离(增加外边距)falsehrefString从后台获取 html,并显示在此区域nullcollapsibleBoolean是否显示可折叠按钮trueiconClsstringAn icon CSS class to show a icon on panel header.nullminWidthNumber区域的最小宽度10minHeightNumber区域的最小高度10maxWidthNumber区域的最大宽度10000maxHeightNumber区域的最大高度10000布局的方法方法名参数描述resizeparam改变布局的大小. 参数 param 对象可以设置以下属性: 
    width: 布局的宽度.
    height: 布局的高度.collapseregion折叠区域, region 参数可以取值:north,south,east,west.expandregion展开区域面板, region 参数可以取值:north,south,east,west.addoptions添加一个面板removeregion移除一个区域面板, 参数 region 可以取值:north,south,east,west.splitregion移除区域 参数 region 可以取值:north,south,east,westunsplitregion取消移除区域 参数 region 可以取值:north,south,east,west

    例如:

    // 改变大小 $('#cc').layout('resize', { width: '80%', height: 300 }); // 折叠区域 $('#btnCloseEast').click(function () { $(document.body).layout('collapse', 'east'); }); // 展开区域 $('#btnExpandEast').click(function () { $(document.body).layout('expand', 'east'); }); 布局的事件事件名参数描述onCollapseregion当折叠区域的时候触发onExpandregion当展开区域的时候触发onAddregion当添加区域的时候触发onRemoveregion当移除区域的时候触发 // 注册监听事件 $(document.body).layout({ onCollapse: function (region) { $.messager.alert('消息标题', '消息内容:折叠了面板:' + region, 'info'); }, onExpand: function (region) { $.messager.alert('消息标题', '消息内容:展开了面板:' + region, 'warning'); } }); easyui 的消息组件

    easyui提供了丰富的弹出消息框的方法。

    弹出消息框

    $.messager.alert 方法提供了弹出消息的功能,类似window.alert的功能。

    此方法接受的参数:

    参数名说明title显示消息框的标题msg消息内容.icon消息的内容前面的图标,可以用图标名为: error,question,info,warning.fn点击ok按钮后的回调函数

    两种调用模式

    // 第一种: 传入三个字符串参数 $.messager.alert('My Title','Here is a info message!','info'); // 第二种: 传入对象参数 $.messager.alert({ title: 'My Title', msg: 'Here is a message!', fn: function(){ //... } }); 弹出确认对话框

    $.messager.confirm 方法提供了弹出消息的功能,类似window.confirm的功能。

    此方法接受的参数:

    参数名说明title显示消息框的标题msg消息内容.fn点击ok按钮后的回调函数

    两种调用模式

    // 第一种: 传入三个字符串参数 $.messager.confirm('Confirm', 'Are you sure to exit this system?', function(r){ if (r){ // 如果用户点击确认,那么 r就是true,否则fals // exit action; } }); // 第二种: 传入对象参数 $.messager.confirm({ title: 'My Title', msg: 'Are you confirm this?', fn: function(r){ if (r){ // 如果用户点击确认,那么 r就是true,否则fals alert('confirmed: '+r); } } }); easyui 的树组件

    easyui 树形菜单(Tree)也可以定义在 <ul> 元素中。

    初始化树有两种方式:

    通过标签初始化

    通过js初始化

    以下是通过js初始化的案例

    $('#tt').tree({ checkbox: true, // 是否显示多选框 data: [{ id: 1, text: '北京', state: 'open', attributes: { url: "/demo/book/abc", price: 100 }, children: [{ id: 7, text: "昌平", checked: true }, { id: 8, text: "朝阳", state: "closed" }] }, { id: 2, text: '山东', state: 'open', attributes: { url: "/demo/book/abc", price: 100 }, children: [{ id: 9, text: "潍坊", checked: true }, { id: 10, text: "青岛", state: "closed" }] },], animate: true, // 节点折叠和展开是否使用动画 lines: true, // 是否显示 节点之间的线条 dnd: true, // 是否可拖拽 });

    结果:

    easyui 表格组件

    表格是easyui里面使用最广的组件。

    DataGrid 数据表格,扩展自 $.fn.panel.defaults ,用 $.fn.datagrid.defaults 重写了 defaults 。

    依赖panelresizablelinkbuttonpagination用法 <table id="tt"></table> <script> $('#tt').datagrid({ url:'datagrid_data.json', columns:[[ {field:'code',title:'Code',width:100}, {field:'name',title:'Name',width:100}, {field:'price',title:'Price',width:100,align:'right'} ]] }); </script> 数据表格(DataGrid)的特性

    其特性扩展自 panel,下列是为 datagrid 增加的特性。

    名称类型说明默认值columnsarraydatagrid 的 column 的配置对象,更多详细请参见 column 的特性。nullfrozenColumnsarray和列的特性一样,但是这些列将被冻结在左边。nullfitColumnsbooleanTrue 就会自动扩大或缩小列的尺寸以适应表格的宽度并且防止水平滚动。falsestripedbooleanTrue 就把行条纹化。(即奇偶行使用不同背景色)falsemethodstring请求远程数据的 method 类型。postnowrapbooleanTrue 就会把数据显示在一行里。trueidFieldstring标识字段。nullurlstring从远程站点请求数据的 URL。nullloadMsgstring当从远程站点加载数据时,显示的提示信息。 Processing, please wait…paginationbooleanTrue 就会在 datagrid 的底部显示分页栏。falserownumbersbooleanTrue 就会显示行号的列。falsesingleSelectbooleanTrue 就会只允许选中一行。falsepageNumbernumber当设置了 pagination 特性时,初始化页码。1pageSizenumber当设置了 pagination 特性时,初始化页码尺寸。10pageListarray当设置了 pagination 特性时,初始化页面尺寸的选择列表。[10,20,30,40,50]queryParamsobject当请求远程数据时,发送的额外参数。{}sortNamestring定义可以排序的列。nullsortOrderstring定义列的排序顺序,只能用 asc 或 desc。ascremoteSortboolean定义是否从服务器给数据排序。trueshowFooterboolean定义是否显示一行页脚。falserowStylerfunction返回例如 'background:red' 的样式,该函数需要两个参数:
    rowIndex: 行的索引,从0 开始。
    rowData:此行相应的记录。nullloadFilterfunction返回过滤的数据去显示。这个函数需要一个参数 data ,表示原始数据。 你可以把原始数据变成标准数据格式,此函数必须返回标准数据对象,含有total和 rows特性。nulleditorsobject定义编辑行时的 editor 。 预定义的 editornullviewobject定义 datagrid 的 view 。 默认的 viewnull列(Column)的特性

    DataGrid 的 Column 是一个数组对象,它的每个元素也是一个数组。数组元素的元素是一个配置对象,它定义了每个列的字段。

    名称类型说明默认值titlestring列的标题文字。undefinedfieldstring列的字段名。undefinedwidthnumber列的宽度。undefinedrowspannumber指一个单元格占据多少行。undefinedcolspannumber指一个单元格占据多少列。undefinedalignstring指如何对齐此列的数据,可以用 left、right、center。undefinedsortablebooleanTrue 就允许此列被排序。undefinedresizablebooleanTrue 就允许此列被调整尺寸。undefinedhiddenbooleanTrue 就隐藏此列。undefinedcheckboxbooleanTrue 就显示 checkbox。undefinedformatterfunction单元格的格式化函数,需要三个参数:value: 字段的值。rowData: 行的记录数据。 rowIndex: 行的索引。undefinedstylerfunction单元格的样式函数,返回样式字符串来自定义此单元格的样式,例如 background:red 。此函数需要三个参数: 
    value: 字段的值。 
    rowData: 行的记录数据。 
    rowIndex: 行的索引。undefinedsorterfunction自定义字段的排序函数,需要两个参数: 
    a: 第一个字段值。 
    b: 第二个字段值。undefinededitorstring,object指编辑类型。当是 string 时指编辑类型,当 object 时包含两个特性: 
    type:string,编辑类型,可能的类型是: text、textarea、checkbox、numberbox、validatebox、datebox、combobox、combotree。
    options:对象,编辑类型对应的编辑器选项。undefined columns : [ [ { field: 'itemid', title: 'Item ID', rowspan: 2, width: 80, sortable: true }, { field: 'productid', title: 'Product ID', rowspan: 2, width: 80, sortable: true }, { title: 'Item Details', colspan: 4 } ], [ { field: 'listprice', title: 'List Price', width: 80, align: 'right', sortable: true }, { field: 'unitcost', title: 'Unit Cost', width: 80, align: 'right', sortable: true }, { field: 'attr1', title: 'Attribute', width: 100 }, { field: 'status', title: 'Status', width: 60 } ] ] 编辑器(Editor)

    用 $.fn.datagrid.defaults.editors 重写了 defaults。

    每个编辑器有下列行为:

    名称参数说明initcontainer, options初始化编辑器并且返回目标对象。destroytarget如果必要就销毁编辑器。getValuetarget从编辑器的文本返回值。setValuetarget , value给编辑器设置值。resizetarget , width如果必要就调整编辑器的尺寸。 $.extend($.fn.datagrid.defaults.editors, { text: { init: function (container, options) { var input = $('<input type="text" class="datagrid-editable-input">').appendTo(container); return input; }, destroy: function (target) { $(target).remove(); }, getValue: function (target) { return $(target).val(); }, setValue: function (target, value) { $(target).val(value); }, resize: function (target, width) { $(target)._outerWidth(width); } } }); 数据表格视图(DataGrid View)

    用 $.fn.datagrid.defaults.view 重写了 defaults。

    view 是一个对象,它告诉 datagrid 如何呈现行。这个对象必须定义下列方法。

    名称参数说明rendertarget, container, frozen当数据加载时调用。target:DOM 对象,datagrid 对象。container:行的容器。frozen:表示是否呈现冻结容器。renderFootertarget, container, frozen这是呈现行脚选项的函数。renderRowtarget, fields, frozen, rowIndex, rowData这是选项的函数,将会被 render 函数调用。refreshRowtarget, rowIndex定义如何刷新指定的行。onBeforeRendertarget, rows视图被呈现前触发。onAfterRendertarget视图被呈现后触发。事件

    其事件扩展自 panel,下列是为 datagrid 增加的事件。

    名称参数说明onLoadSuccessdata当数据加载成功时触发。onLoadErrornone加载远程数据发生某些错误时触发。onBeforeLoadparam发送加载数据的请求前触发,如果返回 false加载动作就会取消。onClickRowrowIndex, rowData当用户点击一行时触发,参数包括: rowIndex:被点击行的索引,从 0 开始。rowData:被点击行对应的记录。onDblClickRowrowIndex, rowData当用户双击一行时触发,参数包括: rowIndex:被双击行的索引,从 0 开始。rowData:被双击行对应的记录。onClickCellrowIndex, field, value当用户单击一个单元格时触发。onDblClickCellrowIndex, field, value当用户双击一个单元格时触发。onSortColumnsort, order当用户对一列进行排序时触发,参数包括: sort:排序的列的字段名order:排序的列的顺序onResizeColumnfield, width当用户调整列的尺寸时触发。onSelectrowIndex, rowData当用户选中一行时触发,参数包括: rowIndex:选中行的索引,从 0 开始rowData:选中行对应的记录onUnselectrowIndex, rowData当用户取消选择一行时触发,参数包括: rowIndex:取消选中行的索引,从 0 开始rowData:取消选中行对应的记录onSelectAllrows当用户选中全部行时触发。onUnselectAllrows当用户取消选中全部行时触发。onBeforeEditrowIndex, rowData当用户开始编辑一行时触发,参数包括: rowIndex:编辑行的索引,从 0 开始rowData:编辑行对应的记录onAfterEditrowIndex, rowData, changes当用户完成编辑一行时触发,参数包括: rowIndex:编辑行的索引,从 0 开始rowData:编辑行对应的记录changes:更改的字段/值对onCancelEditrowIndex, rowData当用户取消编辑一行时触发,参数包括: rowIndex:编辑行的索引,从 0 开始rowData:编辑行对应的记录onHeaderContextMenue, field当 datagrid 的头部被右键单击时触发。onRowContextMenue, rowIndex, rowData当右键点击行时触发。方法名称参数说明optionsnone返回 options 对象。getPagernone返回 pager 对象。getPanelnone返回 panel 对象。getColumnFieldsfrozen返回列的字段,如果 frozen 设定为 true,冻结列的字段被返回。getColumnOptionfield返回指定列的选项。resizeparam调整尺寸和布局。loadparam加载并显示第一页的行,如果指定 param 参数,它将替换 queryParams 特性。reloadparam重新加载行,就像 load 方法一样,但是保持在当前页。reloadFooterfooter重新加载脚部的行。loadingnone显示正在加载状态。loadednone隐藏正在加载状态。fitColumnsnone使列自动展开/折叠以适应 datagrid 的宽度。fixColumnSizenone固定列的尺寸。fixRowHeightindex固定指定行的高度。loadDatadata加载本地数据,旧的行会被移除。getDatanone返回加载的数据。getRowsnone返回当前页的行。getFooterRowsnone返回脚部的行。getRowIndexrow返回指定行的索引,row 参数可以是一个行记录或者一个 id 字段的值。getSelectednone返回第一个选中的行或者 null。getSelectionsnone返回所有选中的行,当没有选中的记录时,将返回空数组。clearSelectionsnone清除所有的选择。selectAllnone选中当前页所有的行。unselectAllnone取消选中当前页所有的行。selectRowindex选中一行,行索引从 0 开始。selectRecordidValue通过 id 的值做参数选中一行。unselectRowindex取消选中一行。beginEditindex开始对一行进行编辑。endEditindex结束对一行进行编辑。cancelEditindex取消对一行进行编辑。getEditorsindex获取指定行的编辑器们。每个编辑器有下列特性:actions:编辑器能做的动作们。target:目标编辑器的 jQuery 对象。field:字段名。type:编辑器的类型。getEditoroptions获取指定的编辑器, options 参数包含两个特性: index:行的索引。field:字段名。refreshRowindex刷新一行。validateRowindex验证指定的行,有效时返回 true。updateRowparam更新指定的行, param 参数包含下列特性:index:更新行的索引。row:行的新数据。appendRowrow追加一个新行。insertRowparam插入一个新行, param 参数包括下列特性:index:插入进去的行的索引,如果没有定义,就追加此新行。row:行的数据。deleteRowindex删除一行。getChangestype获取最后一次提交以来更改的行,type 参数表示更改的行的类型,可能的值是:inserted、deleted、updated,等等。当 type 参数没有分配时,返回所有改变的行。  acceptChangesnone提交自从被加载以来或最后一次调用acceptChanges以来所有更改的数据。rejectChangesnone回滚自从创建以来或最后一次调用acceptChanges以来所有更改的数据。mergeCellsoptions把一些单元格合并为一个单元格,options 参数包括下列特性:index:列的索引。field:字段名。rowspan:合并跨越的行数。colspan:合并跨越的列数。showColumnfield显示指定的列。hideColumnfield隐藏指定的列。

    以下为demo:

    $('#coursett').datagrid({ // url: '/api/course',//rows:一页有多少条,page:请求当前页 title: '课程列表', width: 800, height: 400, fitColumns: true, method: 'GET', // http请求的方法 idField: 'id', // 主键 loadMsg: '正在加载用户的信息...', pagination: true, // 是否用分页控件 singleSelect: false, // 是否是单行选中 pageSize: 10, // 默认一页多少条 pageNumber: 1, // 默认显示第几页 pageList: [10, 20, 30], queryParams: null,//让表格在加载数据的时候,额外传输的数据。 onBeforeLoad: function (param) { // 表格控件请求之前,可以设置相关参数。 // param = {page: 1, rows: 10} param._page = param.page; param._limit = param.rows; param._sort = 'id'; param._order = 'desc'; }, loader: function (param, successfn, errorfn) { $.ajax({ url: '/api/course', data: param, // 恩国际 _page 和_limit type: 'GET', dataType: 'json', success: function (resData, status, xhr) { var total = parseInt(xhr.getResponseHeader('X-Total-Count')); var datagridData = { rows: resData.data, total: total }; successfn(datagridData); }, error: errorfn }); }, onLoadSuccess: function (data) { // 后台请求成功之后,自动调用次方法 console.log(data); }, columns: [[ { field: 'ck', checkbox: true, align: 'left', width: 50 }, { field: 'id', title: '编号', width: 80 }, { field: 'course_name', title: '课程名', width: 120 }, { field: 'author', title: '作者', width: 120 }, { field: 'college', title: '大学', width: 220 }, { field: 'category_Id', title: '分页', width: 120, formatter: function (value, row, index) { return '分类' + value; } } ]], toolbar: [{ id: 'btnDownShelf', text: '添加', iconCls: 'icon-add', handler: function () { } }, { id: 'btnDelete', text: '删除', iconCls: 'icon-cancel', handler: function () { } }, { id: 'btnEdit', text: '修改', iconCls: 'icon-edit', handler: function () { } }], onHeaderContextMenu: function (e, field) { } });

    自定义ajax请求的loader的方法,如下demo是jQuery EasyUI配合后端的json-server返回数据的demo:

    $(function () { $('#dtTable').datagrid({ loadMsg: '正在加载数据中....', emptyMsg: '没有数据', pagination: true, singleSelect: true, striped: true, idField: 'id', checkOnSelect: true, pageNumber: 1, rownumbers: true, pageSize: 10, pageList: [10, 20, 30], method: 'GET', onBeforeLoad: function (param) { // 请求之前还可以对参数进行修改和添加,_limit和_page是json-server的后台参数数据 param._limit = param.rows; param._page = param.page; }, loader: function (param, successCallback, errorCallback) { // 自定义ajax请求加载数据, param是请求的参数 // successCallback:是请求成功后的回调函数 // errorCallback:是请求失败后的回到函数 $.ajax({ url: 'http://localhost:53000/course', data: param, type: 'GET', dataType: 'json', success: function (res, status, xhr) { successCallback({ total: xhr.getResponseHeader('X-Total-Count'), rows: res }); }, error: function (data) { errorCallback(data); } }); }, onLoadSuccess: function (data, status, xhr) { console.log(data); }, columns: [[ { field: 'id', title: '主键', width: 100 }, { field: 'author', title: '作者', width: 100 }, { field: 'author', title: '作者', width: 100 }, { field: 'author', title: '作者', width: 100 }, { field: 'author', title: '作者', width: 100 }, { field: 'college', title: '大学', width: 100, align: 'right' } ]] });; }); easyui 的 Tab 组件

    tab可以直接通过html标签创建。

    <div id="tt" class="easyui-tabs" style="height:250px;" data-options="fit: true"> <div title="Tab1" style="padding:20px;display:none;"> tab1 </div> <div title="Tab2" data-options="closable:true" style="overflow:auto;padding:20px;display:none;"> tab2 </div> <div title="Tab3" data-options="iconCls:'icon-reload',closable:true" style="display:none;"> tab3 </div> </div>

    其他常用的方法:

    通过js控制添加tab标签 $('#tt').tabs('add',{ title:'New Tab', content:'Tab Body', closable:true, tools:[{ iconCls:'icon-mini-refresh', handler:function(){ alert('refresh'); } }] }); 判断tab是存在 // exists 可以接受一个 tab的索引,或者是tab的title的字符串 $('#tt').tabs('exists', 1); $('#tt').tabs('exists', 'tab1'); 选中某个tab页签 $('#tt').tabs('select', 1); $('#tt').tabs('select', 'tab1'); 获取选中的tab页签

    $('#tt').tabs('getSelected'); // 返回tab的索引


    转载自:https://malun666.github.io/aicoder_vip_doc/#/pages/jqeasyui

  • UI 96 0 1 发布

    简介

    List.js是一个非常简单且轻巧的JavaScript库,用来实现列表UI。它可以扩展对现有HTML上的列表项进行搜索和排序,以及在JS端添加项。

    主要功能

    Existing List

    这里例子展示了如何对直接记述在HTML里的「既存列表」执行搜索/过滤/排序

    Existing List + Add

    这里例子展示了如何通过JavaScript端操作对直接记述在HTML里的「既存列表」执行添加项

    New List

    这里例子展示了如何通过JavaScript端操作创建一个新的列表

  • JavaScript 147 0 1 发布

    JavaScript中变量的访问方式取决于变量的数据类型:

    基本类型
    按值访问对象类型
    按引用访问基本类型

    对象类型
  • DOM操作 93 0 1 发布
    特点:轻量级但功能强大移动列表项时有动画支持触屏设备和大多数浏览器(IE9及以下除外)支持单个列表容器内部拖拽排序,也支持两个列表容器互相拖拽排序支持拖放操作和可选择的文本非常友善的滚动效果基于原生HTML5中的拖放API支持多种框架(Angular、Vue、React等)支持所有的CSS框架,如:Bootstrap简单的API,方便调用CDN不依赖于jQuery

    下载地址:https://github.com/RubaXa/Sort...
    官方Demo:http://rubaxa.github.io/Sortab...

    范例

    单个列表容器内部拖拽排序

    <head> <script src="~/Scripts/jquery-3.3.1.min.js"></script> <script src="~/Scripts/Sortable-master/Sortable.min.js"></script> <script type="text/javascript"> $(document).ready(function () { var ul = document.getElementById("infos"); var sortable = new Sortable(ul, { handle: "input,li",//设置li、input支持拖拽 animation: 150,//设置动画时长 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此处指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infos li"); //拖拽完毕后重新设置序号,使其连续 for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); }); </script> <style> li{ cursor:pointer; padding-bottom:5px; list-style:none; } </style> </head> <body> <ul id="infos"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">objective</option> <option value="2">proposition</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">eliminate</option> <option value="2">alige</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">optimize</option> <option value="2">deploy</option> </select> </li> </ul> </body>

    两个列表容器相互拖拽排序

    <span style="font-size:14.4px;"><head> <script src="~/Scripts/jquery-3.3.1.min.js"></script> <script src="~/Scripts/Sortable-master/Sortable.min.js"></script> <script type="text/javascript"> $(document).ready(function () { var infosOne = document.getElementById("infosOne"); var sortableOne = new Sortable(infosOne, { group: "guo",//若需要在两个列表容器间拖拽排序,那group的值必须相同 handle: "input,li",//设置li、input支持拖拽 animation: 150,//设置动画时长 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此处指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infosOne li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } lis = $("#infosTwo li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); var infosTwo = document.getElementById("infosTwo"); var sortableTwo = new Sortable(infosTwo, { group:"guo",//若需要在两个列表容器间拖拽排序,那group的值必须相同 handle: "input,li",//设置li、input支持拖拽 animation: 150,//设置动画时长 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此处指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infosOne li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } lis = $("#infosTwo li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); }); </script> </head> <body> <ul id="infosOne"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">objective</option> <option value="2">proposition</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">eliminate</option> <option value="2">alige</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">optimize</option> <option value="2">deploy</option> </select> </li> </ul> <hr /> <ul id="infosTwo"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">目标任务</option> <option value="2">论题议题</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">消除排除</option> <option value="2">机敏的敏捷的</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--请选择--</option> <option value="1">优化使最优化</option> <option value="2">发布部署</option> </select> </li> </ul> </body>

    常见配置项及事件

    var sortable = new Sortable(el, { group: "name", // or { name: "...", pull: [true, false, clone], put: [true, false, array] } sort: true, // sorting inside list delay: 0, // time in milliseconds to define when the sorting should start touchStartThreshold: 0, // px, how many pixels the point should move before cancelling a delayed drag event disabled: false, // Disables the sortable if set to true. store: null, // @see Store animation: 150, // ms, animation speed moving items when sorting, `0` — without animation handle: ".my-handle", // Drag handle selector within list items filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function) preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter` draggable: ".item", // Specifies which items inside the element should be draggable ghostClass: "sortable-ghost", // Class name for the drop placeholder chosenClass: "sortable-chosen", // Class name for the chosen item dragClass: "sortable-drag", // Class name for the dragging item dataIdAttr: 'data-id', forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag. scroll: true, // or HTMLElement scrollFn: function(offsetX, offsetY, originalEvent, touchEvt, hoverTargetEl) { ... }, // if you have custom scrollbar scrollFn may be used for autoscrolling scrollSensitivity: 30, // px, how near the mouse must be to an edge to start scrolling. scrollSpeed: 10, // px setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) { dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent }, // Element is chosen onChoose: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging ended onEnd: function (/**Event*/evt) { var itemEl = evt.item; // dragged HTMLElement evt.to; // target list evt.from; // previous list evt.oldIndex; // element's old index within old parent evt.newIndex; // element's new index within new parent }, // Element is dropped into the list from another list onAdd: function (/**Event*/evt) { // same properties as onEnd }, // Changed sorting within list onUpdate: function (/**Event*/evt) { // same properties as onEnd }, // Called by any change to the list (add / update / remove) onSort: function (/**Event*/evt) { // same properties as onEnd }, // Element is removed from the list into another list onRemove: function (/**Event*/evt) { // same properties as onEnd }, // Attempt to drag a filtered element onFilter: function (/**Event*/evt) { var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event. }, // Event when you move an item in the list or between lists onMove: function (/**Event*/evt, /**Event*/originalEvent) { // Example: http://jsbin.com/tuyafe/1/edit... evt.dragged; // dragged HTMLElement evt.draggedRect; // TextRectangle {left, top, right и bottom} evt.related; // HTMLElement on which have guided evt.relatedRect; // TextRectangle originalEvent.clientY; // mouse position // return false; — for cancel }, // Called when creating a clone of element onClone: function (/**Event*/evt) { var origEl = evt.item; var cloneEl = evt.clone; } }); 属性group:string or arraysort:boolean
    定义是否列表单元是否可以在列表容器内进行拖拽排序;delay:number
    定义鼠标选中列表单元可以开始拖动的延迟时间;disabled:boolean
    定义是否此sortable对象是否可用,为true时sortable对象不能拖放排序等功能,为false时为可以进行排序,相当于一个开关;animation:number
    单位:ms,定义排序动画的时间;handle:selector
    格式为简单css选择器的字符串,使列表单元中符合选择器的元素成为拖动的手柄,只有按住拖动手柄才能使列表单元进行拖动;filter:selector
    格式为简单css选择器的字符串,定义哪些列表单元不能进行拖放,可设置为多个选择器,中间用“,”分隔;draggable:selector
    格式为简单css选择器的字符串,定义哪些列表单元可以进行拖放ghostClass:selector
    格式为简单css选择器的字符串,当拖动列表单元时会生成一个副本作为影子单元来模拟被拖动单元排序的情况,此配置项就是来给这个影子单元添加一个class,我们可以通过这种方式来给影子元素进行编辑样式;chosenClass:selector
    格式为简单css选择器的字符串,当选中列表单元时会给该单元增加一个class;forceFallback:boolean
    如果设置为true时,将不使用原生的html5的拖放,可以修改一些拖放中元素的样式等;fallbackClass:string
    当forceFallback设置为true时,拖放过程中鼠标附着单元的样式;scroll:boolean
    默认为true,当排序的容器是个可滚动的区域,拖放可以引起区域滚动事件:onChoose:function
    列表单元被选中的回调函数onStart:function
    列表单元拖动开始的回调函数onEnd:function
    列表单元拖放结束后的回调函数onAdd:function
    列表单元添加到本列表容器的回调函数onUpdate:function
    列表单元在列表容器中的排序发生变化后的回调函数onRemove:function
    列表元素移到另一个列表容器的回调函数onFilter:function
    试图选中一个被filter过滤的列表单元的回调函数onMove:function
    当移动列表单元在一个列表容器中或者多个列表容器中的回调函数onClone:function
    当创建一个列表单元副本的时候的回调函数

    事件对象在各个函数中略有不同,可通过输出对象查看对象的属性,下面简单列举几个:

    to:HTMLElement--
    移动到列表容器from:HTMLElement--
    来源的列表容器item:HTMLElement--
    被移动的列表单元clone:HTMLElement--
    副本的列表单元oldIndex:number/undefined--
    在列表容器中的原序号newIndex:number/undefined--
    在列表容器中的新序号方法option(name[,value])
    获得或者设置项参数,使用方法类似于jQuery用法,没有第二个参数为获得option中第一个参数所对应的值,有第二个参数时,将重新赋给第一个参数所对应的值;closest()
    返回满足selector条件的元素集合中的第一个项toArray()
    序列化可排序的列表单元的data-id(可通过配置项中dataIdAttr修改)放入一个数组,并返回这个数组中sort()
    通过自定义列表单元的data-id的数组对列表单元进行排序save()destroy()

    声明:本文转载自https://blog.csdn.net/xiaouncl...

  • DotNet 83 0 1 发布
    定义

    程序集(Assembly)是.NET应用程序的部署单元,是组件重用,以及实施安全策略和版本策略的基本单元。

    程序集具有以下属性和特点:

    程序集以 .exe 或 .dll 文件的形式实现 程序集可以包含一个或多个模块只有在需要使用时才会将程序集加载到内存中类型

    程序集有两种类型:共享程序集和私有程序集。。

    私有程序集:
    默认是私有程序集,位于应用程序所在的同一个目录下,或者位于其子目录中。共享程序集:
    必须有一个版本号,通常安装在GAC(global assembly cache位于Windows/assembly)。任何程序都可以引用他。
    为了保护共享程序集的唯一性,我们必须在共享程序集上加上密钥。如果密钥不同即使两个组件名称相同也不是同一个组件。结构这些结构可以在一个文件中也可以在几个文件中。
    一个文件的情况多个文件的情况

    参考:https://www.cnblogs.com/luge/p/ClR_Via_CSharp_Assembly.html

  • DotNet 159 0 1 发布
    简介

    .Net Framework是一个采用系统虚拟机运行的编程平台,以通用语言运行库(Common Language Runtime)为基础,支持多种开发语言,并且可以同时进行windows应用软件和网络应用软件以及组件和服务(web 服务)的开发。

    平台组成

    .Net Framework一般而言可以将其技术分为规范和实现两部分:

    (实现)

    CLR(公共语言运行库):
    和java虚拟机一样也是也是一个运行时环境,它负责资源管理(内存分配[类型的内存分配]和垃圾回收[GC],并保证应用和底层操作系统之间的必要分离。其核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步。FCL(.Net类库):
    为.Net Framework两个核心组件之一。FCL集合了上千组可再利用的类、接口和值类型。BCL(Base Class Libraries)是FCL的一部分,提供了多数的基础功能,其中包括namespaces System,System.CodeDom,System.Collections,System.Diagnostics,System.Globalization,System IO,System.Resources,System.Text,和System.Text.RegularExpressions的类

    (规范)

    CTS(通用类型系统):
    定义了如何在运行库中声明、使用和管理类型,同时也是在运行库下支持各语言之间进行交互操作。(PS:CTS定义了在MSIL中使用的预定义类型,.Net 语言将代码解释成中间语言,其原因.Net 编译器是遵循CLS[公共语言规范]实现的)。CLS(公共语言规范):
    和通用类型系统一起确保语言的互操作型。CIL(通用中间语言):
    是一种属于通用语言框架和.Net框架的低阶的人类可读的编程语言。CTS(通用类型系统)
    建立一个支持跨语言的集成,是不通语言编写的代码直接能够交互使用。CTS可以分为两大类:值类型和引用类型,同事两种类型之间可以进行强制转换,这种转换成为Boxing(装箱)和UnBoxing(拆箱)。从图2-2可以看出通用类型系统的基本结构,CTS的每一种类型都是对象,并继承一个基类System.Object。对于值类型和引用类型的内容将会在下篇进行解释。应用程序

    (编译和运行)

    利用.Net Framework编写的代码时,不是将代码直接创建为OS的本机代码,而是将源码编译成CIL,存储在程序集里面,在执行代码时必须使用JIT编译器将代码编译为本机代码,最后在托管的CLR环境下运行本机代码,以及其他应用程序。

    JIT(Just-In-Time):
    将CIL编译为专用于操作系统和目标机器结构的本机代码,在需要时才会进行编译程序集:
    在编译期间,将CIL代码、元信息(即程序集中包含的数据的信息)、可选资源(CIL使用的其他数据,eg:图片)存储在程序集中,程序集包括可执行的应用程序(.exe)和其他应用程序的库(.dll)

    参考:

    https://www.cnblogs.com/luge/archive/2013/03/02/CSharp_NetFramework_Brief.html
  • SAP 176 0 1 发布

    SAP Business Suite是SAP业务应用程序(包括SAP ERP)的套件产品。

    SAP Business Suite基于SAP技术平台NetWeaver。

    组成

    SAP Business Suite包含以下应用程序产品:


    ERP(Enterprise Resource Planning)
    企业资源计划CRM(Customer Relationship Management)
    客户关系管理SCM(Supply Chain Management)
    供应链管理PLM(Product Lifecycle Management)
    产品生命周期管理SRM(Supplier Relationship Management)
    供应商关系管理 世代 SAP Business Suite解决方案正式分为四代:R / 1,R / 2,R / 3和S / 4。 这里,“R”表示实时,“S”表示简单。

    R/1 1973年  在大型机上运行的会计系统R/2 1979年   R/1の进化版R/3 1992年 在各种平台上运行的客户/服务器分布式应用系统S/4 2015年   仅在HANA上运行
  • ABAP Stack 348 0 1 发布

    (转载自:https://www.cnblogs.com/zohoo/p/7295920.html

    要让外部应用能够访问SAP的Web Service(以下简称为WS),那么必须配置SAP的webservice作为服务提供者(Service Provider),则需要先后按照以下步骤进行操作:

    ①创建RFC函数 ②给RFC函数配置WS(webservice) ③使用SOAMANAGER生成WSDL(可供外部访问的XML链接) (1) 创建RFC函数

    使用T-code:SE37或者SE80,创建函数,函数组设置与编程过程这里不作详细描述。将函数属性页签中的处理类型设置为“远程启用的模块”,然后激活程序即可。


    (2)给RFC函数配置WS(webservice)

    RFC函数编写和设置完成后,可以在SE37或者SE80下通过不同的方式进入创建WS向导界面,这里将介绍三种方法(任选一种即可),具体方法如下:

     

    ①通过SE37菜单中的实用程序创建

    在SE37界面下,依次展开菜单栏上的以下菜单:实用程序-》更多实用程序-》创建WEB服务-》来自函数模块。如果WS基于函数组的话,则最后一步选择“来自函数组”即可。之后系统会进入创建WS向导。


    ②使用SE80的函数组下的函数模块直接创建

    在SE80界面下,依次展开左侧的资源浏览器,函数组-》函数组名-》功能模块,选择需要用来创建WS的远程函数名,右击-》创建-》企业服务,即可进入WS创建向导。

    ③使用SE80的包进行创建

    在SE80界面下,依次展开左侧的资源浏览器,包-》输入包名-》回车,如果包存在,则会打开,不存在则会弹出创建提示,点是进行创建,过程中可能会要求请求号,根据需要选择。在包名上右击-》创建-》企业服务,一样可以进入创建WS向导。

    通过以上三种方法中的任意一种,均可进入WS向导创建界面,这里以方法3触发向导为例,因为这样可以看到更多的配置界面。按照以下图示进行配置即可。


    这里的配置文件(Profile)是用来设置服务的安全策略的,这里建议选择第二个或者第三个,即使用用户名和密码进行访问。

    向导完成后,我们在左侧的服务目录中并不能看到我们刚刚创建的WS,这时候需要点击菜单栏上的保存按钮,才会显示出来。显示出来的WS对象名称为蓝色的,有ABAP编程经验的应该知道,这个蓝色的表示没有激活,所以,选中新建的WS,然后点击工具栏中的激活按钮进行激活,即完成WS的创建。

     

    3) 用SOAMANAGER生成WSDL(可供外部访问的XML链接)

    WS创建完成后,并不代表webservice配置完成,还需要使用SOAMANAGER来进行绑定WSDL才能被其他系统通过web方式进行访问和调用。具体操作步骤如下:

    在SAP首页输入T-Code:SOAMANAGER,回车执行,可调用IE浏览器弹出SOA的WEB管理界面,前面可能弹出IE安全提示以及SAP Webservice登录认证信息,前面已经讲过,这里不再赘述。其后步骤请按照以下图示进行配置。


    这里进行WS的安全设置,与前面创建WS时的Profile的选择有关系,将窗口下拉到“传输通道验证”板块,选择“用户标识和密码”,然后回到顶部点击“下一步”。

    在SOAP协议设置界面,保持默认,直接下一步,然后完成WSDL的生成。


    点击执行按钮后,可能会弹出用户认证信息,输入用户信息后,即可以打开XML文件了。

     

    至此,SAP作为webservice的提供者(Service Provider)已经配置完成。外部系统可以通过上面生成WSDL的链接与SAP系统进行交互了。

  • ABAP Stack 104 0 1 发布

    (转载自:https://www.cnblogs.com/zohoo/p/7295920.html)

    Webservice最终是以WSDL形式发布,即一个带有URL的XML文件。既然是URL,就必然涉及到发布服务器的域名、端口、目录等信息,因此SAP提供的webservice在能够被正常调用之前,需要对服务器的域名进行DNS解析,并且WS要发布必须要通过SAP的SOA Manager进行服务的绑定,所以还需要对SOA Manager进行的一定的设置,让其正常工作,才能进行下一步的服务绑定。具体步骤见下面章节。

    1. 通过RZ10配置服务器名称和其他参数

    服务器的参数一般是由basis来配置完成的。这里主要用来查看服务器的Hostname,以帮助下一步的DNS解析操作。

    在SAP客户端首页运行T-code:RZ10,即可进入服务器参数文件管理界面,如下图:

      点击“参数文件”旁边的搜索帮助按钮,即可弹出服务器上已有的实例和默认的参数设置,这里我们只需选择默认参数文件查看即可。选择下面的“基本维护”选项,就可以快速查看服务器默认的Hostname以及默认集团号,如下图所示:

      如果想查看更多服务器信息,可以选择参数维护概览界面的“扩展维护”选项,就可以看到服务器的详细信息,如下图所示:


    如果想修改系统的参数,建议找Basis修改,这里与webservice相关的几个重要参数为:

    login/system_client 
    登录时默认的Client号 login/fails_to_user_lock 
    密码输错多少次后锁定 rdisp/mshost 
    状态栏中显示的系统名称 Sapglobalhost 
    SAP全局主机名,这个参数就是后面需要设置的被解析的对象

    读者如果对其他参数有兴趣,可自行到互联网上查找相关信息,这里不再赘述。

     2. 配置服务器被DNS解析

    如果SAP服务器本身没有加入到所在工作环境的域控中,那么服务器的hostname默认是无法被解析到的,则需要进行服务器的host解析。常见的host解析办法有两种:集中解析和单机解析。各自的优缺点和办法如下:

    (1)集中解析

    集中解析就是将host解析条目添加到服务器所在网络的DNS服务中,一般需要联系网络管理员来添加这个解析条目。集中解析的优点就是处于该网络环境中的所有客户端主机,只要使用的默认DNS服务器,就可以直接访问发布后的webservice,而不需要在本机上做出任何操作。

    (2)单机解析

    单机解析就是在客户端电脑上,直接修改本地的host文件,具体操作如下:

    依次浏览到这个目录下:<系统盘盘符>:\Windows\System32\drivers\etc,找到下面的一个名为“hosts”不带文件类型后缀的文件,右击这个文件,选择以记事本方式打开该文件,然后在下面的空白区域添加这样一条解析:

    <SAP服务器的IP地址><SAP的hostname>

    例如: 192.168.1.10 erpdev01。这里的hostname就是我们上一步通过RZ10查看到的SAPGlobalhost中名称,添加完成后保存该文件即可正常解析了。要检验配置是否成功,只需要在命令提示符中使用PING命令即可以检测。

    3.启用SOAMANAGER服务

    前面已经介绍过SAP是通过SOAMANAGER来对外发布指定服务器的,SOAMANAGER本身其实也是一个基于Netweaver的Web Dynpro程序,当你在SAP GUI客户端执行T-Code:SOAMANAGER的时候,就会默认调用IE来打开这个WDA程序,从而实现对webservice的发布的管理。但是根据SAP官方Note1124553的说法,出于安全方面的考虑,SAP Netweaver组件安装后,默认是不激活WDA程序显示服务以及SOAMANAGER服务的,因此,需要手工通过T-Code:SICF来先激活WAD程序显示相关服务以及SOAMANAGER服务,具体需要激活的服务如下:

    ①与显示WDA程序相关的服务

    /default_host/sap/bc/webdynpro
    (注意:这里只需要激活webdynpro这个服务,不需要激活其下面的子服务。当你右键激活这个服务的时候,其子节点的服务并不会被激活,这点与我们常见的激活逻辑有区别)/default_host/sap/public/bc
    (注意:如果你激活bc下面的子服务,这里的bc服务就会自动激活,不需要再手动激活了,因此这里可以跳过这个服务,直接激活其下面的子节点服务即可)- /default_host/sap/public/bc/ur - /default_host/sap/public/bc/icons - /default_host/sap/public/bc/icons_rtl - /default_host/sap/public/bc/webicons - /default_host/sap/public/bc/pictograms - /default_host/sap/public/bc/webdynpro/* (ssr, mimes等所有子节点服务)

    ②与SOAMANAGER相关的服务

    - /default_host/sap/bc/soap  - /default_host/sap/bc/srt - /default_host/sap/bc/srt/rfc/sap - /default_host/sap/bc/webdynpro/sap  - /default_host/sap/bc/webdynpro/sap/appl_soap_management.

    具体操作步骤如下:

    在SAP首页执行T-code:SICF,打开服务定义选择界面,在“层次结构类型”中输入“Service”或者通过F4选择出这个值,然后执行,就可以进入服务管理界面,如下图所示:

       在服务管理界面,可以看到上半部分为一个服务查询的界面,可以供用户快速定位到需要的管理的服务上;下半部分为一个树形结构的服务目录,可以通过逐级展开Default host\sap\bc等等,进行服务的查找,如下图所示:


    上半部分通过查找可以快速定位到所需服务,在服务名称里面输入服务的名称,点击“应用”按钮,即可快速定位相应的服务,也可以在下半部分逐级展开目录来定位到相应的服务,如下图所示:


    在这里可以看到被激活过的服务或者目录颜色比较深,而处于待激活状态的服务或者目录呈现灰色。被激活过的对象无法被再激活,只能取消激活。这里我们选择相应的待激活的服务或者子目录(呈现灰色状态),右击-》激活服务-》选择“是”,即可以激活相应的服务或者目录。如下图所示: 


      按照上面的步骤依次激活本节开始所列举的那些服务,应该就能顺利打开SOAMANAGER了,如果还不能打开,可以根据弹出的浏览器中提示的错误来找到相应的服务进行激活即可。配置成功后可以在SAP GUI中运行T-code: SOAMANAGER来进行测试。

    在SAP首页运行T-code: SOAMANAGER,回车,会弹出IE浏览器窗口,如果成功的话,会先弹出认证框(与某些电脑的安全设置相关,也有可能先弹出IE安全站点提示信息,这时候只需要展开“详细信息”-》转到网页(不推荐)继续访问即可),输入登录信息后,就可以进入到SOA管理界面了。如下3图所示:

    如果配置失败,一般会在浏览器提示相应的错误信息。如果显示为:“无法访问此页面”或者类似的完全打不开的提示信息,请回头检查自己的网络链接是否正常,或者是前面步骤中DNS的解析是否添加成功。

     

    如果提示403错误,则表示某些服务没有启动,则可以通过显示该页面的URL,从URL中找到相应的服务,然后再按照上面激活服务的办法去激活相应的服务即可。服务没启动时,会报出403错误,如下图所示:

    在该页面空白处右击-》属性,即可以打开该页面的属性,在属性的地址中,找到URL中问号“?”前的最后一个子节点,即相应的服务。


  • ABAP Stack 78 0 1 发布

    (转载自:https://www.cnblogs.com/zohoo/p/7295920.html

    SAP的web service是在Netweaver组件通过UDDI工具,采用SOAP和WSDL这两种web服务技术,将SAP已有功能封装成webservice对象,供其他系统调用或者调用其他系统的webservice,从而实现SAP与非SAP系统(如OA、PLM等)系统的集成。SAP Netweaver提供了可以发布、查找并调用 Web 服务的工具(UDDI),可支持 NetWeaver 作为 Web 服务的服务器(Service Provider)或者客户端(Service Consumer),主要功能包括:

    提供webservice。
    它可以直接封装SAP的RFC、Function Group、BAPI、XI Message Interface等系统功能,以WEB标准协议在Internet上被其他系统进行调用; 消费webservice。
    Netweaver通过创建代理能够通过Internet直接调用采用标准协议封装的其他系统提供的webservice; 提供AS ABAP和AS JAVA环境,允许开发者使用ABAP或者JAVA开发web服务。

    本文相关专业术语解释如下:

    UDDI

    UDDI(Universal Description, Discovery, and Integration):在用户能够调用Web服务之前,必须确定这个服务内包含哪些属性与方法,找到被调用的接口定义,而这些都需要服务提供者(Service Provider)通过标准的web服务协议来进行编制。 UDDI正是这样一个工具,用户通过web在UDDI中查找并定位那些他们需要的服务。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布、编辑、浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到服务请求者或者由服务提供者返回需要的数据。


    WSDL

    WSDL (Web Services Description Language)对于服务消费者(Service Consumer)来说,要找到一个自己需要使用的服务,他必须知道如何以及从哪调用。 WSDL 规范是一个描述接口、语义以及Web服务的XML文档。给这个XML文档配置上网络地址后,就可以简单而又快捷地被查找和定位。

    SOAP

    SOAP(Simple Object Access Protocol):当商业用户通过UDDI找到你的WSDL描述文档后,它通过SOAP协议调用你建立的Web服务中的一个或多个对象从技术角度来看,SOAP详细指明了如何响应不同的请求以及如何对参数编码。一个SOAP封装了可选的头信息和正文,并且通常使用HTTP POST方法来传送到一个HTTP 服务器。SOAP同时支持消息传送和远程过程调用。

    本连载将主要介绍在SAP中配置webservice作为服务提供方(Service Provider),即将SAP方的RFC函数配置成webservice供其他系统调用。本文所用示例测试环境为S4HANA 1610,Netweaver 7.5.1,具体信息如下图所示: