diff --git a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs index cb40dfe..dbc80c7 100644 --- a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs @@ -17,7 +17,9 @@ namespace 齐越慧眼 public partial class App : Application { public App() { - var settings = new CefSettings(); + var settings = new CefSettings() { + + }; // ... settings.RegisterScheme(new CefCustomScheme() diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/CatControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/CatControl.xaml.cs index b1b0705..d807f07 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/CatControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/CatControl.xaml.cs @@ -1,4 +1,5 @@ -using System; +using CefSharp; +using System; using System.Collections.Generic; using System.Text; using System.Windows; @@ -22,11 +23,19 @@ namespace 齐越慧眼.UserControls { InitializeComponent(); Loaded += CatControl_Loaded; + web.Initialized += Web_Initialized; + } + + private void Web_Initialized(object sender, EventArgs e) + { + web.BrowserSettings.FileAccessFromFileUrls = CefSharp.CefState.Enabled; + web.BrowserSettings.UniversalAccessFromFileUrls = CefSharp.CefState.Enabled; } private void CatControl_Loaded(object sender, RoutedEventArgs e) { - web.Load("nacollector://dist/index.html"); + web.Load("nacollector://home"); + web.ShowDevTools(); } } } diff --git a/客户端/齐越慧眼/齐越慧眼/cefhelper/SchemeHandler.cs b/客户端/齐越慧眼/齐越慧眼/cefhelper/SchemeHandler.cs index 7de4114..bca7c09 100644 --- a/客户端/齐越慧眼/齐越慧眼/cefhelper/SchemeHandler.cs +++ b/客户端/齐越慧眼/齐越慧眼/cefhelper/SchemeHandler.cs @@ -15,12 +15,16 @@ namespace 齐越慧眼.cefhelper var names = this.GetType().Assembly.GetManifestResourceNames(); Uri u = new Uri(request.Url); - String file = "vuepage/client/" + u.Authority + u.AbsolutePath; // 注:目录名需全为小写字母,否则将无法得到 Resource - + String file = "vuepage/client/dist" + u.AbsolutePath; // 注:目录名需全为小写字母,否则将无法得到 Resource + if (!u.AbsolutePath.Contains(".")) + { + file = "vuepage/client/dist/index.html"; + } Assembly ass = Assembly.GetExecutingAssembly(); String resourcePath = ass.GetName().Name + "." + file.Replace("/", "."); // 你可以设置断点看看这里的值 if (resourcePath.EndsWith(".")) resourcePath = resourcePath.Remove(resourcePath.Length - 1, 1); + Task.Run(() => { using (callback) @@ -43,11 +47,11 @@ namespace 齐越慧眼.cefhelper case ".png": mimeType = "image/png"; break; - case ".appcache": - break; case ".manifest": mimeType = "text/cache-manifest"; break; + default: + break; } // Reset the stream position to 0 so the stream can be copied into the underlying unmanaged buffer @@ -59,15 +63,18 @@ namespace 齐越慧眼.cefhelper Stream = stream; callback.Continue(); + + return CefReturnValue.Continue; } else { callback.Cancel(); + return CefReturnValue.Cancel; } } }); - return CefReturnValue.Continue; + return CefReturnValue.ContinueAsync; } } } diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/.eslintrc.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/.eslintrc.js new file mode 100644 index 0000000..c8ccd8f --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/.eslintrc.js @@ -0,0 +1,27 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint' + }, + env: { + browser: true, + }, + extends: [ + // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. + 'plugin:vue/essential' + ], + // required to lint *.vue files + plugins: [ + 'vue' + ], + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/package.json b/客户端/齐越慧眼/齐越慧眼/vuepage/client/package.json index f127ec8..0fd70de 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/package.json +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/package.json @@ -9,9 +9,13 @@ }, "dependencies": { "ant-design-vue": "^1.7.8", + "axios": "^0.23.0", + "babel-eslint": "^10.1.0", + "mini-css-extract-plugin": "^0.9.0", "vue": "^2.6.11", "vue-router": "^3.2.0", - "vuex": "^3.4.0" + "vuex": "^3.4.0", + "webpack": "^4.0.0" }, "devDependencies": { "@vue/cli-plugin-eslint": "~4.5.0", diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/App.vue b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/App.vue index 1a221f0..bee6eba 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/App.vue +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/App.vue @@ -1,9 +1,5 @@ diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/api/http.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/api/http.js new file mode 100644 index 0000000..89f27e0 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/api/http.js @@ -0,0 +1,256 @@ +import axios from 'axios' + +axios.defaults.timeout = 50000; +//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; +axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'; + + +//'application/json;charset=utf-8';// +if (process.env.NODE_ENV == 'development') { + axios.defaults.baseURL = 'http://127.0.0.1:9991/'; +} +else if (process.env.NODE_ENV == 'production') { + axios.defaults.baseURL = 'http://132.232.2.109:9991/'; +} +let ipAddress = axios.defaults.baseURL; +axios.interceptors.request.use((config) => { + //axios.defaults.headers[_Authorization] = $httpVue.$store.getters.getToken(); + + //console.log(axios.defaults.headers[_Authorization]) + if (config.method === 'post') { + //config.data =qs.stringify(config.data); + // console.log('post拦截:' + config.data); + } + return config; +}, (error) => { + return Promise.reject(error); +}); + + +//返回状态判断(添加响应拦截器) +axios.interceptors.response.use((res) => { + //对响应数据做些事 + if (res.data.success) { + return res; + } + return Promise.resolve(res); +}, (error) => { + let httpMessage = ''; + if (error.response) { + if (error.response.data && error.response.data.message) { + httpMessage = error.response.data.message; + } else if (error.response.status == '404') { + httpMessage = "没有找到请求的地址"; + } + } + else { + httpMessage = '网络好像出了点问题~' + } + + redirect(error.response || {}, httpMessage); + return Promise.reject(error.response); +}); + +let $httpVue = null, currentToken = ''; +const _Authorization = 'Authorization', _Bearer = 'Bearer '; + +function init(vue) { + $httpVue = vue + console.log(vue) +} + +function getToken() { + if (currentToken) { + return _Bearer + currentToken; + } + return $httpVue.$store.getters.getToken(); +} + +//_showLoading=true异步请求时会显示遮罩层,_showLoading=字符串,异步请求时遮罩层显示当前字符串 +function post(url, params) { + axios.defaults.headers[_Authorization] = getToken(); + return new Promise((resolve, reject) => { + // axios.post(url, qs.stringify(params)) // + axios.post(url, params) + .then(response => { + if (response.status == 202) { + getNewToken(() => { post(url, params); }); + return; + } + resolve(response.data); + }, err => { + if (err.status == 202) { + getNewToken(() => { post(url, params); }); + return; + } + reject(err.data && err.data.message ? err.data.message : '网络好像出了点问题~~'); + }) + .catch((error) => { + reject(error) + }) + }) +} + +//_showLoading=true异步请求时会显示遮罩层,_showLoading=字符串,异步请求时遮罩层显示当前字符串 +function get(url, param) { + axios.defaults.headers[_Authorization] = getToken(); + return new Promise((resolve, reject) => { + axios.get(url, { params: param }) + .then(response => { + if (response.status == 202) { + getNewToken(() => { get(url, param); }); + return; + } + resolve(response.data) + }, err => { + if (err.status == 202) { + getNewToken(() => { get(url, param); }); + return; + } + redirect(response.data); + reject(err) + }) + .catch((error) => { + reject(error) + }) + }) +} + + + + +function createXHR() { + if (XMLHttpRequest) { + return new XMLHttpRequest(); + } + if (ActiveXObject) { + if (typeof arguments.callee.activeXString != "string") { + var versions = [ + "MSXML2.XMLHttp.6.0", + "MSXML2.XMLHttp", + "MSXML2.XMLHttp.3.0" + ]; + for (var i = 0; i < versions.length; i++) { + try { + new ActiveXObject(versions[i]); + arguments.callee.activeXString = versions[i]; + break; + } catch (e) { + console.log("no"); + } + } + } + return new ActiveXObject(arguments.callee.activeXString); + } +} + +function redirect(responseText, message) { + try { + let responseData = typeof responseText == 'string' ? JSON.parse(responseText) : responseText; + // $httpVue.$message.error(responseData.message || '~服务器好像出了点问题...') + if ((responseData.hasOwnProperty('code') && responseData.code == 401) + || (responseData.data && responseData.data.code == 401)) { + toLogin(); + } else { + $httpVue.$message.error(message); + } + } catch (error) { + console.log(error); + $httpVue.$message.error(responseText) + } +} +function toLogin() { + currentToken = ""; + $httpVue.$router.push({ path: '/login', params: { r: Math.random() } }); +} +//当前token快要过期时,用现有的token换成一个新的token +function getNewToken(callBack) { + ajax({ + url: "/api/User/replaceToken", + param: {}, + json: true, + success: function (x) { + if (x.status) { + let userInfo = $httpVue.$store.getters.getUserInfo(); + userInfo.token = x.data; + currentToken = x.data; + $httpVue.$store.commit('setUserInfo', userInfo); + callBack(); + } else { + console.log(x.message); + toLogin(); + } + }, + errror: function (ex) { + console.log(ex); + toLogin(); + }, + type: "post", + async: false + }); + + +} + +function ajax(param) { + let httpParam = + Object.assign({ + url: '', headers: {}, + param: {}, json: true, + success: function () { }, + errror: function () { }, + type: 'post', async: true + }, param); + + httpParam.url = axios.defaults.baseURL + httpParam.url.replace(/\/?/, ''); + httpParam.headers[_Authorization] = getToken(); + var xhr = createXHR(); + // console.log(xhr.readyState); + xhr.onreadystatechange = function () { + if (xhr.status == 403 || xhr.status == 401) { + redirect(xhr.responseText); + return; + } + if (xhr.status == 202) { + getNewToken(() => { + ajax(param); + }); + return; + } + if (xhr.readyState == 4 && xhr.status == 200) { + httpParam.success(httpParam.json ? JSON.parse(xhr.responseText) : xhr.responseText); + return; + } + if (xhr.status != 0 && xhr.readyState != 1) { + httpParam.errror(xhr); + } + }; + //初始化请求 + xhr.open( + httpParam.type, + httpParam.url, + httpParam.async + ); + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + for (const key in httpParam.headers) { + xhr.setRequestHeader(key, httpParam.headers[key]); + } + let dataStr = ''; + for (const key in httpParam.param) { + dataStr += key + "=" + httpParam.param[key]; + } + try { + xhr.send(dataStr); + } catch (error) { + toLogin(); + // console.log(error) + } +} + +ajax.post = function (url, param, success, errror) { + ajax({ url: url, param: param, success: success, error: errror, type: 'post' }) +} +ajax.get = function (url, param, success, errror) { + ajax({ url: url, param: param, success: success, error: errror, type: 'post' }) +} +export default { post, get, ajax, init, ipAddress } diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewContainer.less b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewContainer.less new file mode 100644 index 0000000..710f07e --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewContainer.less @@ -0,0 +1,83 @@ + +.layout-container { + // border-top: 1px solid #eee; + background: #eee; + // padding: 15px; + /* margin-bottom: 40px; */ + } + // .animated { + // -webkit-animation-duration: 1s; + // animation-duration: 1s; + // -webkit-animation-fill-mode: both; + // animation-fill-mode: both; + // } + // .animated.infinite { + // -webkit-animation-iteration-count: infinite; + // animation-iteration-count: infinite; + // } + // .animated.hinge { + // -webkit-animation-duration: 2s; + // animation-duration: 2s; + // } + // .animated.bounceIn, + // .animated.bounceOut, + // .animated.flipOutX, + // .animated.flipOutY { + // -webkit-animation-duration: 0.75s; + // animation-duration: 0.75s; + // } + // @-webkit-keyframes fadeInDown { + // 0% { + // opacity: 0; + // -webkit-transform: translate3d(0, -100%, 0); + // transform: translate3d(0, -100%, 0); + // } + // to { + // opacity: 1; + // -webkit-transform: none; + // transform: none; + // } + // } + // @keyframes fadeInDown { + // 0% { + // opacity: 0; + // -webkit-transform: translate3d(0, -100%, 0); + // transform: translate3d(0, -100%, 0); + // } + // to { + // opacity: 1; + // -webkit-transform: none; + // transform: none; + // } + // } + // .fadeInDown { + // -webkit-animation-name: fadeInDown; + // animation-name: fadeInDown; + // } + + // @-webkit-keyframes slideInDown { + // 0% { + // -webkit-transform: translate3d(0, -100%, 0); + // transform: translate3d(0, -100%, 0); + // visibility: visible; + // } + // to { + // -webkit-transform: translateZ(0); + // transform: translateZ(0); + // } + // } + // @keyframes slideInDown { + // 0% { + // -webkit-transform: translate3d(0, -100%, 0); + // transform: translate3d(0, -100%, 0); + // visibility: visible; + // } + // to { + // -webkit-transform: translateZ(0); + // transform: translateZ(0); + // } + // } + // .slideInDown { + // -webkit-animation-name: slideInDown; + // animation-name: slideInDown; + // } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewGrid.less b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewGrid.less new file mode 100644 index 0000000..19b912b --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/ViewGrid.less @@ -0,0 +1,229 @@ +.view-container{ + padding: 15px; + background: white; +} +.view-header { + height: 45px; + position: relative; + padding-bottom: 11px; + display: -webkit-flex; + display: flex; + .search-line { + flex: 1; + margin-left: 50px; + display: flex; + text-align: right; + } + .search-line > div { + margin-left: 30px; + margin-right: 20px; + } + .search-line > div > div{ + width: 200px; + text-align: left; + } + .search-line > div:first-child{ + flex: 1; + } + .search-line > div .ivu-select-dropdown{ + max-height: 300px; + } + // .btn-group > button { + // text-align: right; + // } + .btn-group{ + white-space: nowrap; + button { + margin-left: 10px; + // padding: 5px 16px; + } + .dropdown{ + height: 31px; + padding-right: 9px; + padding-left: 11px; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; + } + .r-dropdown{ + height: 31px; + margin-left: 0px; + padding-left: 5px; + padding-right: 5px; + border-bottom-left-radius: 0px; + border-left: 1px solid #eee; + border-top-left-radius: 0; + } + } + // .btn-group button { + // margin-left: 10px; + // // padding: 5px 16px; + // } + // .btn-group .dropdown { + // position: relative; + // padding: 5px 34px 5px 10px; + // } + // .btn-group .dropdown span i.ivu-icon-ios-arrow-down { + // top: 0px; + // height: 34px; + // border-left: 1px solid; + // height: 100%; + // position: absolute; + // margin-left: 10px; + // padding: 9px 5px 5px 5px; + // } + // .btn-group .dropdown .ivu-dropdown { + // bottom: 0; + // right: 0; + // left: 0; + // position: absolute; + // } + .btn-group .ivu-dropdown-item { + text-align: left !important; + } + .btn-group .ivu-dropdown-item:not(:last-child) { + border-bottom: 1px dotted #eee; + } + .desc-text { + margin-top: 5px; + font-weight: bold; + margin-bottom: 3px; + font-size: 15px; + color: #607d8b; + white-space: nowrap; + border-bottom: 2px solid #009688; + } + .desc-text .ivu-icon { + font-size: 20px; + bottom: 2px; + position: relative; + } + .search-box { + background: #fefefe; + margin-top: 45px; + border: 1px solid #ececec; + position: absolute; + z-index: 999; + left: 0; + right: 0; + // width: 100%; + padding: 25px 40px; + padding-bottom: 0; + box-shadow: 0px 7px 18px -12px #bdc0bb; + } + .notice { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + position: relative; + top: 12px; + left: 10px; + } + } + +.table-info-cell-title { + background-color: #f5f5f5 !important; + } +.iview-com { + background: #f3f3f3; + > div.item{ + // margin-bottom: 10px; + + margin-bottom: 12px; + background: white; + } + > div.form-item{ + padding: 8px 16px 7px 16px; + //box-shadow: 0 1px 7px rgb(199, 199, 199); + } + > div.table-item{ + // padding: 0px 16px 12px 16px; + border: 1px solid #e8e8e8; + box-shadow: 0 1px 7px rgb(199, 199, 199); + } + .v-text{ + line-height: 27px; + } + .form-text{ + position: relative; + /* height: 38px; */ + /* line-height: 38px; */ + /* padding: 0 15px; */ + // border-bottom: 1px solid #e4e4e4; + border-bottom: 1px solid #eee; + /* border-radius: 2px 2px 0 0; */ + font-size: 14px; + margin-bottom: 14px; + .title{ + border-bottom: 2px solid #00BCD4; + color: #009688; + font-weight: bold; + letter-spacing: 1px; + // border-bottom-right-radius: 5px; + // border-top-left-radius: 5px; + padding: 6px 0; + // background: #009688; + // color: white; + } + .icon{ + color: #00BCD4; + font-size: 19px; + position: relative; + top: -1px; + } + } + } + + .form-closex { + text-align: right; + padding-bottom: 24px; + } + .form-closex button { + margin-left: 10px; + padding: 4px 13px; + } + .grid-detail{ + // margin-left:16px; + // // margin-top:-28px; + // padding-bottom: 16px; + } + .toolbar{ + padding: 3px 15px; + width: 100%; + display: flex; + // padding: 3px; + border-top: 1px solid #eae9e9; + // border-top-left-radius: 5px; + // // background: #37aba0; + // border-top-right-radius: 5px; + // border: 1px solid #f1f1f1; + .title{ + line-height: 28px; + border-bottom: 2px solid #03A9F4; + font-size: 14px; + font-weight: bolder; + margin-bottom: 0; + color: #828282; + .icon{ + color: #009688; + font-size: 18px; + } + } + .btns{ + line-height: 28px; + flex: 1; + text-align: right; + margin-right: 12px; + button{ + border: none; + margin-left:15px; + border: 0px; + color: #009688; + } + button:hover{ + color: #FF9800; + border-color: #FF9800; + border: none; + } + + } + } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/common.less b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/common.less new file mode 100644 index 0000000..ac7a179 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/css/common.less @@ -0,0 +1,75 @@ +*{ + box-sizing:border-box; + -moz-box-sizing:border-box; /* Firefox */ + -webkit-box-sizing:border-box; /* Safari */ +} +.el-pager li{ + font-weight: 100; + margin-right: 9px; + border: 1px solid #eee; + border-radius: 3px; + min-width: 28px; +} +.el-pager li.active,.el-pager li:hover{ + background: #ed4014; + color: white; +} +.el-pagination__editor.el-input .el-input__inner{ + height: 23px; +} + + +.animated { + -webkit-animation-duration: 0.5s; + animation-duration: 0.5s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + } + + @media (print), (prefers-reduced-motion) { + .animated { + -webkit-animation: unset !important; + animation: unset !important; + -webkit-transition: none !important; + transition: none !important; + } + } + + @-webkit-keyframes fadeInDown { + from { + opacity: 1; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + + @keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + + .fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; + } + .ivu-message{ + z-index: 999999999 !important; + } + .ivu-form-item-content{ + text-align: left; + } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/imgs/favicon.ico b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/imgs/favicon.ico new file mode 100644 index 0000000..9215c89 Binary files /dev/null and b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/imgs/favicon.ico differ diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/common.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/common.js new file mode 100644 index 0000000..8e8e8eb --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/common.js @@ -0,0 +1,2 @@ +var test1 = function () { alert(11) } +export { test1 } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/extend.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/extend.js new file mode 100644 index 0000000..d34da65 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/extend.js @@ -0,0 +1,5 @@ +//对vue参数进行扩展 +var extend = function (param) { + console.log(param) + } +export { extend } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/testFormExtend.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/testFormExtend.js new file mode 100644 index 0000000..67216df --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/assets/script/testFormExtend.js @@ -0,0 +1,15 @@ +//对vue参数进行扩展 +var extend = function ($vueParam) { + $vueParam.methods.volBoxFrom = function () { + this.$Message.info("扩展js,增加弹出消息"); + this.$refs.volBoxFrom.show(); + } + //修改data属性: + let data = $vueParam.data(); + data.formFileds['extend'] = "动态扩展字段"; + data.formOptions.splice(0,0,{ filed: "extend", title: "动态增加字段", type: "text", required: true }); + $vueParam.data = function () { + return data; + } +} +export { extend } \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/main.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/main.js index 64e13c3..03dd916 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/main.js +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/main.js @@ -1,12 +1,19 @@ import Vue from 'vue' +import Antd from 'ant-design-vue'; import App from './App.vue' import router from './router' import store from './store' +import http from './api/http' +import 'ant-design-vue/dist/antd.css'; Vue.config.productionTip = false -new Vue({ +Vue.use(Antd); +var vue =new Vue({ router, store, render: function (h) { return h(App) } }).$mount('#app') + +Vue.prototype.http = http; +Vue.prototype.http.init(vue); \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/router/index.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/router/index.js index 13d0566..f134f83 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/router/index.js +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/router/index.js @@ -1,6 +1,6 @@ import Vue from 'vue' import VueRouter from 'vue-router' -import Home from '../views/Home.vue' +import Home from '../views/cats/Index.vue' Vue.use(VueRouter) diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/data.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/data.js new file mode 100644 index 0000000..cf16172 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/data.js @@ -0,0 +1,27 @@ + +const data = { + state: { + data: {} + }, + mutations: { + // setData(state, data) { //this.$store.commit('setData', data) + // state.data = data; + // }, + clear(state) { + state.data = {}; + } + }, getters: { + getData: (state) => () => { //调用方式 store.getters.getData() + return data; + }, + data: (state) => () => { + return data; + } + }, actions: { + // setData(context, data) { + // context.commit('setData', data); //调用方式 store.dispatch('push') + // } + } +}; + +export default data; \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/index.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/index.js index 332b916..d3e7fef 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/index.js +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/store/index.js @@ -1,15 +1,150 @@ import Vue from 'vue' import Vuex from 'vuex' -Vue.use(Vuex) -export default new Vuex.Store({ +Vue.use(Vuex); +const moduleA = { state: { + m: 123 + }, mutations: { + + }, getters: { + + }, actions: { + toDo(context) { + return context.Store.m; + } + } +}; +const moduleB = { + state: { + m: 456 + }, mutations: { + + }, getters: { + + }, actions: { + toDo(context) { + return context.Store.m; + } + } +}; + +const test = new Vuex.Store({ + modules: { //分成多个模块 + a: moduleA, //store.state.a + b: moduleB //store.state.b + }, + state: { + count: 12220 }, mutations: { + increment(state, par1) { + state.count++ + } }, - actions: { + getters: { + newVal: (parState, getters) => { //parState这个是参数,是vuex调用时传的state对象.getters同样可以调用getters.state.count + parState.count = 888; + return parState.count; + } + }, actions: { + increment(context, par1) {//传入参数 + context.commit('increment', par1) //store.dispatch('increment') + } + } +}) + +function getUserInfo(state) { + if (state.userInfo) return state.userInfo; + let userInfo = localStorage.getItem(keys.USER); + if (userInfo) { + state.userInfo = JSON.parse(userInfo); + } + return state.userInfo; +} +//getter 相当于 state 的计算属性,mutation 是用来修改 state 的 +//使用actions或mutation获取不了state对象 +const keys = { USER: 'user' } +//因为分了模块所有属性调试方法都需要加上this.$store.system(system为模块名称) +const system = { + state: { + permission: [], + isLoading: false,//2020.06.03增加路由切换时加载提示 + userInfo: null }, - modules: { + mutations: { + setPermission(state, data) { //调用方式 this.$store.commit('setPermission', data) + if (!data || typeof data != 'object') return; + if (data instanceof Array) { + state.permission.push(...data); + } else { + state.permission = data; + } + }, setUserInfo(state, data) { + state.userInfo = data; + localStorage.setItem(keys.USER, JSON.stringify(data)); + }, + clearUserInfo(state) { + state.permission = []; + state.userInfo = null; + localStorage.removeItem(keys.USER); + }, + test(state) { + return 113344; + }, + updateLoadingState(state, flag) { + state.isLoading = flag + } + }, getters: { + getPermission: (state) => (path) => { //调用方式 store.getters.getPermission('sys_User') + if (!path) return state.permission; + return state.permission.find(x => x.path == path); + }, + getUserInfo: (state) => () => { + getUserInfo(state); + return state.userInfo; + }, getUserName: (state) => () => { + getUserInfo(state); + if (state.userInfo) { + return state.userInfo.userName; + } + return '未获取到登陆信息'; + }, + getToken: (state) => () => { + getUserInfo(state); + if (state.userInfo) { + return 'Bearer ' + state.userInfo.token; + } + return ''; + }, + isLogin: (state) => () => { + if (getUserInfo(state)) { + return true; + } + return false; + }, + isLoading: (state) => () => { + return state.isLoading; + } + + }, actions: { + setPermission(context, data) { + context.commit('setPermission', data); //调用方式 store.dispatch('push') + }, + toDo(context) { + return context.Store.m; + }, + onLoading(context, flag) { + context.commit("updateLoadingState", flag); + } + } +}; +import data from './data.js' +const store = new Vuex.Store({ + modules: { //分成多个模块 + system,//this.$store.state.system + data } }) +export default store; diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/views/cats/Index.vue b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/views/cats/Index.vue new file mode 100644 index 0000000..b58c64f --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/src/views/cats/Index.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/vue.config.js b/客户端/齐越慧眼/齐越慧眼/vuepage/client/vue.config.js new file mode 100644 index 0000000..f41a488 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/vue.config.js @@ -0,0 +1,17 @@ +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +module.exports = { + // 修改打包后js文件名 + configureWebpack: { // webpack 配置 + output: { // 输出重构 打包编译后的 文件名称 【模块名称.版本号.js】 + filename: `js/[name].js`, + chunkFilename: `js/[name].js` + }, + // 修改打包后css文件名 + plugins: [ + new MiniCssExtractPlugin({ + filename: `css/[name].css`, + chunkFilename: `css/[name].css` + }) + ] + } +} \ No newline at end of file diff --git a/客户端/齐越慧眼/齐越慧眼/vuepage/client/yarn.lock b/客户端/齐越慧眼/齐越慧眼/vuepage/client/yarn.lock index fcc6188..e3d83be 100644 --- a/客户端/齐越慧眼/齐越慧眼/vuepage/client/yarn.lock +++ b/客户端/齐越慧眼/齐越慧眼/vuepage/client/yarn.lock @@ -22,14 +22,53 @@ resolved "https://registry.npmmirror.com/@ant-design/icons/download/@ant-design/icons-2.1.1.tgz?cache=0&sync_timestamp=1632478732118&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons%2Fdownload%2F%40ant-design%2Ficons-2.1.1.tgz#7b9c08dffd4f5d41db667d9dbe5e0107d0bd9a4a" integrity sha1-e5wI3/1PXUHbZn2dvl4BB9C9mko= -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": version "7.15.8" resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.15.8.tgz?cache=0&sync_timestamp=1633553739126&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" integrity sha1-RZkMR62tsAwDZ3uqiSIffMI9JQM= dependencies: "@babel/highlight" "^7.14.5" -"@babel/helper-validator-identifier@^7.14.5": +"@babel/generator@^7.15.4": + version "7.15.8" + resolved "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.15.8.tgz?cache=0&sync_timestamp=1633553714543&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha1-+la+a1lpUs6yMQSM+E7kmaGcDNE= + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-function-name/download/@babel/helper-function-name-7.15.4.tgz?cache=0&sync_timestamp=1630618923307&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha1-hFdE2vxDgaSl+2r6bD02+Yp4frw= + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.15.4.tgz?cache=0&sync_timestamp=1630618916983&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha1-CYgYk0oTf854tTaj4BWGS+Hih5s= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.15.4.tgz?cache=0&sync_timestamp=1630618919536&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha1-CZk6MlnA6Rj5nRBCYd/fwDPxeN8= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.15.4.tgz?cache=0&sync_timestamp=1630618922438&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha1-rsq5Lc2+9qEKo7YqsgSwhfd24lc= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.15.7" resolved "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.15.7.tgz?cache=0&sync_timestamp=1631920110587&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" integrity sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k= @@ -43,6 +82,43 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@^7.15.4", "@babel/parser@^7.7.0": + version "7.15.8" + resolved "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.15.8.tgz?cache=0&sync_timestamp=1633553767489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha1-e6zcvnG9w/+TbVEMFdzqfPC5kBY= + +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/template/download/@babel/template-7.15.4.tgz?cache=0&sync_timestamp=1630618922172&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha1-UYmNNdzz+qZwxO5q/P1RfuE58ZQ= + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.7.0": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/traverse/download/@babel/traverse-7.15.4.tgz?cache=0&sync_timestamp=1630618923983&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha1-/4UQNnoUS/v/VS2eGOKPPiiJwi0= + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.7.0": + version "7.15.6" + resolved "https://registry.nlark.com/@babel/types/download/@babel/types-7.15.6.tgz?cache=0&sync_timestamp=1631216657849&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha1-mavcSCGLKIHAWN0KerBbmcm+dY8= + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.nlark.com/@hapi/address/download/@hapi/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -902,6 +978,25 @@ aws4@^1.8.0: resolved "https://registry.nlark.com/aws4/download/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= +axios@^0.23.0: + version "0.23.0" + resolved "https://registry.npmmirror.com/axios/download/axios-0.23.0.tgz?cache=0&sync_timestamp=1634053173003&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faxios%2Fdownload%2Faxios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" + integrity sha1-sPpdCUio0ddePVY1I4tsRiWwUUk= + dependencies: + follow-redirects "^1.14.4" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.nlark.com/babel-eslint/download/babel-eslint-10.1.0.tgz?cache=0&sync_timestamp=1618846971799&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-eslint%2Fdownload%2Fbabel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI= + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-helper-vue-jsx-merge-props@^2.0.3: version "2.0.3" resolved "https://registry.nlark.com/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" @@ -2519,7 +2614,7 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha1-MOvR73wv3/AcOk8VEESvJfqwUj4= @@ -2962,7 +3057,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.4: version "1.14.4" resolved "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.4.tgz?cache=0&sync_timestamp=1631622163078&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha1-g4/fSKi73XnlLuUfsclOPtmLk3k= @@ -3143,6 +3238,11 @@ glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.nlark.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1628810148451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= + globals@^12.1.0: version "12.4.0" resolved "https://registry.nlark.com/globals/download/globals-12.4.0.tgz?cache=0&sync_timestamp=1628810148451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" @@ -4077,6 +4177,11 @@ jsbn@~0.1.0: resolved "https://registry.nlark.com/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.nlark.com/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= + json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.nlark.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6039,7 +6144,7 @@ resolve-url@^0.2.1: resolved "https://registry.nlark.com/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0: +resolve@^1.10.0, resolve@^1.12.0: version "1.20.0" resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= @@ -6444,7 +6549,7 @@ source-map-url@^0.4.0: resolved "https://registry.nlark.com/source-map-url/download/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= -source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.nlark.com/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -6881,6 +6986,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418855671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.nlark.com/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" diff --git a/客户端/齐越慧眼/齐越慧眼/齐越慧眼.csproj b/客户端/齐越慧眼/齐越慧眼/齐越慧眼.csproj index eb213aa..e840271 100644 --- a/客户端/齐越慧眼/齐越慧眼/齐越慧眼.csproj +++ b/客户端/齐越慧眼/齐越慧眼/齐越慧眼.csproj @@ -7,14 +7,57 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -25,14 +68,16 @@ - - - - - - - - + + + + + + + + + +