主頁 > 軟體工程 > MFC富文本編輯框richedit插入圖片問題

MFC富文本編輯框richedit插入圖片問題

2020-09-13 04:34:22 軟體工程

麻煩請教一下:
1.我的richeditctrl獲取IRichEditOle指標是空的,這是為什么?
2.我的richeditctrl插入了圖片,但是圖片的大小是原大小而且尺寸可調整。我想實作像qq中的效果,無論截圖尺寸如何都可以按一定比例縮放顯示在richiedit中,且圖片不能調整大小,該如何實作?
3.如果想發送圖片,該如何獲取插入圖片的相關資料呢?

.h:
    
static DWORD CALLBACK readFunction(DWORD dwCookie,
LPBYTE lpBuf, // the buffer to fill
LONG nCount, // number of bytes to read
LONG* nRead); // number of bytes actually read

interface IExRichEditOleCallback; // forward declaration (see below in this header file)

IExRichEditOleCallback* m_pIRichEditOleCallback;
BOOL m_bCallbackSet;

interface IExRichEditOleCallback : public IRichEditOleCallback
{
public:
IExRichEditOleCallback();
virtual ~IExRichEditOleCallback();
int m_iNumStorages;
IStorage* pStorage;
DWORD m_dwRef;

virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR* lplpFrame,
LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);
virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);
virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR* lpcfFormat,
DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR* lpchrg, DWORD reco, LPDATAOBJECT FAR* lplpdataobj);
virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR* lpchrg,
HMENU FAR* lphmenu);
};
    //IRichEditOle* m_pRichEditOle;
    virtual void PreSubclassWindow();


.cpp:

DWORD CALLBACK CChatRichEditCtrl::readFunction(DWORD dwCookie,
LPBYTE lpBuf, // the buffer to fill
LONG nCount, // number of bytes to read
LONG* nRead) // number of bytes actually read
{
CFile* fp = (CFile*)dwCookie;
*nRead = fp->Read(lpBuf, nCount);
return 0;
}

/////////////////////////////////////////////////////////////////////////////

CChatRichEditCtrl::IExRichEditOleCallback::IExRichEditOleCallback()
{
pStorage = NULL;
m_iNumStorages = 0;
m_dwRef = 0;

// set up OLE storage

HRESULT hResult = ::StgCreateDocfile(NULL,
STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE /*| STGM_DELETEONRELEASE */ | STGM_CREATE,
0, &pStorage);

if (pStorage == NULL ||
hResult != S_OK)
{
AfxThrowOleException(hResult);
}
}

CChatRichEditCtrl::IExRichEditOleCallback::~IExRichEditOleCallback()
{
}

HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::GetNewStorage(LPSTORAGE* lplpstg)
{
m_iNumStorages++;
WCHAR tName[50];
swprintf_s(tName, L"REOLEStorage%d", m_iNumStorages);

HRESULT hResult = pStorage->CreateStorage(tName,
STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0, 0, lplpstg);

if (hResult != S_OK)
{
::AfxThrowOleException(hResult);
}

return hResult;
}

HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::QueryInterface(REFIID iid, void** ppvObject)
{

HRESULT hr = S_OK;
*ppvObject = NULL;

if (iid == IID_IUnknown ||
iid == IID_IRichEditOleCallback)
{
*ppvObject = this;
AddRef();
hr = NOERROR;
}
else
{
hr = E_NOINTERFACE;
}

return hr;
}



ULONG STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::AddRef()
{
return ++m_dwRef;
}



ULONG STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::Release()
{
if (--m_dwRef == 0)
{
delete this;
return 0;
}

return m_dwRef;
}


HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR* lplpFrame,
LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
return S_OK;
}


HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::ShowContainerUI(BOOL fShow)
{
return S_OK;
}



HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp)
{
    //return E_NOTIMPL;
return S_OK;
}


HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj)
{
return S_OK;
}



HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR* lpcfFormat,
DWORD reco, BOOL fReally, HGLOBAL hMetaPict)
{
return S_OK;
}


HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode)
{
return S_OK;
}



HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::GetClipboardData(CHARRANGE FAR* lpchrg, DWORD reco, LPDATAOBJECT FAR* lplpdataobj)
{
return E_NOTIMPL;
}


HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect)
{

return S_OK;
}

HRESULT STDMETHODCALLTYPE
CChatRichEditCtrl::IExRichEditOleCallback::GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR* lpchrg,
HMENU FAR* lphmenu)
{
return S_OK;
}

uj5u.com熱心網友回復:

實戰經驗:CRichEditCtrl插入圖片(不止是位圖)


uj5u.com熱心網友回復:

參考 1 樓 zgl7903 的回復:
實戰經驗:CRichEditCtrl插入圖片(不止是位圖)

謝謝,這篇文章看過了,寫的很好,但是效果還是不太理想。請問如何操作插入到richedit中的ole物件呢?應該在哪個函式中設定ole物件的尺寸,禁止在界面上修改尺寸呢?謝謝幫助,我再研究研究。

uj5u.com熱心網友回復:

學習了三四天的一點成果,如果有不對的地方還請指出。

目前發現有兩種方法來向richedit中插入ole物件:

1.直接粘貼,然后使用回呼函式來控制即將插入的ole物件。
2.自己構造一個ole物件然后呼叫richedit的方法來插入。

MFC應該對richedit插入ole物件做了封裝,只留了一個介面設定回呼函式,然后在回呼函式中對即將插入的ole物件進行處理。這種方法的廣度還是很大的,可以直接獲得ole物件中的所有資料,然后想怎么改就怎么改。但是問題是,這方面的檔案實在是有點少,找來找去只找到了一個能用的例子,而且是簡單的回傳,沒有做更多的操作。回呼函式中的很多方法和結構體完全不知道怎么使用,于是嘗試第二種方法。

大致思路是:先截圖,然后從剪切板中讀取位圖資料,轉換成CImage型別的圖片,然后對圖片進行縮放,構造ole物件,將其中的hBitmap替換成縮放圖的hBitmap,最后插入richedit。我的做法只是能實作功能而已,很多地方并不規范,實作功能簡單。如果有做過截圖和ole的大佬,也希望能夠指點一下。

大致原始碼如下:

.h

class CChatRichEditCtrl : public CRichEditCtrl
{
    CDisplayPicture*            m_pDisplayPic = nullptr;//圖片顯示幕類
    bool                        m_bPastePic = false;//粘貼的是位圖則屏蔽系統的ctrl+v
    DWORD                         m_oleCnt = 0;
    map<DWORD, CString>           m_olePathMap;//粘貼到聊天框中的ole與原圖的映射
public:
    CChatRichEditCtrl() {/* AfxInitRichEdit(); AfxInitRichEdit2(); AfxOleInit(); */}
    ~CChatRichEditCtrl(){}
    DECLARE_MESSAGE_MAP()
    afx_msg void OnPaste();
    afx_msg void OnPasteUpdateUI(CCmdUI*  pCmdUI);
    afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
    virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
    
          //這是使用回呼函式方法
static DWORD CALLBACK readFunction(DWORD dwCookie,
LPBYTE lpBuf, // the buffer to fill
LONG nCount, // number of bytes to read
LONG* nRead); // number of bytes actually read

interface IExRichEditOleCallback; // forward declaration (see below in this header file)

IExRichEditOleCallback* m_pIRichEditOleCallback;
BOOL m_bCallbackSet;

interface IExRichEditOleCallback : public IRichEditOleCallback
{
public:
IExRichEditOleCallback();
virtual ~IExRichEditOleCallback();
int m_iNumStorages;
IStorage* pStorage;
DWORD m_dwRef;

virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR* lplpFrame,
LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);
virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);
virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR* lpcfFormat,
DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR* lpchrg, DWORD reco, LPDATAOBJECT FAR* lplpdataobj);
virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR* lpchrg,
HMENU FAR* lphmenu);
};
    IRichEditOle* m_pRichEditOle;
    virtual void PreSubclassWindow();
public:
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};


.cpp

void CChatRichEditCtrl::OnPaste()
{
    //對于圖片,粘貼前需要進行處理
    if (IsClipboardFormatAvailable(CF_DIB))
    {
        GLOBALHANDLE hGMem;
        LPBITMAPINFO lpBI;
        void* pDIBBits;
        if (OpenClipboard())
        {
            hGMem = GetClipboardData(CF_DIB);
            lpBI = (LPBITMAPINFO)GlobalLock(hGMem);
            // point to DIB bits after BITMAPINFO object
            pDIBBits = (void*)(lpBI + 1);
            int width = 100 * lpBI->bmiHeader.biWidth / lpBI->bmiHeader.biHeight;
            //縮略圖高固定100,按比例計算縮略圖寬,最大200
            if (width > 200)
                width = 200;
            CRect abbpic(0,0, width,100);
            CImage image, image1, image2;
            if (m_pTeamWorkOpr)
            {
                CString path = L"C:\\Users\\Administrator\\Desktop\\新建檔案夾";

                image1.Load(path + L"system\\screenshot.bmp");//樣圖,提供格式,否則下面的GetBPP()函式錯誤,無法生成圖片
                image.Create(abbpic.Width(), abbpic.Height(), image1.GetBPP());
                image2.Create(lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight, image1.GetBPP());
                ::StretchDIBits(image2.GetDC(), 0, 0,
                    lpBI->bmiHeader.biWidth,
                    lpBI->bmiHeader.biHeight,
                    0, 0, lpBI->bmiHeader.biWidth,
                    lpBI->bmiHeader.biHeight,
                    pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY);
                //保存原圖
                image2.Save(path + L"system\\oriscreenshot.png");
                string pathStr = StringWideToAnsi((path + L"system\\oriscreenshot.png").GetBuffer());
                //生成md5作為檔案名另存檔案,用于之后ole物件和圖片的關聯
                //生成md5用的第三方庫,可以生成GUID代替md5做檔案名
                string md5 = CalcFileMd5(pathStr);
                CString md5Name;
                md5Name = StringAnsiToWide(md5).c_str();
                CString md5Path;
                md5Path = path + L"system\\OriScreenShot\\" + md5Name + L".png";
                image2.Save(md5Path);
                HBITMAP bitmap2 = image2.Detach();
                image2.ReleaseDC();
                ::StretchDIBits(image.GetDC(),
                    abbpic.left, abbpic.top,
                    abbpic.Width(), abbpic.Height(),
                    0, 0, lpBI->bmiHeader.biWidth,
                    lpBI->bmiHeader.biHeight,
                    pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY);
                //保存縮略圖
                GlobalUnlock(hGMem);
                image.Save(path + L"system\\abbscreenshot.png");
                HBITMAP bitmap = image.Detach();
                image.ReleaseDC();
                CloseClipboard();

                STGMEDIUM stgm;
                stgm.tymed = TYMED_GDI;
                stgm.hBitmap = bitmap;//在這里將圖片hBitmap換成縮略圖的
                stgm.pUnkForRelease = NULL;

                FORMATETC fm;
                fm.cfFormat = CF_BITMAP;
                fm.ptd = NULL;
                fm.dwAspect = DVASPECT_CONTENT;
                fm.lindex = -1;
                fm.tymed = TYMED_GDI;

                IStorage* pStorage;
                LPLOCKBYTES lpLockBytes = NULL;
                SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
                if (sc != S_OK) AfxThrowOleException(sc);
                ASSERT(lpLockBytes != NULL);
                sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
                if (sc != S_OK)
                {
                    VERIFY(lpLockBytes->Release() == 0);
                    lpLockBytes = NULL;
                    AfxThrowOleException(sc);

                }
                ASSERT(pStorage != NULL);

                COleDataSource* pDataSource = new COleDataSource;
                pDataSource->CacheData(CF_BITMAP, &stgm);
                LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);

                LPOLECLIENTSITE lpClientSite;
                GetIRichEditOle()->GetClientSite(&lpClientSite);
                //創建OLE物件
                IOleObject* pOleObject;
                sc = OleCreateStaticFromData(lpDataObject, IID_IOleObject, OLERENDER_FORMAT,
                    &fm, lpClientSite, pStorage, (void**)&pOleObject);
                if (sc != S_OK) AfxThrowOleException(sc);


                //插入OLE物件
                REOBJECT reobject;
                ZeroMemory(&reobject, sizeof(REOBJECT));
                reobject.cbStruct = sizeof(REOBJECT);

                CLSID clsid;
                sc = pOleObject->GetUserClassID(&clsid);
                if (sc != S_OK)
                    AfxThrowOleException(sc);

                reobject.clsid = clsid;
                reobject.cp = REO_CP_SELECTION;
                reobject.dvaspect = DVASPECT_CONTENT;
                reobject.poleobj = pOleObject;
                reobject.polesite = lpClientSite;
                reobject.pstg = pStorage;
                reobject.dwUser = m_oleCnt++;//每次插入ole物件的索引,洗掉不做處理

                //REOBJECT obj;
                //obj.cbStruct = sizeof(obj);
                //  if (GetPic(&obj))
                //  {
                //  long lStart, lEnd;
                //  pTextIn1->GetSel(lStart, lEnd);
                //  pTextIn1->SetSel(obj.cp, obj.cp + 1);
                //  pTextIn1->Clear();
                // 
                //  pTextIn1->GetIRichEditOle()->InsertObject(&reobject);
                // 
                //  pTextIn1->SetSel(lStart, lEnd);
                // 
                //  }
                // else
                // {
                GetIRichEditOle()->InsertObject(&reobject);

                // }

                delete pDataSource;
                SendMessage(EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
                SetFocus();
                m_olePathMap.insert(make_pair(reobject.dwUser, md5Path));//關聯ole和原圖
                m_bPastePic = true;
            }
        }
    }
}

BOOL CChatRichEditCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加專用代碼和/或呼叫基類

if (pMsg->message == WM_KEYDOWN)
{
        if(pMsg->wParam == 0x56 && GetAsyncKeyState(VK_CONTROL))
        //0x56是'v'鍵,但是不知道為什么,直接寫pMsg->wParam == 'v'不好使 
        {
            m_bPastePic = false;
            OnPaste();
            if (m_bPastePic)
                return TRUE;//屏蔽ctrl+v
        }
}

return CRichEditCtrl::PreTranslateMessage(pMsg);
}

uj5u.com熱心網友回復:

CHARFORMAT2  中有說明  
 dwMask  CFM_PROTECTED The CFE_PROTECTED value is valid.
 dwEffects  CFE_PROTECTED Characters are protected; an attempt to modify them will cause an EN_PROTECTED notification message.

To receive EN_PROTECTED notifications, SetEventMask specify ENM_PROTECTED in the mask sent with the EM_SETEVENTMASK message. 

EN_PROTECTED Notification
Return Value
This message returns zero to allow the operation.
This message returns a nonzero value to prevent the operation.




轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/20124.html

標籤:界面

上一篇:OnCreateClient

下一篇:electron的應用hook dll失敗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more