Android Webkit Log -- Click a link

WebCore事件处理流程
本文记录了一次WebCore中事件处理的具体流程,包括事件分发、本地事件处理及监听器触发等关键步骤。通过跟踪日志,详细展示了不同时间点上各类事件处理函数的调用情况。


07-05 08:30:30.655: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii

07-05 08:30:30.655: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:30.657: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:30.658: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:30.658: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.686: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:30.689: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:30.689: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.691: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:30.691: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:30.691: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.692: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:30.694: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.698: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:30.699: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:30.699: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.701: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:30.701: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.702: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:30.702: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:30.723: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:30.723: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:30.902: D/webcoreglue(1337): wokao WebView
07-05 08:30:30.976: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:30.976: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.038: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): updateAppearance@external/webkit/Source/WebCore/editing/SelectionController.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): setSelection@external/webkit/Source/WebCore/rendering/RenderView.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): updateAppearance@external/webkit/Source/WebCore/editing/SelectionController.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): setSelection@external/webkit/Source/WebCore/rendering/RenderView.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.039: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.124: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.124: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.124: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.124: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.125: E/webcoreglue(1337): setSelection@external/webkit/Source/WebCore/editing/SelectionController.cpp hii
07-05 08:30:31.125: E/webcoreglue(1337): notifyRendererOfSelectionChange@external/webkit/Source/WebCore/editing/SelectionController.cpp hii
07-05 08:30:31.125: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.125: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.128: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.128: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.128: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.308: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.308: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.332: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.335: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.342: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.358: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.363: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.378: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.395: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.398: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.412: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.419: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.430: E/webcoreglue(1337): parseMappedAttribute@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:31.433: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.434: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.434: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.438: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.439: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.439: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.440: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.440: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.449: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.450: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.450: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.452: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.452: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.453: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.454: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.455: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.456: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.457: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.457: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.459: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.459: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.460: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.461: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.462: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.463: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.464: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.465: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.468: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.469: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.469: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.470: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.472: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.473: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.474: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.475: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.478: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.479: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.479: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.480: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.480: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.480: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.480: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.481: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.481: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.482: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.483: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/page/DOMWindow.cpp hii
07-05 08:30:31.485: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:31.560: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.561: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.561: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.562: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:31.562: E/webcoreglue(1337): updateAppearance@external/webkit/Source/WebCore/editing/SelectionController.cpp hii
07-05 08:30:31.562: E/webcoreglue(1337): setSelection@external/webkit/Source/WebCore/rendering/RenderView.cpp hii
07-05 08:30:32.013: E/webcoreglue(1337): endDeferredRepaints@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:32.014: E/webcoreglue(1337): updateDeferredRepaintDelay@external/webkit/Source/WebCore/page/FrameView.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): dispatchMouseEvent@external/webkit/Source/WebCore/page/EventHandler.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): updateMouseEventTargetNode@external/webkit/Source/WebCore/page/EventHandler.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): defaultEventHandler@external/webkit/Source/WebCore/html/HTMLAnchorElement.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): dispatchEvent@external/webkit/Source/WebCore/dom/EventDispatcher.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): fireEventListeners@external/webkit/Source/WebCore/dom/EventTarget.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.142: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii
07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/EventContext.cpp hii

07-05 08:30:38.143: E/webcoreglue(1337): handleLocalEvents@external/webkit/Source/WebCore/dom/WindowEventContext.cpp hii



<template> <div class="d-flex h-100"> <!-- 左侧菜单 --> <aside class="left-nav d-flex flex-column"> <div class="top-bar"> <img src="../../public/images/logo.png" height="30" width="30"/> 守诚堂小程序后台 </div> <ul class="nav nav-pills flex-column flex-grow-1 mb-auto"> <li class="nav-item"> <a class="nav-link active" data-bs-toggle="collapse" href="#sysMenu" @click.prevent> <i class="bi bi-gear-fill me-1"></i>系统管理 </a> <div class="collapse show" id="sysMenu"> <ul class="list-unstyled ps-3"> <li><a class="nav-link" @click="activeName='User'">用户管理</a></li> <li><a class="nav-link" @click="activeName='Perm'">用户权限</a></li> <li><a class="nav-link" @click="activeName='Log'">系统日志</a></li> </ul> </div> </li> <li class="nav-item"> <a class="nav-link" data-bs-toggle="collapse" href="#orderMenu" @click.prevent> <i class="bi bi-truck me-1"></i>订单管理 </a> <div class="collapse" id="orderMenu"> <ul class="list-unstyled ps-3"> <li><a class="nav-link" @click="activeName='Order'">查询订单</a></li> <li><a class="nav-link" @click="activeName='About'">物流管理</a></li> </ul> </div> </li> </ul> </aside> <!-- 右侧主体 --> <div class="flex-grow-1 d-flex flex-column bg-light"> <!-- 面包屑 --> <nav class="main-h px-3 bg-white border-bottom d-flex align-items-center"> <ol class="breadcrumb mb-0"> <li class="breadcrumb-item"><span class="text-primary" role="button" @click="activeName='Home'">首页</span></li> <li class="breadcrumb-item">系统管理</li> <li class="breadcrumb-item active">{{ activeTitle }}</li> </ol> </nav> <!-- 动态组件出口 --> <div class="flex-grow-1 p-3"> <component :is="currentComponent"/> </div> </div> </div> </template> <script> import About from '@/views/AboutView.vue' import Home from '@/views/HomeView.vue' export default { name: 'HomePage', components: {About,Home}, data() { return { activeName: 'User' // 默认先显示用户管理(就地) } }, computed: { activeTitle() { const titles = { Home: '首页', User: '用户管理', Perm: '用户权限', Log: '系统日志', Order: '查询订单', About: '物流管理' } return titles[this.activeName] || '用户管理' }, currentComponent() { // 还没建的页面统一用空 div 占位 const map = { Home: 'Home', User: 'div', Perm: 'div', Log: 'div', Order: 'div', About: 'About' // 唯一真实组件 } return map[this.activeName] || 'div' } }, methods: { addUser() { console.log('新增') }, loadData() { console.log('刷新') } } } </script> <style scoped> /* 原来样式完全保留,无需改动 */ html, body, #app { height: 100%; overflow: hidden; } .left-nav { width: 220px; background: #2c1c4b; height: 100vh; overflow-y: auto; padding: 0 !important; } .left-nav::-webkit-scrollbar { width: 0; } .top-bar { height: 48px; line-height: 48px; padding: 0 20px; color: #fff; font-weight: 600; border-bottom: 1px solid #2c1c4b; } .nav-link { color: #fff !important; font-size: 15px; padding: .65rem 20px !important; border-radius: 0 !important; box-shadow: none !important; cursor: pointer; } .nav-link:hover { background: #2c1c4b; } .nav-link.active { background: #2c1c4b; } .main-h { height: 48px; line-height: 48px; } </style> 帮我在这段代码加上左菜单选择高亮显示
最新发布
11-05
<template> <div class="home-page"> <!-- 头部导航栏 --> <header class="navbar"> <div class="navbar-container"> <div class="logo"> <img src="@/assets/images/lion.png" alt="Logo" /> <span>舞狮</span> </div> <nav class="nav-links"> <ul> <li><router-link to="/">首页</router-link></li> <li><router-link to="/history">历史溯源</router-link></li> <li><router-link to="/art">艺术特色</router-link></li> <li><router-link to="/craft">匠心技艺</router-link></li> <li><router-link to="/modern">现代传承</router-link></li> <li><router-link to="/events">更多活动</router-link></li> <li><router-link to="/pending1">待定</router-link></li> <li><router-link to="/pending2">待定</router-link></li> </ul> </nav> <div class="search-login"> <button>登录<router-link to="/login"></router-link></button> </div> </div> </header> <!-- 页面主体内容 --> <main> <h1 class="page-title">粤西醒狮文化</h1> <div class="category-grid"> <CultureCard v-for="category in cultureStore.categories" :key="category.id" :title="category.name" :description="category.description" :image="category.coverImage" @click="$router.push(`/cultural/${category.id}`)" /> </div> </main> </div> </template> <script setup> import { useCultureStore } from '@/stores/culture.store' import CultureCard from '@/components/cultural/CultureCard.vue' const cultureStore = useCultureStore() cultureStore.fetchCategories() cultureStore.categories.forEach(cat => { console.log(cat.name, cat.cover_image) }) console.log('后端分类数据初始化', cultureStore) console.log('后端分类数据初始化', cultureStore.categories) </script> <style scoped> /* 导航栏样式 */ .navbar { background-color: #ccc; padding: 1rem 2rem; position: relative; } .navbar::before { content: ''; position: absolute; top: -5px; left: 0; width: 100%; height: 5px; border-radius: 5px; background: linear-gradient(to right, #00bfff, #ff4a4a); } .navbar-container { display: flex; justify-content: space-between; align-items: center; max-width: 1200px; margin: 0 auto; } .logo { display: flex; align-items: center; color: #333; left: 10px; font-size: 1.5rem; font-weight: bold; } .logo img { width: 30px; height: 30px; margin-right: 10px; } .nav-links ul { list-style: none; display: flex; gap: 2rem; margin: 0; padding: 0; } .nav-links li a { text-decoration: none; color: #666; font-size: 1rem; transition: color 0.3s ease; } .nav-links li a:hover, .nav-links li a.router-link-exact-active { color: #ff4a4a; } .search-login { display: flex; align-items: center; } .search-login input { padding: 0.5rem; border: 1px solid #ddd; border-radius: 5px; margin-right: 1rem; } .search-login button { padding: 0.5rem 1rem; background-color: #ff4a4a; color: white; border: none; border-radius: 5px; cursor: pointer; } .search-login button:hover { background-color: #e74c3c; } /* 页面主体内容样式 */ .page-title { text-align: center; margin-top: 2rem; font-size: 2rem; color: #333; } .category-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 2rem; padding: 2rem 0; } </style> <template> <div class="culture-card" @click="$emit('click')"> <div class="card-image"> <img :src="fullImageUrl" :alt="title" class="card-img"> </div> <div class="card-body"> <h3>{{ title }}</h3> <p class="description">{{ description }}</p> </div> </div> </template> <script setup> import { computed } from 'vue'; const props = defineProps({ title: String, description: String, image: String }); const fullImageUrl = computed(() => { if (!props.image) return ''; if (props.image.startsWith('http')) return props.image; return `http://localhost:8080/${props.image.replace(/^\//, '')}`; }); </script> <style scoped> .culture-card { border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); transition: transform 0.3s; cursor: pointer; background: white; } .culture-card:hover { transform: translateY(-5px); } .card-image img { width: 100%; height: 200px; object-fit: cover; } .card-body { padding: 1rem; } .description { color: #666; font-size: 0.9rem; display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; } </style>
06-18
为什么我点击查看和编辑两个功能是一样的,我需要查看功能是这样的,编辑一开始是正常的为什么做完查看功能就变成这样了ViewModal.vue <template> <a-modal v-model:open="open" title="系统授权" width="650px" :footer="null" :body-style="{ maxHeight: '70vh', overflowY: 'auto', padding: '20px' }" @cancel="onClose" > <!-- 搜索框 --> <div style=""> <a-input-search v-model:value="searchText" placeholder="输入系统名称" enter-button="搜索" size="large" @search="handleSearch" @change="handleSearchChange" /> <div style="margin-top: 8px; display: flex; justify-content: space-between; align-items: center;"> <a-button type="link" size="small" @click="showAllSystems" v-if="isSearchMode" > <template #icon><ArrowLeftOutlined /></template> 返回全部系统 </a-button> <span style="font-size: 12px; color: #666; margin-left: auto;"> {{ isSearchMode ? `找到 ${displaySystems.length} 个匹配项` : `共 ${displaySystems.length} 个系统` }} </span> </div> </div> <!-- 已选系统展示 --> <div v-if="selectedSystems.length > 0" style="margin-bottom: 16px;"> <div style="font-weight: bold; color: #1890ff; margin-bottom: 8px;"> 已选择的系统 ({{ selectedSystems.length }} 个) </div> <div style="border: 1px solid #91d5ff; border-radius: 6px; padding: 12px; background-color: #f0f8ff;"> <a-tag v-for="system in selectedSystems" :key="system.id" color="blue" closable @close="removeSelectedSystem(system.id)" style="margin: 4px;" > {{ system.sysName }} </a-tag> </div> </div> <!-- 加载状态 --> <div v-if="loading" style="text-align: center; padding: 20px;"> <a-spin size="large" /> <div style="margin-top: 10px; color: #666;">加载中...</div> </div> <!-- 系统列表/搜索结果 --> <div v-else style="margin-bottom: 16px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <span style="font-weight: bold; color: #1890ff;"> {{ isSearchMode ? '搜索结果' : '系统列表' }} </span> <span style="font-size: 12px; color: #52c41a;"> 已选择 {{ selectedSystems.length }} 个系统 </span> </div> <div :style="{ maxHeight: '330px', overflowY: 'auto', border: isSearchMode ? '1px solid #d9f7be' : '1px solid #f0f0f0', borderRadius: '6px', padding: '8px', backgroundColor: isSearchMode ? '#f6ffed' : 'transparent' }" > <a-list :data-source="displaySystems" :pagination="false" :locale="{ emptyText: isSearchMode ? '未找到匹配的系统' : '暂无系统数据' }" > <template #renderItem="{ item }"> <a-list-item :style="{ cursor: 'pointer', padding: '8px 12px', borderBottom: '1px solid #f0f0f0', backgroundColor: selectedSystem?.id === item.id ? '#e6f7ff' : 'transparent' }" @click="selectItem(item)" > <a-list-item-meta :description="item.description" > <template #title> <div style="display: flex; align-items: center;"> <span style="margin-right: 8px;">{{ item.sysName }}</span> </div> </template> </a-list-item-meta> <template #actions> <a-checkbox :checked="isSelected(item.id)" @change="(e) => handleCheckboxChange(e, item)" > </a-checkbox> </template> </a-list-item> </template> </a-list> </div> </div> <div style="text-align: center; margin-top: 16px;"> <a-button @click="selectAll" class="btn-margin">全选</a-button> <a-button @click="unselectAll" class="btn-margin">清空</a-button> <a-button @click="handleConfirm" type="primary" class="btn-margin" :loading="confirmLoading" :disabled="selectedSystems.length === 0" > 确定 </a-button> <a-button @click="onClose" class="btn-margin">关闭</a-button> </div> </a-modal> </template> <script setup> import { ref, computed } from 'vue' import { message } from "ant-design-vue"; import userApi from '@/api/sys/userApi' const open = ref(false) const content = ref('') const currentRecord = ref({}) const searchText = ref('') const currentSysCode = ref('') const selectedSystem = ref(null) const isSearchMode = ref(false) const allSystems = ref([]) const loading = ref(false) const selectedSystems = ref([]) const confirmLoading = ref(false) // 计算属性:根据搜索模式显示不同的系统列表 const displaySystems = computed(() => { if (isSearchMode.value && searchText.value.trim()) { return allSystems.value.filter(item => item.sysName && item.sysName.includes(searchText.value) || (item.description && item.description.includes(searchText.value)) ) } else { return allSystems.value } }) const onOpen = async (record) => { currentRecord.value = record currentSysCode.value = record.id open.value = true content.value = '正在加载数据...' searchText.value = '' selectedSystem.value = null isSearchMode.value = false loading.value = true allSystems.value = [] selectedSystems.value = [] try { // 调用真实API获取数据 const response = await userApi.getUserSysData(record.id) let systemsData = [] // 处理不同的响应结构 if (Array.isArray(response)) { // 如果响应直接是数组 systemsData = response } else if (response && response.code === 200) { // 如果响应是 CommonResult 格式 systemsData = response.data || [] } else if (response && response.success) { // 如果响应是其他格式 systemsData = response.data || [] } allSystems.value = systemsData // 加载用户已授权的系统 await loadUserAuthorizedSystems(record.id) if (allSystems.value.length > 0) { content.value = '请从系统列表中选择一个系统查看详情...' message.success(`加载了 ${allSystems.value.length} 个系统授权数据`) // 自动选择第一个系统 selectItem(allSystems.value[0]) } else { content.value = '该用户暂无系统授权数据' message.info('该用户暂无系统授权数据') } } catch (error) { console.error('获取系统授权数据失败', error) content.value = '数据加载失败: ' + (error.message || '网络错误') } finally { loading.value = false } } // 加载用户已授权的系统 const loadUserAuthorizedSystems = async (userId) => { try { const response = await userApi.getUserSystems(userId) let authorizedSystemNames = [] if (Array.isArray(response)) { authorizedSystemNames = response } else if (response && response.code === 200) { authorizedSystemNames = response.data || [] } // 根据系统名称选中对应的系统 if (authorizedSystemNames.length > 0) { selectedSystems.value = allSystems.value.filter(system => authorizedSystemNames.includes(system.sysName) ) } } catch (error) { console.error('加载用户已授权系统失败', error) // 如果接口不存在或其他错误,静默处理 } } // 确定按钮处理 - 保存用户系统授权 const handleConfirm = async () => { if (selectedSystems.value.length === 0) { message.warning('请至少选择一个系统') return } confirmLoading.value = true try { const selectedSystemNames = selectedSystems.value.map(system => system.sysName) const requestData = { userId: currentRecord.value.id, systemNames: selectedSystemNames } console.log('发送的请求数据:', requestData) // 调用API保存数据 const response = await userApi.saveUserSystem(requestData) // 更健壮的响应处理 if (response && response.code === 200) { message.success(response.msg || '系统授权保存成功') // 重新加载用户系统数据 await loadUserAuthorizedSystems(currentRecord.value.id) onClose() } else if (response === null || response === undefined) { message.success('系统授权保存成功') await loadUserAuthorizedSystems(currentRecord.value.id) onClose() } else { const errorMsg = response.msg || '保存失败' message.error(errorMsg) console.error('保存失败详情:', response) } } catch (error) { console.error('保存系统授权失败', error) // 即使捕获到错误,也检查是否实际保存成功 message.error('保存失败: ' + (error.message || '未知错误')) } finally { confirmLoading.value = false } } // 移除已选系统 const removeSelectedSystem = (systemId) => { selectedSystems.value = selectedSystems.value.filter(system => system.id !== systemId) message.info('已移除该系统') } const handleSearch = () => { if (!searchText.value.trim()) { isSearchMode.value = false message.info("已清空搜索") return } isSearchMode.value = true const results = displaySystems.value if (results.length === 0) { message.info('未找到匹配的系统') } else { message.success(`找到 ${results.length} 个匹配的系统`) } } const handleSearchChange = () => { if (!searchText.value.trim()) { isSearchMode.value = false } else { isSearchMode.value = true } } const showAllSystems = () => { isSearchMode.value = false searchText.value = '' message.info('已显示全部系统') } const selectAll = () => { // 只选择当前显示的系统 const currentDisplayIds = displaySystems.value.map(system => system.id) const newSelectedSystems = [...selectedSystems.value] displaySystems.value.forEach(system => { if (!newSelectedSystems.some(selected => selected.id === system.id)) { newSelectedSystems.push(system) } }) selectedSystems.value = newSelectedSystems message.success(`已选择全部 ${displaySystems.value.length} 个系统`) } const unselectAll = () => { selectedSystems.value = [] message.info('已取消所有选择') } const isSelected = (systemId) => { return selectedSystems.value.some(system => system.id === systemId) } const handleCheckboxChange = (e, item) => { const checked = e.target.checked if (checked) { // 添加检查,避免重复添加 if (!selectedSystems.value.some(system => system.id === item.id)) { selectedSystems.value.push({...item}) // 创建新对象避免引用问题 } } else { selectedSystems.value = selectedSystems.value.filter(system => system.id !== item.id) } } const selectItem = (item) => { selectedSystem.value = item // 显示该系统的详细信息 content.value = `系统名称: ${item.sysName}\n系统ID: ${item.id}\n用户代码: ${item.userCode || '无'}\n删除标志: ${item.deleteFlag || '无'}` } const onClose = () => { open.value = false content.value = '' currentRecord.value = {} searchText.value = '' currentSysCode.value = '' selectedSystem.value = null isSearchMode.value = false allSystems.value = [] loading.value = false selectedSystems.value = [] confirmLoading.value = false } defineExpose({ onOpen }) </script> <style scoped> :deep(.ant-modal-body) { padding: 20px; } /* 自定义滚动条样式 */ :deep(::-webkit-scrollbar) { width: 6px; height: 6px; } :deep(::-webkit-scrollbar-track) { background: #f1f1f1; border-radius: 3px; } :deep(::-webkit-scrollbar-thumb) { background: #c1c1c1; border-radius: 3px; } :deep(::-webkit-scrollbar-thumb:hover) { background: #a8a8a8; } .btn-margin:not(:first-child) { margin-left: 8px; } /* 禁用状态的确定按钮样式 */ :deep(.ant-btn-primary[disabled]) { background-color: #f5f5f5; border-color: #d9d9d9; color: rgba(0, 0, 0, 0.25); } </style> ------------------------------------------------------------------------------------ index.vue <template> <a-row :gutter="10"> <a-col :xs="24" :sm="24" :md="24" :lg="5" :xl="5"> <a-card :bordered="false" :loading="cardLoading" class="left-tree-container mb-3"> <a-tree v-if="treeData.length > 0" v-model:expandedKeys="defaultExpandedKeys" :tree-data="treeData" :field-names="treeFieldNames" @select="treeSelect" > </a-tree> <a-empty v-else :image="Empty.PRESENTED_IMAGE_SIMPLE" /> </a-card> </a-col> <a-col :xs="24" :sm="24" :md="24" :lg="19" :xl="19"> <a-card :bordered="false" class="xn-mb10"> <a-form ref="searchFormRef" name="advanced_search" class="ant-advanced-search-form" :model="searchFormState"> <a-row :gutter="24"> <a-col :span="8"> <a-form-item name="searchKey" :label="$t('common.searchKey')"> <a-input v-model:value="searchFormState.searchKey" :placeholder="$t('user.placeholderNameAndSearchKey')" /> </a-form-item> </a-col> <a-col :span="8"> <a-form-item name="userStatus" :label="$t('user.userStatus')"> <a-select v-model:value="searchFormState.userStatus" :placeholder="$t('user.placeholderUserStatus')" :getPopupContainer="(trigger) => trigger.parentNode" > <a-select-option v-for="item in statusData" :key="item.value" :value="item.value">{{ item.label }}</a-select-option> </a-select> </a-form-item> </a-col> <a-col :span="8"> <a-button type="primary" @click="tableRef.refresh(true)"> <template #icon><SearchOutlined /></template> {{ $t('common.searchButton') }} </a-button> <a-button class="snowy-button-left" @click="reset"> <template #icon><redo-outlined /></template> {{ $t('common.resetButton') }} </a-button> </a-col> </a-row> </a-form> </a-card> <a-card :bordered="false"> <s-table ref="tableRef" :columns="columns" :data="loadData" :expand-row-by-click="true" bordered :alert="options.alert.show" :row-key="(record) => record.id" :row-selection="options.rowSelection" > <template #operator class="table-operator"> <a-space> <a-button type="primary" @click="formRef.onOpen(undefined, searchFormState.orgId)"> <template #icon><plus-outlined /></template> <span>{{ $t('common.addButton') }}{{ $t('model.user') }}</span> </a-button> <a-button @click="ImpExpRef.onOpen()"> <template #icon><import-outlined /></template> <span>{{ $t('common.imports') }}</span> </a-button> <a-button @click="exportBatchUserVerify"> <template #icon><export-outlined /></template> {{ $t('user.batchExportButton') }} </a-button> <xn-batch-button :buttonName="$t('common.batchRemoveButton')" icon="DeleteOutlined" buttonDanger :selectedRowKeys="selectedRowKeys" @batchCallBack="deleteBatchUser" /> </a-space> </template> <template #bodyCell="{ column, record }"> <template v-if="column.dataIndex === 'avatar'"> <a-avatar :src="record.avatar" style="margin-bottom: -5px; margin-top: -5px" /> </template> <template v-if="column.dataIndex === 'gender'"> {{ $TOOL.dictTypeData('GENDER', record.gender) }} </template> <template v-if="column.dataIndex === 'userStatus'"> <a-switch :loading="loading" :checked="record.userStatus === 'ENABLE'" @change="editStatus(record)" /> </template> <template v-if="column.dataIndex === 'action'"> <a @click="formRef.onOpen(record)">{{ $t('common.editButton') }}</a> <a-divider type="vertical" /> <a @click="handleView(record)">查看</a> <a-divider type="vertical" /> <a-popconfirm :title="$t('user.popconfirmDeleteUser')" placement="topRight" @confirm="removeUser(record)"> <a-button type="link" danger size="small"> {{ $t('common.removeButton') }} </a-button> </a-popconfirm> <a-divider type="vertical" /> <a-dropdown> <a class="ant-dropdown-link"> {{ $t('common.more') }} <DownOutlined /> </a> <template #overlay> <a-menu> <a-menu-item> <a-popconfirm :title="$t('user.popconfirmResatUserPwd')" placement="topRight" @confirm="resetPassword(record)" > <a>{{ $t('user.resetPassword') }}</a> </a-popconfirm> </a-menu-item> <a-menu-item> <a @click="selectRole(record)">{{ $t('user.grantRole') }}</a> </a-menu-item> <a-menu-item> <a @click="grantResourceFormRef.onOpen(record)">{{ $t('user.grantResource') }}</a> </a-menu-item> <a-menu-item> <a @click="grantPermissionFormRef.onOpen(record)">{{ $t('user.grantPermission') }}</a> </a-menu-item> <a-menu-item> <a @click="exportUserInfo(record)">{{ $t('user.exportUserInfo') }}</a> </a-menu-item> </a-menu> </template> </a-dropdown> </template> </template> </s-table> </a-card> </a-col> </a-row> <Form ref="formRef" @successful="tableRef.refresh()" /> <xn-role-selector ref="RoleSelectorPlusRef" :org-tree-api="selectorApiFunction.orgTreeApi" :role-page-api="selectorApiFunction.rolePageApi" :add-show="false" :show="false" :role-global="true" @onBack="roleBack" /> <ImpExp ref="ImpExpRef" /> <grantResourceForm ref="grantResourceFormRef" @successful="tableRef.refresh()" /> <grantPermissionForm ref="grantPermissionFormRef" @successful="tableRef.refresh()" /> <ViewModal ref="viewModalRef" /> </template> <script setup name="sysUser"> import { message, Empty } from 'ant-design-vue' import { isEmpty } from 'lodash-es' import tool from '@/utils/tool' import downloadUtil from '@/utils/downloadUtil' import userApi from '@/api/sys/userApi' import orgApi from '@/api/sys/orgApi' import Form from './form.vue' import ImpExp from './impExp.vue' import GrantResourceForm from './grantResourceForm.vue' import GrantPermissionForm from './grantPermissionForm.vue' import ViewModal from "@/views/sys/user/ViewModal.vue"; import { ref } from 'vue' const columns = [ { title: '头像', dataIndex: 'avatar', align: 'center', width: '80px' }, { title: '账号', dataIndex: 'account', ellipsis: true }, { title: '姓名', dataIndex: 'name' }, { title: '性别', dataIndex: 'genderName', width: '50px' }, { title: '手机', dataIndex: 'phone', ellipsis: true }, { title: '机构', dataIndex: 'orgName', ellipsis: true }, { title: '职位', dataIndex: 'positionName', ellipsis: true }, { title: '状态', dataIndex: 'userStatus', width: '80px' }, { title: '操作', dataIndex: 'action', align: 'center', width: '295px' } ] const statusData = tool.dictList('COMMON_STATUS') const searchFormRef = ref() const defaultExpandedKeys = ref([]) const searchFormState = ref({}) const tableRef = ref(null) const treeData = ref([]) const selectedRowKeys = ref([]) const treeFieldNames = { children: 'children', title: 'name', key: 'id' } const formRef = ref(null) const RoleSelectorPlusRef = ref() const selectedRecord = ref({}) const loading = ref(false) const cardLoading = ref(true) const ImpExpRef = ref() const grantResourceFormRef = ref() const grantPermissionFormRef = ref() // 表格查询 返回 Promise 对象 const loadData = (parameter) => { return userApi.userPage(Object.assign(parameter, searchFormState.value)).then((res) => { return res }) } // 左侧树查询 orgApi.orgTree().then((res) => { cardLoading.value = false if (res !== null) { treeData.value = res if (isEmpty(defaultExpandedKeys.value)) { // 默认展开2级 treeData.value.forEach((item) => { // 因为0的顶级 if (item.parentId === '0') { defaultExpandedKeys.value.push(item.id) // 取到下级ID if (item.children) { item.children.forEach((items) => { defaultExpandedKeys.value.push(items.id) }) } } }) } } }) // 列表选择配置 const options = { alert: { show: false, clear: () => { selectedRowKeys.value = ref([]) } }, rowSelection: { onChange: (selectedRowKey, selectedRows) => { selectedRowKeys.value = selectedRowKey } } } // 重置 const reset = () => { searchFormRef.value.resetFields() tableRef.value.refresh(true) } // 点击树查询 const treeSelect = (selectedKeys) => { if (selectedKeys.length > 0) { searchFormState.value.orgId = selectedKeys.toString() } else { delete searchFormState.value.orgId } tableRef.value.refresh(true) } // 修改状态 const editStatus = (record) => { loading.value = true if (record.userStatus === 'ENABLE') { userApi .userDisableUser(record) .then(() => { tableRef.value.refresh() }) .finally(() => { loading.value = false }) } else { userApi .userEnableUser(record) .then(() => { tableRef.value.refresh() }) .finally(() => { loading.value = false }) } } // 删除用户 const removeUser = (record) => { let params = [ { id: record.id } ] userApi.userDelete(params).then(() => { tableRef.value.refresh() }) } // 批量导出校验并加参数 const exportBatchUserVerify = () => { if ((selectedRowKeys.value.length < 1) & !searchFormState.value.searchKey & !searchFormState.value.userStatus) { message.warning('请输入查询条件或勾选要导出的信息') } if (selectedRowKeys.value.length > 0) { const params = { userIds: selectedRowKeys.value .map((m) => { return m }) .join() } exportBatchUser(params) return } if (searchFormState.value.searchKey || searchFormState.value.userStatus) { const params = { searchKey: searchFormState.value.searchKey, userStatus: searchFormState.value.userStatus } exportBatchUser(params) } } // 批量导出 const exportBatchUser = (params) => { userApi.userExport(params).then((res) => { downloadUtil.resultDownload(res) tableRef.value.clearSelected() }) } // 批量删除 const deleteBatchUser = (params) => { userApi.userDelete(params).then(() => { tableRef.value.clearRefreshSelected() }) } // 打开角色选择器 const selectRole = (record) => { selectedRecord.value = record // 查询到已有角色,并转为ids的格式,给角色选择器 const param = { id: record.id } userApi.userOwnRole(param).then((data) => { RoleSelectorPlusRef.value.showModel(data) }) } // 角色选择回调 const roleBack = (value) => { let params = { id: selectedRecord.value.id, roleIdList: [] } if (value.length > 0) { value.forEach((item) => { params.roleIdList.push(item) }) } userApi.grantRole(params).then(() => {}) } // 重置用户密码 const resetPassword = (record) => { userApi.userResetPassword(record).then(() => {}) } // 导出用户信息 const exportUserInfo = (record) => { const params = { id: record.id } userApi.userExportUserInfo(params).then((res) => { downloadUtil.resultDownload(res) }) } // 传递设计器需要的API const selectorApiFunction = { orgTreeApi: (param) => { return userApi.userOrgTreeSelector(param).then((data) => { return Promise.resolve(data) }) }, rolePageApi: (param) => { return userApi.userRoleSelector(param).then((data) => { return Promise.resolve(data) }) } } const viewModalRef = ref() const handleView = async (record) => { viewModalRef.value.onOpen(record) try{ } catch (error) { console.error('获取用户详情失败', error) } } </script> <style scoped> .ant-form-item { margin-bottom: 0 !important; } .snowy-table-avatar { margin-top: -10px; margin-bottom: -10px; } .snowy-button-left { margin-left: 8px; } </style>
10-31
这是我的Login.vue <template> <h1 class="LoginTitle">用户登录</h1> <form @submit.prevent="Login"> 邮箱: <input v-model="form.email" type="email" placeholder="邮箱" required> <p></p> 密码: <input v-model="form.password" type="password" placeholder="密码" required minlength="8"> <p></p> <button type="submit">登录</button> <p></p> <div class="register-link"> 没有账号?<router-link to="/register">立即注册</router-link> </div> <p class="error">{{ errorMsg }}</p> </form> </template> <script> export default { name: 'LoginView', } </script> <script setup> import { ref } from 'vue'; import { useRouter, useRoute } from 'vue-router'; import { useAuthStore } from '@/store/auth'; import { UserLogin } from '@/api/api'; const form = ref({ email: '', password: '' }); const errorMsg = ref(''); const router = useRouter(); const route = useRoute(); const authStore = useAuthStore(); const Login = async () => { try { const response = await UserLogin(form.value); console.log(response); if (response.status === 200) { authStore.setToken(response.data.token); const redirectPath = route.query.redirect || '/'; router.push(redirectPath).then(() => { location.reload(); // 强制刷新页面 }); } else { errorMsg.value = '登录失败,请检查您的邮箱和密码。'; } } catch (error) { errorMsg.value = error.response?.data?.message || '登录失败'; } }; </script> <style> .LoginTitle { text-align: center; color: #25adba; } </style> 这是我的App.vue<template> <div id="app"> <nav class="main-nav"> <div class="nav-group left"> <router-link to="/" class="nav-item">首页</router-link> <router-link to="/playmusic" class="nav-item">播放页</router-link> </div> <div class="nav-group right"> <router-link v-if="!authStore.isLoggedIn" to="/login" class="login-logout"> 登录 </router-link> <a v-else href="#" class="login-logout" @click.prevent="logout"> 登出 </a> </div> </nav> <router-view></router-view> </div> </template> <script setup> import { useAuthStore } from '@/store/auth' const authStore = useAuthStore() const logout = () => { authStore.logout() window.location.reload() // 重新加载页面,确保状态刷新 } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; } .main-nav { padding: 20px; background: #f8f9fa; margin-bottom: 2rem; display: flex; /* 启用flex布局 */ justify-content: space-between; /* 左右分组自动分开 */ align-items: center; /* 垂直居中 */ } .nav-group { display: flex; gap: 15px; /* 现代浏览器间距设置 */ } .left{ margin-right: auto; } .right { margin-left: auto; /* 右侧组推到最右边 */ } .nav-item { text-decoration: none; color: #2c3e50; font-weight: bold; } .login-logout { margin: 0 15px; color: #2c3e50; text-align: right; text-decoration: none; } .login-logout:hover { opacity: 0.8; } .router-link-exact-active { color: #42b983; border-bottom: 2px solid #42b983; } </style>我希望能在app.vue里面获得到Login.vue的response
03-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值