1. 程式人生 > >實現基於FTL模板的選單之一

實現基於FTL模板的選單之一

有前面我們提到過,在OFBIZ中form和screen以及樹形目錄,都是可以通過xml來定義,再通過ftl的模板來生成的,但是選單卻不可以這樣。雖然我們也可以在xml檔案中配置我們的選單。但是轉換為html時是在HtmlMenuRenderer通過在JAVA程式碼在硬編碼實現的。從OFBIZ程式碼我們可以知道在未來,OFBIZ會支援FTL模板,但是到到目前為止(12.04版本)還沒有實現功能。那麼我們可不可以自己動手來實現這個模板呢?答案是肯定的。
思路是通過在java 程式碼中生成對ftl巨集的呼叫。然後在ftl模板中定義這些巨集即可。最後讓OFBIZ載入我們的選單模板即可。

首先們需要建立一個建一個新的類並且實現MenuStringRenderer。這個類就叫作 MacroMenuRenderer 吧。
實現的程式碼可以是如下。
   
/**
* Widget Library - Form Renderer implementation based on Freemarker macros
*
*/
public class MacroMenuRenderer implements MenuStringRenderer {

   
        public static final String module = MacroTreeRenderer.class.getName();
        protected HttpServletRequest request;
    protected String userLoginIdAtPermGrant;
    protected boolean userLoginIdHasChanged = true;
    private Template macroLibrary;
    private WeakHashMap<Appendable, Environment> environments = new WeakHashMap<Appendable, Environment>();

    protected boolean widgetCommentsEnabled = false;
    

    public MacroMenuRenderer(String macroLibraryPath, Appendable writer,HttpServletRequest request) throws TemplateException, IOException {
        this.macroLibrary = FreeMarkerWorker.getTemplate(macroLibraryPath);
        this.request = request;
    }

    
    private void executeMacro(Appendable writer, String macro) throws IOException {
        try {
            Environment environment = getEnvironment(writer);
            Reader templateReader = new StringReader(macro);
            // FIXME: I am using a Date as an hack to provide a unique name for the template...
            Template template = new Template((new java.util.Date()).toString(), templateReader, FreeMarkerWorker.getDefaultGorun8Config());
            templateReader.close();
            environment.include(template);
        } catch (TemplateException e) {
            Debug.logError(e, "Error rendering screen macro [" + macro + "] thru ftl", module);
        } catch (IOException e) {
            Debug.logError(e, "Error rendering screen macro [" + macro + "] thru ftl", module);
        }
    }

    private void executeMacro(Appendable writer, String macroName, Map<String, Object> parameters) throws IOException {
        StringBuilder sb = new StringBuilder("<@");
        sb.append(macroName);
        if (parameters != null) {
            for (Map.Entry<String, Object> parameter : parameters.entrySet()) {
                sb.append(' ');
                sb.append(parameter.getKey());
                sb.append("=");
                Object value = parameter.getValue();
                if (value instanceof String) {
                    sb.append('"');
                    sb.append(((String) value).replaceAll("\"", "\\\\\""));
                    sb.append('"');
                } else {
                    sb.append(value);
                }
            }
        }
        sb.append(" />");
        executeMacro(writer, sb.toString());
    }

    private Environment getEnvironment(Appendable writer) throws TemplateException, IOException {
        Environment environment = environments.get(writer);
        if (environment == null) {
            Map<String, Object> input = UtilMisc.toMap("key", null);
            environment = FreeMarkerWorker.renderTemplate(macroLibrary, input, writer);
            environments.put(writer, environment);
        }
        return environment;
    }
   
    public void renderFormatSimpleWrapperRows(Appendable writer, Map<String, Object> context, Object menuObj) throws IOException {
        List<ModelMenuItem> menuItemList = ((ModelMenu) menuObj).getMenuItemList();
        for (ModelMenuItem currentMenuItem: menuItemList) {
            renderMenuItem(writer, context, currentMenuItem);
        }
    }

    public void renderMenuItem(Appendable writer, Map<String, Object> context, ModelMenuItem menuItem) throws IOException {

        //Debug.logInfo("in renderMenuItem, menuItem:" + menuItem.getName() + " context:" + context ,"");
        boolean hideThisItem = isHideIfSelected(menuItem, context);
        if (hideThisItem)
        {
                return;
        }

        String style = menuItem.getWidgetStyle();
        if (menuItem.isSelected(context)) {
            style = menuItem.getSelectedStyle();
            if (UtilValidate.isEmpty(style)) {
                style = "selected";
            }
        }
        String name = menuItem.getName();

        if (menuItem.getDisabled() || this.isDisableIfEmpty(menuItem, context)) {
            style = menuItem.getDisabledTitleStyle();
        }
        String alignStyle = menuItem.getAlignStyle();
        String toolTip = menuItem.getTooltip(context);
        Link link = menuItem.getLink();
        
        StringWriter sr = new StringWriter();
        sr.append("<@renderMenuItemOpen ");
        sr.append(" style=\"");
        sr.append(style);
        sr.append("\" alignStyle=\"");
        sr.append(alignStyle);
        sr.append("\" toolTip=\"");
        sr.append(toolTip);
        sr.append("\" name=\"");
        sr.append(name);
        sr.append("\" />");
      //  executeMacro(writer, sr.toString());
        
        if (link != null) {
                renderLink(writer, context, link);
        } else {
            String txt = menuItem.getTitle(context);
            StringUtil.SimpleEncoder simpleEncoder = (StringUtil.SimpleEncoder) context.get("simpleEncoder");
            if (simpleEncoder != null) {
                txt = simpleEncoder.encode(txt);
            }
            //sr = new StringWriter();
            sr.append("<@renderMenuItemText ");
            sr.append(" text=\"");
            sr.append(txt);
            sr.append("\" />");
            //executeMacro(writer, sr.toString());
        }
        
        if (!menuItem.getMenuItemList().isEmpty()) {
                //sr = new StringWriter();
                sr.append("<@renderSubMenuOpen/> ");
                // executeMacro(writer, sr.toString());
                for (ModelMenuItem childMenuItem : menuItem.getMenuItemList()) {
                childMenuItem.renderMenuItemString(writer, context, this);
            }
                //sr = new StringWriter();
            sr.append("<@renderSubMenuClose/>");
            //executeMacro(writer, sr.toString());
        }
        //sr = new StringWriter();
        sr.append("<@renderMenuItemClose/>");
        executeMacro(writer, sr.toString());
        
    }
    
    public boolean isDisableIfEmpty(ModelMenuItem menuItem, Map<String, Object> context) {
        boolean disabled = false;
        String disableIfEmpty = menuItem.getDisableIfEmpty();
        if (UtilValidate.isNotEmpty(disableIfEmpty)) {
            List<String> keys = StringUtil.split(disableIfEmpty, "|");
            for (String key: keys) {
                Object obj = context.get(key);
                if (obj == null) {
                    disabled = true;
                    break;
                }
            }
        }
        return disabled;
    }
         
        
        /**
     * Renders the beginning boundary comment string.
     * @param writer The writer to write to
     * @param widgetType The widget type: "Screen Widget", "Form Widget", etc.
     * @param modelWidget The widget
     */
    public void renderBeginningBoundaryComment(Appendable writer, String widgetType, ModelWidget modelWidget) throws IOException {
        if (this.widgetCommentsEnabled) {
            StringWriter sr = new StringWriter();
            sr.append("<@formatBoundaryComment ");
            sr.append(" boundaryType=\"");
            sr.append("Begin");
            sr.append("\" widgetType=\"");
            sr.append(widgetType);
            sr.append("\" widgetName=\"");
            sr.append(modelWidget.getBoundaryCommentName());
            sr.append("\" />");
            executeMacro(writer, sr.toString());
        }
    }

    /**
     * Renders the ending boundary comment string.
     * @param writer The writer to write to
     * @param widgetType The widget type: "Screen Widget", "Form Widget", etc.
     * @param modelWidget The widget
     */
    public void renderEndingBoundaryComment(Appendable writer, String widgetType, ModelWidget modelWidget) throws IOException {
        if (this.widgetCommentsEnabled) {
            StringWriter sr = new StringWriter();
            sr.append("<@formatBoundaryComment ");
            sr.append(" boundaryType=\"");
            sr.append("End");
            sr.append("\" widgetType=\"");
            sr.append(widgetType);
            sr.append("\" widgetName=\"");
            sr.append(modelWidget.getBoundaryCommentName());
            sr.append("\" />");
            executeMacro(writer, sr.toString());
        }
    }
     
        public void renderMenuOpen(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {

        if (!userLoginIdHasChanged) {
            userLoginIdHasChanged = userLoginIdHasChanged();
        }
        this.widgetCommentsEnabled = ModelWidget.widgetBoundaryCommentsEnabled(context);
        renderBeginningBoundaryComment(writer, "Menu Widget", modelMenu);
        String menuId = modelMenu.getId();
        String menuContainerStyle = modelMenu.getMenuContainerStyle(context);
        String menuWidth = modelMenu.getMenuWidth();
        String menuTitle = modelMenu.getTitle(context);
        int menuItemCount = modelMenu.renderedMenuItemCount(context);
        
        StringWriter sr = new StringWriter();
        sr.append("<@renderMenuOpen ");
        sr.append(" menuId=\"");
        sr.append(menuId);
        sr.append("\" containerStyle=\"");
        sr.append(menuContainerStyle);
        sr.append("\" menuWidth=\"");
        sr.append(menuWidth);
        sr.append("\" menuTitle=\"");
        sr.append(menuTitle);
        sr.append("\" menuItemCount=\"");
        sr.append(String.valueOf(menuItemCount));
        sr.append("\" />");
        
        executeMacro(writer, sr.toString());
    }

    /* (non-Javadoc)
     * @see cn.gorun8.widget.menu.MenuStringRenderer#renderMenuClose(java.io.Writer, java.util.Map, cn.gorun8.widget.menu.ModelMenu)
     */
    public void renderMenuClose(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
        // TODO: div can't be directly inside an UL
        String fillStyle = modelMenu.getFillStyle();
        int menuItemCount = modelMenu.renderedMenuItemCount(context);
        renderEndingBoundaryComment(writer, "Menu Widget", modelMenu);
       
        StringWriter sr = new StringWriter();
        sr.append("<@renderMenuClose ");
        sr.append(" fillStyle=\"");
        sr.append(fillStyle);
        sr.append("\" menuItemCount=\"");
        sr.append(String.valueOf(menuItemCount));
        sr.append("\" />");
        
        executeMacro(writer, sr.toString());
        
        userLoginIdHasChanged = userLoginIdHasChanged();
        GenericValue userLogin = (GenericValue)request.getSession().getAttribute("userLogin");
        if (userLogin != null) {
            String userLoginId = userLogin.getString("userLoginId");
            //request.getSession().setAttribute("userLoginIdAtPermGrant", userLoginId);
            setUserLoginIdAtPermGrant(userLoginId);
            //Debug.logInfo("in HtmlMenuRenderer, userLoginId(Close):" + userLoginId + " userLoginIdAtPermGrant:" + request.getSession().getAttribute("userLoginIdAtPermGrant"),"");
        } else {
            request.getSession().setAttribute("userLoginIdAtPermGrant", null);
        }
    }

    public void renderFormatSimpleWrapperOpen(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
        //appendWhitespace(writer);
    }

    public void renderFormatSimpleWrapperClose(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
        //appendWhitespace(writer);
    }

    

    /**
     * @param string
     */
    public void setUserLoginIdAtPermGrant(String string) {
            //Debug.logInfo("in HtmlMenuRenderer,  userLoginIdAtPermGrant(setUserLoginIdAtPermGrant):" + string,"");
        this.userLoginIdAtPermGrant = string;
    }

    public String getUserLoginIdAtPermGrant() {
        return this.userLoginIdAtPermGrant;
    }

    public boolean isHideIfSelected(ModelMenuItem menuItem, Map<String, Object> context) {
        ModelMenu menu = menuItem.getModelMenu();
        String currentMenuItemName = menu.getSelectedMenuItemContextFieldName(context);
        String currentItemName = menuItem.getName();
        Boolean hideIfSelected = menuItem.getHideIfSelected();
            //Debug.logInfo("in HtmlMenuRenderer, currentMenuItemName:" + currentMenuItemName + " currentItemName:" + currentItemName + " hideIfSelected:" + hideIfSelected,"");
        return (hideIfSelected != null && hideIfSelected.booleanValue() && currentMenuItemName != null && currentMenuItemName.equals(currentItemName));
    }


    public boolean userLoginIdHasChanged() {
        boolean hasChanged = false;
        GenericValue userLogin = (GenericValue)request.getSession().getAttribute("userLogin");
        userLoginIdAtPermGrant = getUserLoginIdAtPermGrant();
        //userLoginIdAtPermGrant = (String)request.getSession().getAttribute("userLoginIdAtPermGrant");
        String userLoginId = null;
        if (userLogin != null)
            userLoginId = userLogin.getString("userLoginId");
            //Debug.logInfo("in HtmlMenuRenderer, userLoginId:" + userLoginId + " userLoginIdAtPermGrant:" + userLoginIdAtPermGrant ,"");
        if ((userLoginId == null && userLoginIdAtPermGrant != null)
           || (userLoginId != null && userLoginIdAtPermGrant == null)
           || ((userLoginId != null && userLoginIdAtPermGrant != null)
              && !userLoginId.equals(userLoginIdAtPermGrant))) {
            hasChanged = true;
        } else {
            if (userLoginIdAtPermGrant != null)
               hasChanged = true;
            else
               hasChanged = false;

            userLoginIdAtPermGrant = null;
        }
        return hasChanged;
    }


    public void setUserLoginIdHasChanged(boolean b) {
        userLoginIdHasChanged = b;
    }


    public String getTitle(ModelMenuItem menuItem, Map<String, Object> context) {
        String title = null;
        title = menuItem.getTitle(context);
        return title;
    }

    public void renderLink(Appendable writer, Map<String, Object> context, ModelMenuItem.Link link) throws IOException {
            String target = link.getTarget(context);
        ModelMenuItem menuItem = link.getLinkMenuItem();
        if (menuItem.getDisabled() || isDisableIfEmpty(menuItem, context)) {
            target = null;
        }
        HttpServletResponse response = (HttpServletResponse) context.get("response");
        //HttpServletRequest request = (HttpServletRequest) context.get("request");

        String targetWindow = link.getTargetWindow(context);
        String uniqueItemName = menuItem.getModelMenu().getName() + "_" + menuItem.getName() + "_LF_" + UtilMisc.<String>addToBigDecimalInMap(context, "menuUniqueItemIndex", BigDecimal.ONE);
        String linkType = WidgetWorker.determineAutoLinkType(link.getLinkType(), target, link.getUrlMode(), request);
        String id = link.getId(context);
        String style = link.getStyle(context);
        String name = link.getName(context);
        String confirmationMsg = link.getConfirmation(context);
        String text = link.getText(context);
        
        String imgid ="";
        String imgstyle ="";
        String imgwid = "";
        String imghgt = "";
        String imgborder = "";
        String imgsrc = "";
        
        
        StringBuffer tmpbuf = new StringBuffer();
            StringBufferWriter strWriter =  new StringBufferWriter(tmpbuf);
        WidgetWorker.buildHyperlinkUrl(strWriter, target, link.getUrlMode(), null, link.getPrefix(context),
                link.getFullPath(), link.getSecure(), link.getEncode(), request, response, context);
        String hyperlinkUrl = strWriter.toString();
        
        
        Image image = link.getImage();
        if (image != null) {
                imgid = image.getId(context);
                imgstyle = image.getStyle(context);
                imgwid = image.getWidth(context);
                imghgt = image.getHeight(context);
                imgborder = image.getBorder(context);
                imgsrc = image.getSrc(context);
                
                imgid = UtilValidate.isNotEmpty(imgid)?imgid:"";
                imgstyle = UtilValidate.isNotEmpty(imgstyle)?imgstyle:"";
                imgwid = UtilValidate.isNotEmpty(imgwid)?imgwid:"";
                imghgt = UtilValidate.isNotEmpty(imghgt)?imghgt:"";
                imgborder = UtilValidate.isNotEmpty(imgborder)?imgborder:"";
                imgsrc = UtilValidate.isNotEmpty(imgsrc)?imgsrc:"";
         }  
  
        StringWriter sr = new StringWriter();
        sr.append("<@renderLink ");
        sr.append("  targetWindow=\"");
        sr.append( targetWindow);
        sr.append("\"  uniqueItemName=\"");
        sr.append( uniqueItemName);
        sr.append("\"  linkType=\"");
        sr.append( linkType);
        sr.append("\"  id=\"");
        sr.append( id);
        sr.append("\"  style=\"");
        sr.append( style);
        sr.append("\"  name=\"");
        sr.append( name);
        sr.append("\"  confirmationMsg=\"");
        sr.append( confirmationMsg);
        sr.append("\"  imgid=\"");
        sr.append( imgid);
        sr.append("\"  imgstyle=\"");
        sr.append( imgstyle);
        sr.append("\"  imgwid=\"");
        sr.append( imgwid);
        sr.append("\"  imghgt=\"");
        sr.append( imghgt);
        sr.append("\"  imgborder=\"");
        sr.append( imgborder);
        sr.append("\"  imgsrc=\"");
        sr.append( imgsrc);
        sr.append("\"  text=\"");
        sr.append( text);
        sr.append("\"  hyperlinkUrl=\"");
        sr.append( hyperlinkUrl);
        
        
        sr.append("\" />");
        executeMacro(writer, sr.toString());
        
    }

    
     

    public void renderImage(Appendable writer, Map<String, Object> context, ModelMenuItem.Image image) throws IOException {
        // open tag
        writer.append("<img ");
        String id = image.getId(context);
         
        
        
        if (UtilValidate.isNotEmpty(id)) {
            writer.append(" id=\"");
            writer.append(id);
            writer.append("\"");
        }
        String style = image.getStyle(context);
        if (UtilValidate.isNotEmpty(style)) {
            writer.append(" class=\"");
            writer.append(style);
            writer.append("\"");
        }
        String wid = image.getWidth(context);
        if (UtilValidate.isNotEmpty(wid)) {
            writer.append(" width=\"");
            writer.append(wid);
            writer.append("\"");
        }
        String hgt = image.getHeight(context);
        if (UtilValidate.isNotEmpty(hgt)) {
            writer.append(" height=\"");
            writer.append(hgt);
            writer.append("\"");
        }
        String border = image.getBorder(context);
        if (UtilValidate.isNotEmpty(border)) {
            writer.append(" border=\"");
            writer.append(border);
            writer.append("\"");
        }
        String src = image.getSrc(context);
        if (UtilValidate.isNotEmpty(src)) {
            writer.append(" src=\"");
            String urlMode = image.getUrlMode();
            boolean fullPath = false;
            boolean secure = false;
            boolean encode = false;
            HttpServletResponse response = (HttpServletResponse) context.get("response");
            HttpServletRequest request = (HttpServletRequest) context.get("request");
            if (urlMode != null && urlMode.equalsIgnoreCase("gorun8")) {
                if (request != null && response != null) {
                    ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
                    RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
                    String urlString = rh.makeLink(request, response, src, fullPath, secure, encode);
                    writer.append(urlString);
                } else {
                    writer.append(src);
                }
            } else  if (urlMode != null && urlMode.equalsIgnoreCase("content")) {
                if (request != null && response != null) {
                    StringBuilder newURL = new StringBuilder();
                    ContentUrlTag.appendContentPrefix(request, newURL);
                    newURL.append(src);
                    writer.append(newURL.toString());
                }
            } else {
                writer.append(src);
            }

            writer.append("\"");
        }
        writer.append("/>");
    }
}

明天我們將講如何定義FTL模板。

相關推薦

實現基於FTL模板選單之一

有前面我們提到過,在OFBIZ中form和screen以及樹形目錄,都是可以通過xml來定義,再通過ftl的模板來生成的,但是選單卻不可以這樣。雖然我們也可以在xml檔案中配置我們的選單。但是轉換為html時是在HtmlMenuRenderer通過在JAVA程式碼在硬編碼實

基於freemarker實現excel的模板匯出

這裡簡單介紹一下使用freemarker的好處,適用於複雜的模板匯出功能,並且還可以保持原有模板的一些方法。  第一步:新增依賴 我的專案是基於maven,所以在pom.xml中新增一下依賴就可以了: <dependency>     &nb

[開源] FreeSql 配套工具,基於 Razor 模板實現最高相容的生成器

FreeSql 經過半年的開發和堅持維護,在 0.6.x 版本中完成了幾大重要事件: 1、按小包拆分,每個資料庫實現為單獨 dll; 2、實現 .net framework 4.5 支援; 3、同時支援 MySql.Data、MySqlConnector 的實現; 4、自定義導航屬性關係的配置; 5、配套工具

華為如何實現基於Git的跨地域協同開發

git 跨地域協同開發跨地域開發的需求其實由來已久,在IT/互聯網發展的早期就已存在,只不過限於當時網絡環境的因素,無法在線上有效的完成協同工作,所以沒法實際開展。而隨著近十年網絡的快速發展,跨地域協同開發線變得可能而且越來越普遍,尤其是在大公司內部。同時隨著行業的發展,敏捷開發模式的不斷推廣,軟件交付和更

【推薦系統實戰】:C++實現基於用戶的協同過濾(UserCollaborativeFilter)

color style popu ted std 相似度 abi ear result 好早的時候就打算寫這篇文章,可是還是參加阿裏大數據競賽的第一季三月份的時候實驗就完畢了。硬生生是拖到了十一假期。自己也是醉了。。。找工作不是非常順利,希望寫點東西回想一下知識。然後再

基於bootstrap模板-現代瀏覽器博物館網頁源代碼

tabindex 軟件 () divider mod mpat 測試 safari apc <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=

擼代碼--類QQ聊天實現(基於linux 管道 信號 共享內存)

time 針對 -s .net water pos 關閉 mes sigint 一:任務描寫敘述 A,B兩個進程通過管道通信,像曾經的互相聊天一樣,然後A進程每次接收到的數據通過A1進程顯示(一個新進程,用於顯示A接收到的信息),A和A1

0543-實踐配置apahe服務並實現基於虛擬主機的實踐

linux1 apache下載: 登錄官網:http://www.apache.org/ 根據下圖提示下載 下載版本為: httpd-2.2.34.tar.gz (二進制源碼)2 在web02機器配置、編譯、安裝apache 2.1 apache 安裝####apac

elasticsearch使用More like this實現基於內容的推薦

無限 itl percent 結果 忽略 class terms query col 基於內容的推薦通常是給定一篇文檔信息,然後給用戶推薦與該文檔相識的文檔。Lucene的api中有實現查詢文章相似度的接口,叫MoreLikeThis。Elasticsearch封裝了該接口

實現基於最近鄰內插和雙線性內插的圖像縮放

spa 實現 多圖像 掌握 機器 圖像處理 必須掌握 res c++ 平時我們寫圖像處理的代碼時,如果需要縮放圖片,我們都是直接調用圖像庫的resize函數來完成圖像的縮放。作為一個機器視覺或者圖像處理算法的工作者,圖像縮放代碼的實現應該是必須掌握的。在眾多圖像縮放算法中,

Nginx實現基於ip的訪問控制(Ngx_http_access_module模塊)

nginx;web服務器;Nginx實現基於ip的訪問控制功能:(Ngx_http_access_module)官方文檔:http://nginx.org/en/docs/http/ngx_http_access_module.html官方示例:The ngx_http_access_module modul

C#實現基於ffmpeg加虹軟的人臉識別

ffmpeg 開源 基於 進行 space 包裝 php c# 同時 基於ffmpeg和虹軟人臉識別庫的C#開源實現,對虹軟人臉識別庫進行了包裝,便於在C#中快速、安全的調用識別函數。同時,開源代碼中,包含完整的實現示例 http://pic.cnhubei.com

centos7實現基於源碼編譯安裝LAMP的wordpress應用

centos7 編譯安裝 最新版 lamp 的 wordpress計劃:host1 安裝 httpd , phphost2 安裝 mariadb 準備軟件:apr-1.6.2.tar.gz httpd-2.4.27.tar.bz2 php-7.1.10.tar.xz

實現基於MySQL管理rsyslog日誌

mysql 管理 rsyslog 實驗概要: 本實驗主機默認采用系統為Centos 6.9 host1主機作為遠程日誌客戶端 安裝:rsyslog (默認安裝)、rsyslog-mysql host2主機作為日誌服務器 安裝:mysql(默認安裝,也可安裝

Angular2中實現基於TypeScript的對象合並方法:extend()

boolean script string ext true false member jquer blog TypeScript裏面沒有現成的合並對象的方法,這裏借鑒jQuery裏的$.extend()方法。寫了一個TypeScript的對象合並方法,使用方法和jQuer

實現基於FQDN虛擬主機

linux、http實現基於FQDN虛擬主機環境:該實驗的環境是在centos6上進行的,http的版本為2.2步驟一:安裝http2.2直接使用yum命令安裝即可步驟二:在/app目錄下準備好存放網站主頁的目錄site1,site2,site3分別對應www.a.com,www.b.com, www.c.c

實驗-----實現基於文件驗證的vsftpd虛擬用戶

基於文件驗證的vsftpd虛擬用戶準備安裝包:yum install vsftpd啟動服務: systemctl start vsftpd 步驟:一、創建虛擬用戶數據庫文件①編輯文本文件vim /etc/vsftpd/ftpuser.txt 奇數行是用戶名,偶數行是密碼 ftpuser1 12

實現基於LNMP的電子商務網站

linux實現基於LNMP的電子商務網站:1. yum方式安裝mariadb、 mariadb-server、 php-mysql、 php、 php-fpm 2.下載小米商城源碼, 解壓縮到/data/web目錄, 修改權限為nobody3.修改nginx配置, 把nginx.conf.default模板復

實現基於小米的電子商務平臺架構

linux在Centos7中實現基於LNMP的電子商務網站一、環境準備:搭建電子商務網站之前首先要準備一個好的安裝環境systemctl status firewalld(查看一下防火墻的狀態)systemctl stop firewalld(關閉防火墻)iptables -F(清空防火墻裏面的規則)gete

實現基於LVS負載均衡集群的電商網站架構

nat lvs dr 實現基於LVS負載均衡集群的電商網站架構具體如何實現電商網站請參看博客:http://13150617.blog.51cto.com/13140617/1978954實驗一、實現基於NAT模式的LVS負載均衡:準備三臺主機:一臺Director(橋接網卡、僅主機網卡):