no message
Showing
42 changed files
with
1974 additions
and
1091 deletions
public/file/bootstrap-table-resizable.js
0 → 100644
| 1 | /** | ||
| 2 | * @author: Dennis Hernández | ||
| 3 | * @webSite: http://djhvscf.github.io/Blog | ||
| 4 | * @version: v1.0.0 | ||
| 5 | */ | ||
| 6 | (function ($) { | ||
| 7 | 'use strict'; | ||
| 8 | |||
| 9 | var initResizable = function (that) { | ||
| 10 | //Deletes the plugin to re-create it | ||
| 11 | that.$el.colResizable({disable: true}); | ||
| 12 | |||
| 13 | //Creates the plugin | ||
| 14 | that.$el.colResizable({ | ||
| 15 | liveDrag: that.options.liveDrag, | ||
| 16 | fixed: that.options.fixed, | ||
| 17 | headerOnly: that.options.headerOnly, | ||
| 18 | minWidth: that.options.minWidth, | ||
| 19 | hoverCursor: that.options.hoverCursor, | ||
| 20 | dragCursor: that.options.dragCursor, | ||
| 21 | onResize: that.onResize, | ||
| 22 | onDrag: that.options.onResizableDrag, | ||
| 23 | resizeMode: that.options.resizeMode | ||
| 24 | }); | ||
| 25 | }; | ||
| 26 | |||
| 27 | $.extend($.fn.bootstrapTable.defaults, { | ||
| 28 | resizable: false, | ||
| 29 | liveDrag: false, | ||
| 30 | fixed: true, | ||
| 31 | headerOnly: false, | ||
| 32 | minWidth: 15, | ||
| 33 | hoverCursor: 'e-resize', | ||
| 34 | dragCursor: 'e-resize', | ||
| 35 | onResizableResize: function (e) { | ||
| 36 | return false; | ||
| 37 | }, | ||
| 38 | onResizableDrag: function (e) { | ||
| 39 | return false; | ||
| 40 | } | ||
| 41 | }); | ||
| 42 | |||
| 43 | var BootstrapTable = $.fn.bootstrapTable.Constructor, | ||
| 44 | _toggleView = BootstrapTable.prototype.toggleView, | ||
| 45 | _resetView = BootstrapTable.prototype.resetView; | ||
| 46 | |||
| 47 | BootstrapTable.prototype.toggleView = function () { | ||
| 48 | _toggleView.apply(this, Array.prototype.slice.apply(arguments)); | ||
| 49 | |||
| 50 | if (this.options.resizable && this.options.cardView) { | ||
| 51 | //Deletes the plugin | ||
| 52 | $(this.$el).colResizable({disable: true}); | ||
| 53 | } | ||
| 54 | }; | ||
| 55 | |||
| 56 | BootstrapTable.prototype.resetView = function () { | ||
| 57 | var that = this; | ||
| 58 | |||
| 59 | _resetView.apply(this, Array.prototype.slice.apply(arguments)); | ||
| 60 | |||
| 61 | if (this.options.resizable) { | ||
| 62 | // because in fitHeader function, we use setTimeout(func, 100); | ||
| 63 | setTimeout(function () { | ||
| 64 | initResizable(that); | ||
| 65 | }, 100); | ||
| 66 | } | ||
| 67 | }; | ||
| 68 | |||
| 69 | BootstrapTable.prototype.onResize = function (e) { | ||
| 70 | var that = $(e.currentTarget); | ||
| 71 | that.bootstrapTable('resetView'); | ||
| 72 | that.data('bootstrap.table').options.onResizableResize.apply(e); | ||
| 73 | } | ||
| 74 | })(jQuery); |
public/file/colResizable-1.6.js
0 → 100644
| 1 | /** | ||
| 2 | _ _____ _ _ _ | ||
| 3 | | | __ \ (_) | | | | | ||
| 4 | ___ ___ | | |__) |___ ___ _ ______ _| |__ | | ___ | ||
| 5 | / __/ _ \| | _ // _ \/ __| |_ / _` | '_ \| |/ _ \ | ||
| 6 | | (_| (_) | | | \ \ __/\__ \ |/ / (_| | |_) | | __/ | ||
| 7 | \___\___/|_|_| \_\___||___/_/___\__,_|_.__/|_|\___| | ||
| 8 | |||
| 9 | v1.7 - jQuery plugin created by Alvaro Prieto Lauroba | ||
| 10 | |||
| 11 | Licences: MIT & GPL | ||
| 12 | Feel free to use or modify this plugin as far as my full name is kept | ||
| 13 | */ | ||
| 14 | (function($){ | ||
| 15 | |||
| 16 | //IE8 Polyfill | ||
| 17 | if(!Array.indexOf) { Array.prototype.indexOf = function(obj) { for(var i=0; i<this.length;i++){if(this[i]==obj){return i;}} return -1; }} | ||
| 18 | |||
| 19 | var d = $(document); //window object | ||
| 20 | var h = $("head"); //head object | ||
| 21 | var drag = null; //reference to the current grip that is being dragged | ||
| 22 | var tables = {}; //object of the already processed tables (table.id as key) | ||
| 23 | var count = 0; //internal count to create unique IDs when needed. | ||
| 24 | |||
| 25 | //common strings for packing | ||
| 26 | var ID = "id"; | ||
| 27 | var PX = "px"; | ||
| 28 | var SIGNATURE ="JColResizer"; | ||
| 29 | var FLEX = "JCLRFlex"; | ||
| 30 | |||
| 31 | //short-cuts | ||
| 32 | var I = parseInt; | ||
| 33 | var M = Math; | ||
| 34 | var ie = navigator.userAgent.indexOf('Trident/4.0')>0; | ||
| 35 | var S; | ||
| 36 | var pad = "" | ||
| 37 | try{S = sessionStorage;}catch(e){} //Firefox crashes when executed as local file system | ||
| 38 | |||
| 39 | |||
| 40 | //append required CSS rules | ||
| 41 | h.append("<style type='text/css'> .JColResizer{table-layout:fixed;} .JColResizer > tbody > tr > td, .JColResizer > tbody > tr > th{overflow:hidden} .JPadding > tbody > tr > td, .JPadding > tbody > tr > th{padding-left:0!important; padding-right:0!important;} .JCLRgrips{ height:0px; position:relative;} .JCLRgrip{margin-left:-5px; position:absolute; z-index:5; } .JCLRgrip .JColResizer{position:absolute;background-color:red;filter:alpha(opacity=1);opacity:0;width:10px;height:100%;cursor: col-resize;top:0px} .JCLRLastGrip{position:absolute; width:1px; } .JCLRgripDrag{ border-left:1px dotted black; } .JCLRFlex{width:auto!important;} .JCLRgrip.JCLRdisabledGrip .JColResizer{cursor:default; display:none;}</style>"); | ||
| 42 | |||
| 43 | /** | ||
| 44 | * Function to allow column resizing for table objects. It is the starting point to apply the plugin. | ||
| 45 | * @param {DOM node} tb - reference to the DOM table object to be enhanced | ||
| 46 | * @param {Object} options - some customization values | ||
| 47 | */ | ||
| 48 | var init = function( tb, options){ | ||
| 49 | var t = $(tb); //the table object is wrapped | ||
| 50 | t.opt = options; //each table has its own options available at anytime | ||
| 51 | t.mode = options.resizeMode; //shortcuts | ||
| 52 | t.dc = t.opt.disabledColumns; | ||
| 53 | if(t.opt.removePadding) t.addClass("JPadding"); | ||
| 54 | if(t.opt.disable) return destroy(t); //the user is asking to destroy a previously colResized table | ||
| 55 | var id = t.id = t.attr(ID) || SIGNATURE+count++; //its id is obtained, if null new one is generated | ||
| 56 | t.p = t.opt.postbackSafe; //short-cut to detect postback safe | ||
| 57 | if(!t.is("table") || tables[id] && !t.opt.partialRefresh) return; //if the object is not a table or if it was already processed then it is ignored. | ||
| 58 | if (t.opt.hoverCursor !== 'col-resize') h.append("<style type='text/css'>.JCLRgrip .JColResizer:hover{cursor:"+ t.opt.hoverCursor +"!important}</style>"); //if hoverCursor has been set, append the style | ||
| 59 | t.addClass(SIGNATURE).attr(ID, id).before('<div class="JCLRgrips"/>'); //the grips container object is added. Signature class forces table rendering in fixed-layout mode to prevent column's min-width | ||
| 60 | t.g = []; t.c = []; t.w = t.width(); t.gc = t.prev(); t.f=t.opt.fixed; //t.c and t.g are arrays of columns and grips respectively | ||
| 61 | if(options.marginLeft) t.gc.css("marginLeft", options.marginLeft); //if the table contains margins, it must be specified | ||
| 62 | if(options.marginRight) t.gc.css("marginRight", options.marginRight); //since there is no (direct) way to obtain margin values in its original units (%, em, ...) | ||
| 63 | t.cs = I(ie? tb.cellSpacing || tb.currentStyle.borderSpacing :t.css('border-spacing'))||2; //table cellspacing (not even jQuery is fully cross-browser) | ||
| 64 | t.b = I(ie? tb.border || tb.currentStyle.borderLeftWidth :t.css('border-left-width'))||1; //outer border width (again cross-browser issues) | ||
| 65 | // if(!(tb.style.width || tb.width)) t.width(t.width()); //I am not an IE fan at all, but it is a pity that only IE has the currentStyle attribute working as expected. For this reason I can not check easily if the table has an explicit width or if it is rendered as "auto" | ||
| 66 | tables[id] = t; //the table object is stored using its id as key | ||
| 67 | createGrips(t); //grips are created | ||
| 68 | |||
| 69 | }; | ||
| 70 | |||
| 71 | |||
| 72 | /** | ||
| 73 | * This function allows to remove any enhancements performed by this plugin on a previously processed table. | ||
| 74 | * @param {jQuery ref} t - table object | ||
| 75 | */ | ||
| 76 | var destroy = function(t){ | ||
| 77 | var id=t.attr(ID), t=tables[id]; //its table object is found | ||
| 78 | if(!t||!t.is("table")) return; //if none, then it wasn't processed | ||
| 79 | t.removeClass(SIGNATURE+" "+FLEX).gc.remove(); //class and grips are removed | ||
| 80 | delete tables[id]; //clean up data | ||
| 81 | }; | ||
| 82 | /** | ||
| 83 | * Function to create all the grips associated with the table given by parameters | ||
| 84 | * @param {jQuery ref} t - table object | ||
| 85 | */ | ||
| 86 | var createGrips = function(t){ | ||
| 87 | |||
| 88 | var th = t.find(">thead>tr:first>th,>thead>tr:first>td"); //table headers are obtained | ||
| 89 | if(!th.length) th = t.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td"); //but headers can also be included in different ways | ||
| 90 | th = th.filter(":visible"); //filter invisible columns | ||
| 91 | t.cg = t.find("col"); //a table can also contain a colgroup with col elements | ||
| 92 | t.ln = th.length; //table length is stored | ||
| 93 | if(t.p && S && S[t.id])memento(t,th); //if 'postbackSafe' is enabled and there is data for the current table, its coloumn layout is restored | ||
| 94 | th.each(function(i){ //iterate through the table column headers | ||
| 95 | var c = $(this); //jquery wrap for the current column | ||
| 96 | var dc = t.dc.indexOf(i)!=-1; //is this a disabled column? | ||
| 97 | var g = $(t.gc.append('<div class="JCLRgrip"></div>')[0].lastChild); //add the visual node to be used as grip | ||
| 98 | g.append(dc ? "": t.opt.gripInnerHtml).append('<div class="'+SIGNATURE+'"></div>'); | ||
| 99 | if(i == t.ln-1){ //if the current grip is the las one | ||
| 100 | g.addClass("JCLRLastGrip"); //add a different css class to stlye it in a different way if needed | ||
| 101 | if(t.f) g.html(""); //if the table resizing mode is set to fixed, the last grip is removed since table with can not change | ||
| 102 | } | ||
| 103 | g.bind('touchstart mousedown', onGripMouseDown); //bind the mousedown event to start dragging | ||
| 104 | |||
| 105 | if (!dc){ | ||
| 106 | //if normal column bind the mousedown event to start dragging, if disabled then apply its css class | ||
| 107 | g.removeClass('JCLRdisabledGrip').bind('touchstart mousedown', onGripMouseDown); | ||
| 108 | }else{ | ||
| 109 | g.addClass('JCLRdisabledGrip'); | ||
| 110 | } | ||
| 111 | g.t = t; g.i = i; g.c = c; c.w =c.width(); //some values are stored in the grip's node data as shortcut | ||
| 112 | t.g.push(g); t.c.push(c); //the current grip and column are added to its table object | ||
| 113 | c.width(c.w).removeAttr("width"); //the width of the column is converted into pixel-based measurements | ||
| 114 | g.data(SIGNATURE, {i:i, t:t.attr(ID), last: i == t.ln-1}); //grip index and its table name are stored in the HTML | ||
| 115 | }); | ||
| 116 | t.cg.removeAttr("width"); //remove the width attribute from elements in the colgroup | ||
| 117 | |||
| 118 | t.find('td, th').not(th).not('table th, table td').each(function(){ | ||
| 119 | $(this).removeAttr('width'); //the width attribute is removed from all table cells which are not nested in other tables and dont belong to the header | ||
| 120 | }); | ||
| 121 | if(!t.f){ | ||
| 122 | t.removeAttr('width').addClass(FLEX); //if not fixed, let the table grow as needed | ||
| 123 | } | ||
| 124 | syncGrips(t); //the grips are positioned according to the current table layout | ||
| 125 | //there is a small problem, some cells in the table could contain dimension values interfering with the | ||
| 126 | //width value set by this plugin. Those values are removed | ||
| 127 | |||
| 128 | }; | ||
| 129 | |||
| 130 | |||
| 131 | /** | ||
| 132 | * Function to allow the persistence of columns dimensions after a browser postback. It is based in | ||
| 133 | * the HTML5 sessionStorage object, which can be emulated for older browsers using sessionstorage.js | ||
| 134 | * @param {jQuery ref} t - table object | ||
| 135 | * @param {jQuery ref} th - reference to the first row elements (only set in deserialization) | ||
| 136 | */ | ||
| 137 | var memento = function(t, th){ | ||
| 138 | var w,m=0,i=0,aux =[],tw; | ||
| 139 | if(th){ //in deserialization mode (after a postback) | ||
| 140 | t.cg.removeAttr("width"); | ||
| 141 | if(t.opt.flush){ S[t.id] =""; return;} //if flush is activated, stored data is removed | ||
| 142 | w = S[t.id].split(";"); //column widths is obtained | ||
| 143 | tw = w[t.ln+1]; | ||
| 144 | if(!t.f && tw){ //if not fixed and table width data available its size is restored | ||
| 145 | t.width(tw*=1); | ||
| 146 | if(t.opt.overflow) { //if overfolw flag is set, restore table width also as table min-width | ||
| 147 | t.css('min-width', tw + PX); | ||
| 148 | t.w = tw; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | for(;i<t.ln;i++){ //for each column | ||
| 152 | aux.push(100*w[i]/w[t.ln]+"%"); //width is stored in an array since it will be required again a couple of lines ahead | ||
| 153 | th.eq(i).css("width", aux[i] ); //each column width in % is restored | ||
| 154 | } | ||
| 155 | for(i=0;i<t.ln;i++) | ||
| 156 | t.cg.eq(i).css("width", aux[i]); //this code is required in order to create an inline CSS rule with higher precedence than an existing CSS class in the "col" elements | ||
| 157 | }else{ //in serialization mode (after resizing a column) | ||
| 158 | S[t.id] =""; //clean up previous data | ||
| 159 | for(;i < t.c.length; i++){ //iterate through columns | ||
| 160 | w = t.c[i].width(); //width is obtained | ||
| 161 | S[t.id] += w+";"; //width is appended to the sessionStorage object using ID as key | ||
| 162 | m+=w; //carriage is updated to obtain the full size used by columns | ||
| 163 | } | ||
| 164 | S[t.id]+=m; //the last item of the serialized string is the table's active area (width), | ||
| 165 | //to be able to obtain % width value of each columns while deserializing | ||
| 166 | if(!t.f) S[t.id] += ";"+t.width(); //if not fixed, table width is stored | ||
| 167 | } | ||
| 168 | }; | ||
| 169 | |||
| 170 | |||
| 171 | /** | ||
| 172 | * Function that places each grip in the correct position according to the current table layout | ||
| 173 | * @param {jQuery ref} t - table object | ||
| 174 | */ | ||
| 175 | var syncGrips = function (t){ | ||
| 176 | t.gc.width(t.w); //the grip's container width is updated | ||
| 177 | for(var i=0; i<t.ln; i++){ //for each column | ||
| 178 | var c = t.c[i]; | ||
| 179 | t.g[i].css({ //height and position of the grip is updated according to the table layout | ||
| 180 | left: c.offset().left - t.offset().left + c.outerWidth(false) + t.cs / 2 + PX, | ||
| 181 | height: t.opt.headerOnly? t.c[0].outerHeight(false) : t.outerHeight(false) | ||
| 182 | }); | ||
| 183 | } | ||
| 184 | }; | ||
| 185 | |||
| 186 | |||
| 187 | |||
| 188 | /** | ||
| 189 | * This function updates column's width according to the horizontal position increment of the grip being | ||
| 190 | * dragged. The function can be called while dragging if liveDragging is enabled and also from the onGripDragOver | ||
| 191 | * event handler to synchronize grip's position with their related columns. | ||
| 192 | * @param {jQuery ref} t - table object | ||
| 193 | * @param {number} i - index of the grip being dragged | ||
| 194 | * @param {bool} isOver - to identify when the function is being called from the onGripDragOver event | ||
| 195 | */ | ||
| 196 | var syncCols = function(t,i,isOver){ | ||
| 197 | var inc = drag.x-drag.l, c = t.c[i], c2 = t.c[i+1]; | ||
| 198 | var w = c.w + inc; var w2= c2.w- inc; //their new width is obtained | ||
| 199 | c.width( w + PX); | ||
| 200 | t.cg.eq(i).width( w + PX); | ||
| 201 | if(t.f){ //if fixed mode | ||
| 202 | c2.width(w2 + PX); | ||
| 203 | t.cg.eq(i+1).width( w2 + PX); | ||
| 204 | }else if(t.opt.overflow) { //if overflow is set, incriment min-width to force overflow | ||
| 205 | t.css('min-width', t.w + inc); | ||
| 206 | } | ||
| 207 | if(isOver){ | ||
| 208 | c.w=w; | ||
| 209 | c2.w= t.f ? w2 : c2.w; | ||
| 210 | } | ||
| 211 | }; | ||
| 212 | |||
| 213 | |||
| 214 | /** | ||
| 215 | * This function updates all columns width according to its real width. It must be taken into account that the | ||
| 216 | * sum of all columns can exceed the table width in some cases (if fixed is set to false and table has some kind | ||
| 217 | * of max-width). | ||
| 218 | * @param {jQuery ref} t - table object | ||
| 219 | */ | ||
| 220 | var applyBounds = function(t){ | ||
| 221 | var w = $.map(t.c, function(c){ //obtain real widths | ||
| 222 | return c.width(); | ||
| 223 | }); | ||
| 224 | t.width(t.w = t.width()).removeClass(FLEX); //prevent table width changes | ||
| 225 | $.each(t.c, function(i,c){ | ||
| 226 | c.width(w[i]).w = w[i]; //set column widths applying bounds (table's max-width) | ||
| 227 | }); | ||
| 228 | t.addClass(FLEX); //allow table width changes | ||
| 229 | }; | ||
| 230 | |||
| 231 | |||
| 232 | /** | ||
| 233 | * Event handler used while dragging a grip. It checks if the next grip's position is valid and updates it. | ||
| 234 | * @param {event} e - mousemove event binded to the window object | ||
| 235 | */ | ||
| 236 | var onGripDrag = function(e){ | ||
| 237 | if(!drag) return; | ||
| 238 | var t = drag.t; //table object reference | ||
| 239 | var oe = e.originalEvent.touches; | ||
| 240 | var ox = oe ? oe[0].pageX : e.pageX; //original position (touch or mouse) | ||
| 241 | var x = ox - drag.ox + drag.l; //next position according to horizontal mouse position increment | ||
| 242 | var mw = t.opt.minWidth, i = drag.i ; //cell's min width | ||
| 243 | var l = t.cs*1.5 + mw + t.b; | ||
| 244 | var last = i == t.ln-1; //check if it is the last column's grip (usually hidden) | ||
| 245 | var min = i? t.g[i-1].position().left+t.cs+mw: l; //min position according to the contiguous cells | ||
| 246 | var max = t.f ? //fixed mode? | ||
| 247 | i == t.ln-1? | ||
| 248 | t.w-l: | ||
| 249 | t.g[i+1].position().left-t.cs-mw: | ||
| 250 | Infinity; //max position according to the contiguous cells | ||
| 251 | x = M.max(min, M.min(max, x)); //apply bounding | ||
| 252 | drag.x = x; drag.css("left", x + PX); //apply position increment | ||
| 253 | if(last){ //if it is the last grip | ||
| 254 | var c = t.c[drag.i]; //width of the last column is obtained | ||
| 255 | drag.w = c.w + x- drag.l; | ||
| 256 | } | ||
| 257 | if(t.opt.liveDrag){ //if liveDrag is enabled | ||
| 258 | if(last){ | ||
| 259 | c.width(drag.w); | ||
| 260 | if(!t.f && t.opt.overflow){ //if overflow is set, incriment min-width to force overflow | ||
| 261 | t.css('min-width', t.w + x - drag.l); | ||
| 262 | }else { | ||
| 263 | t.w = t.width(); | ||
| 264 | } | ||
| 265 | }else{ | ||
| 266 | syncCols(t,i); //columns are synchronized | ||
| 267 | } | ||
| 268 | syncGrips(t); | ||
| 269 | var cb = t.opt.onDrag; //check if there is an onDrag callback | ||
| 270 | if (cb) { e.currentTarget = t[0]; cb(e); } //if any, it is fired | ||
| 271 | } | ||
| 272 | return false; //prevent text selection while dragging | ||
| 273 | }; | ||
| 274 | |||
| 275 | |||
| 276 | /** | ||
| 277 | * Event handler fired when the dragging is over, updating table layout | ||
| 278 | * @param {event} e - grip's drag over event | ||
| 279 | */ | ||
| 280 | var onGripDragOver = function(e){ | ||
| 281 | |||
| 282 | d.unbind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE).unbind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE); | ||
| 283 | $("head :last-child").remove(); //remove the dragging cursor style | ||
| 284 | if(!drag) return; | ||
| 285 | drag.removeClass(drag.t.opt.draggingClass); //remove the grip's dragging css-class | ||
| 286 | if (!(drag.x - drag.l == 0)) { | ||
| 287 | var t = drag.t; | ||
| 288 | var cb = t.opt.onResize; //get some values | ||
| 289 | var i = drag.i; //column index | ||
| 290 | var last = i == t.ln-1; //check if it is the last column's grip (usually hidden) | ||
| 291 | var c = t.g[i].c; //the column being dragged | ||
| 292 | if(last){ | ||
| 293 | c.width(drag.w); | ||
| 294 | c.w = drag.w; | ||
| 295 | }else{ | ||
| 296 | syncCols(t, i, true); //the columns are updated | ||
| 297 | } | ||
| 298 | if(!t.f) applyBounds(t); //if not fixed mode, then apply bounds to obtain real width values | ||
| 299 | syncGrips(t); //the grips are updated | ||
| 300 | if (cb) { e.currentTarget = t[0]; cb(e); } //if there is a callback function, it is fired | ||
| 301 | if(t.p && S) memento(t); //if postbackSafe is enabled and there is sessionStorage support, the new layout is serialized and stored | ||
| 302 | } | ||
| 303 | drag = null; //since the grip's dragging is over | ||
| 304 | }; | ||
| 305 | |||
| 306 | |||
| 307 | /** | ||
| 308 | * Event handler fired when the grip's dragging is about to start. Its main goal is to set up events | ||
| 309 | * and store some values used while dragging. | ||
| 310 | * @param {event} e - grip's mousedown event | ||
| 311 | */ | ||
| 312 | var onGripMouseDown = function(e){ | ||
| 313 | var o = $(this).data(SIGNATURE); //retrieve grip's data | ||
| 314 | var t = tables[o.t], g = t.g[o.i]; //shortcuts for the table and grip objects | ||
| 315 | var oe = e.originalEvent.touches; //touch or mouse event? | ||
| 316 | g.ox = oe? oe[0].pageX: e.pageX; //the initial position is kept | ||
| 317 | g.l = g.position().left; | ||
| 318 | g.x = g.l; | ||
| 319 | |||
| 320 | d.bind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE, onGripDrag ).bind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE, onGripDragOver); //mousemove and mouseup events are bound | ||
| 321 | h.append("<style type='text/css'>*{cursor:"+ t.opt.dragCursor +"!important}</style>"); //change the mouse cursor | ||
| 322 | g.addClass(t.opt.draggingClass); //add the dragging class (to allow some visual feedback) | ||
| 323 | drag = g; //the current grip is stored as the current dragging object | ||
| 324 | if(t.c[o.i].l) for(var i=0,c; i<t.ln; i++){ c=t.c[i]; c.l = false; c.w= c.width(); } //if the colum is locked (after browser resize), then c.w must be updated | ||
| 325 | return false; //prevent text selection | ||
| 326 | }; | ||
| 327 | |||
| 328 | |||
| 329 | /** | ||
| 330 | * Event handler fired when the browser is resized. The main purpose of this function is to update | ||
| 331 | * table layout according to the browser's size synchronizing related grips | ||
| 332 | */ | ||
| 333 | var onResize = function(){ | ||
| 334 | for(var t in tables){ | ||
| 335 | if( tables.hasOwnProperty( t ) ) { | ||
| 336 | t = tables[t]; | ||
| 337 | var i, mw=0; | ||
| 338 | t.removeClass(SIGNATURE); //firefox doesn't like layout-fixed in some cases | ||
| 339 | if (t.f) { //in fixed mode | ||
| 340 | t.w = t.width(); //its new width is kept | ||
| 341 | for(i=0; i<t.ln; i++) mw+= t.c[i].w; | ||
| 342 | //cell rendering is not as trivial as it might seem, and it is slightly different for | ||
| 343 | //each browser. In the beginning i had a big switch for each browser, but since the code | ||
| 344 | //was extremely ugly now I use a different approach with several re-flows. This works | ||
| 345 | //pretty well but it's a bit slower. For now, lets keep things simple... | ||
| 346 | for(i=0; i<t.ln; i++) t.c[i].css("width", M.round(1000*t.c[i].w/mw)/10 + "%").l=true; | ||
| 347 | //c.l locks the column, telling us that its c.w is outdated | ||
| 348 | }else{ //in non fixed-sized tables | ||
| 349 | applyBounds(t); //apply the new bounds | ||
| 350 | if(t.mode == 'flex' && t.p && S){ //if postbackSafe is enabled and there is sessionStorage support, | ||
| 351 | memento(t); //the new layout is serialized and stored for 'flex' tables | ||
| 352 | } | ||
| 353 | } | ||
| 354 | syncGrips(t.addClass(SIGNATURE)); | ||
| 355 | } | ||
| 356 | } | ||
| 357 | |||
| 358 | }; | ||
| 359 | |||
| 360 | |||
| 361 | //bind resize event, to update grips position | ||
| 362 | $(window).bind('resize.'+SIGNATURE, onResize); | ||
| 363 | |||
| 364 | |||
| 365 | /** | ||
| 366 | * The plugin is added to the jQuery library | ||
| 367 | * @param {Object} options - an object that holds some basic customization values | ||
| 368 | */ | ||
| 369 | $.fn.extend({ | ||
| 370 | colResizable: function(options) { | ||
| 371 | var defaults = { | ||
| 372 | |||
| 373 | //attributes: | ||
| 374 | |||
| 375 | resizeMode: 'fit', //mode can be 'fit', 'flex' or 'overflow' | ||
| 376 | draggingClass: 'JCLRgripDrag', //css-class used when a grip is being dragged (for visual feedback purposes) | ||
| 377 | gripInnerHtml: '', //if it is required to use a custom grip it can be done using some custom HTML | ||
| 378 | liveDrag: false, //enables table-layout updating while dragging | ||
| 379 | minWidth: 15, //minimum width value in pixels allowed for a column | ||
| 380 | headerOnly: false, //specifies that the size of the the column resizing anchors will be bounded to the size of the first row | ||
| 381 | hoverCursor: "col-resize", //cursor to be used on grip hover | ||
| 382 | dragCursor: "col-resize", //cursor to be used while dragging | ||
| 383 | postbackSafe: false, //when it is enabled, table layout can persist after postback or page refresh. It requires browsers with sessionStorage support (it can be emulated with sessionStorage.js). | ||
| 384 | flush: false, //when postbakSafe is enabled, and it is required to prevent layout restoration after postback, 'flush' will remove its associated layout data | ||
| 385 | marginLeft: null, //in case the table contains any margins, colResizable needs to know the values used, e.g. "10%", "15em", "5px" ... | ||
| 386 | marginRight: null, //in case the table contains any margins, colResizable needs to know the values used, e.g. "10%", "15em", "5px" ... | ||
| 387 | disable: false, //disables all the enhancements performed in a previously colResized table | ||
| 388 | partialRefresh: false, //can be used in combination with postbackSafe when the table is inside of an updatePanel, | ||
| 389 | disabledColumns: [], //column indexes to be excluded | ||
| 390 | removePadding: true, //for some uses (such as multiple range slider), it is advised to set this modifier to true, it will remove padding from the header cells. | ||
| 391 | |||
| 392 | //events: | ||
| 393 | onDrag: null, //callback function to be fired during the column resizing process if liveDrag is enabled | ||
| 394 | onResize: null //callback function fired when the dragging process is over | ||
| 395 | } | ||
| 396 | var options = $.extend(defaults, options); | ||
| 397 | |||
| 398 | //since now there are 3 different ways of resizing columns, I changed the external interface to make it clear | ||
| 399 | //calling it 'resizeMode' but also to remove the "fixed" attribute which was confusing for many people | ||
| 400 | options.fixed = true; | ||
| 401 | options.overflow = false; | ||
| 402 | switch(options.resizeMode){ | ||
| 403 | case 'flex': options.fixed = false; break; | ||
| 404 | case 'overflow': options.fixed = false; options.overflow = true; break; | ||
| 405 | } | ||
| 406 | |||
| 407 | return this.each(function() { | ||
| 408 | init( this, options); | ||
| 409 | }); | ||
| 410 | } | ||
| 411 | }); | ||
| 412 | })(jQuery); | ||
| 413 |
| ... | @@ -2,7 +2,7 @@ import request from '@/utils/request' | ... | @@ -2,7 +2,7 @@ import request from '@/utils/request' |
| 2 | 2 | ||
| 3 | export function getMaList(params) { | 3 | export function getMaList(params) { |
| 4 | return request({ | 4 | return request({ |
| 5 | url: `/league/competition/webList`, | 5 | url: `/league/competition/webList?topFlag=1&status=1`, |
| 6 | method: 'get', | 6 | method: 'get', |
| 7 | params: params | 7 | params: params |
| 8 | }) | 8 | }) |
| ... | @@ -252,13 +252,7 @@ export function getMyGroupForCptFilter(groupId, cptId, query) { | ... | @@ -252,13 +252,7 @@ export function getMyGroupForCptFilter(groupId, cptId, query) { |
| 252 | data: query | 252 | data: query |
| 253 | }) | 253 | }) |
| 254 | } | 254 | } |
| 255 | //todo | 255 | |
| 256 | export function bindWdsf(perId,card) { | ||
| 257 | return request({ | ||
| 258 | url: `/systemj/personInfo/bindWdsf/${perId}?card=${card}`, | ||
| 259 | method: 'post' | ||
| 260 | }) | ||
| 261 | } | ||
| 262 | export function getGroupPersonList(query,groupId) { | 256 | export function getGroupPersonList(query,groupId) { |
| 263 | return request({ | 257 | return request({ |
| 264 | url: `/systemj/personInfo/getPersonInfoListByGroupIdNoLabel/${groupId}`, | 258 | url: `/systemj/personInfo/getPersonInfoListByGroupIdNoLabel/${groupId}`, |
| ... | @@ -403,9 +397,8 @@ export function commitSign(data) { | ... | @@ -403,9 +397,8 @@ export function commitSign(data) { |
| 403 | } | 397 | } |
| 404 | export function getTotalFee(data) { | 398 | export function getTotalFee(data) { |
| 405 | return request({ | 399 | return request({ |
| 406 | url: `/league/expenseConfig/getTotalFee`, | 400 | url: `/league/expenseConfig/getTotalFee/${data.cptId}/${data.entryId}`, |
| 407 | method: 'post', | 401 | method: 'get' |
| 408 | data: data | ||
| 409 | }) | 402 | }) |
| 410 | } | 403 | } |
| 411 | export function getMemberInfoByCptId(cptId) { | 404 | export function getMemberInfoByCptId(cptId) { |
| ... | @@ -463,8 +456,8 @@ export function getMySignListTree(cptId, personId, teamId) { | ... | @@ -463,8 +456,8 @@ export function getMySignListTree(cptId, personId, teamId) { |
| 463 | export function getMySignInfoList(data) { | 456 | export function getMySignInfoList(data) { |
| 464 | return request({ | 457 | return request({ |
| 465 | url: `/league/sign/getMySignInfoList`, | 458 | url: `/league/sign/getMySignInfoList`, |
| 466 | method: 'post', | 459 | method: 'get', |
| 467 | data: data | 460 | params: data |
| 468 | }) | 461 | }) |
| 469 | } | 462 | } |
| 470 | export function saveMyGroupExtraInfo(data) { | 463 | export function saveMyGroupExtraInfo(data) { |
| ... | @@ -498,4 +491,18 @@ export function getPayedOrderPdf(cptId, groupId) { | ... | @@ -498,4 +491,18 @@ export function getPayedOrderPdf(cptId, groupId) { |
| 498 | method: 'get' | 491 | method: 'get' |
| 499 | }) | 492 | }) |
| 500 | } | 493 | } |
| 494 | //todo | ||
| 495 | export function bindWdsf(perId,card) { | ||
| 496 | return request({ | ||
| 497 | url: `/systemj/personInfo/bindWdsf/${perId}?card=${card}`, | ||
| 498 | method: 'post' | ||
| 499 | }) | ||
| 500 | } | ||
| 501 | export function getProjectPageByPerIds(query) { | ||
| 502 | return request({ | ||
| 503 | url: `/league/competitionProject/getProjectPageByPerIds/${query.cptId}/${query.perIds}`, | ||
| 504 | method: 'get', | ||
| 505 | params: query | ||
| 506 | }) | ||
| 507 | } | ||
| 501 | 508 | ... | ... |
src/assets/dance/fm_副本.jpg
0 → 100644
25.8 KB
src/assets/sign/tag040.png
0 → 100644
1.32 KB
| ... | @@ -182,7 +182,9 @@ aside { | ... | @@ -182,7 +182,9 @@ aside { |
| 182 | margin-bottom: 10px; | 182 | margin-bottom: 10px; |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | .m20{margin: 20px;} | ||
| 185 | .flexCenter{display: flex;align-items: center;justify-content: center;} | 186 | .flexCenter{display: flex;align-items: center;justify-content: center;} |
| 187 | .flexBetween{display: flex;align-items: center;justify-content: space-between;} | ||
| 186 | .primary-kx{border:1px solid var(--el-color-primary)!important;color: var(--el-color-primary)!important;} | 188 | .primary-kx{border:1px solid var(--el-color-primary)!important;color: var(--el-color-primary)!important;} |
| 187 | .primary-kx:hover{} | 189 | .primary-kx:hover{} |
| 188 | .border-info{background: rgba(69,61,234,0.04); | 190 | .border-info{background: rgba(69,61,234,0.04); |
| ... | @@ -222,8 +224,8 @@ aside { | ... | @@ -222,8 +224,8 @@ aside { |
| 222 | font-size: 24px;} | 224 | font-size: 24px;} |
| 223 | .el-dialog__headerbtn{font-size: 24px!important;color: #A0A0A0;} | 225 | .el-dialog__headerbtn{font-size: 24px!important;color: #A0A0A0;} |
| 224 | } | 226 | } |
| 225 | 227 | .w100{width: 100%;} | |
| 226 | .w200px{width: 200px;} | 228 | .w200px{min-width: 200px;} |
| 227 | .pt30{padding-top: 30px;} | 229 | .pt30{padding-top: 30px;} |
| 228 | .d-form-border{ | 230 | .d-form-border{ |
| 229 | border: 1px solid #E5E5E5;margin: 20px 0;padding: 20px} | 231 | border: 1px solid #E5E5E5;margin: 20px 0;padding: 20px} | ... | ... |
| ... | @@ -18,7 +18,7 @@ | ... | @@ -18,7 +18,7 @@ |
| 18 | :accept="accept" | 18 | :accept="accept" |
| 19 | > | 19 | > |
| 20 | <!-- 上传按钮 --> | 20 | <!-- 上传按钮 --> |
| 21 | <el-button type="primary" :disabled="props.disabled">选取文件</el-button> | 21 | <el-button type="primary" :disabled="props.disabled">{{ buttonText }}</el-button> |
| 22 | </el-upload> | 22 | </el-upload> |
| 23 | <!-- 上传提示 --> | 23 | <!-- 上传提示 --> |
| 24 | <div v-if="showTip && !disabled" class="el-upload__tip"> | 24 | <div v-if="showTip && !disabled" class="el-upload__tip"> |
| ... | @@ -89,6 +89,10 @@ const props = defineProps({ | ... | @@ -89,6 +89,10 @@ const props = defineProps({ |
| 89 | disabled: { | 89 | disabled: { |
| 90 | type: Boolean, | 90 | type: Boolean, |
| 91 | default: false | 91 | default: false |
| 92 | }, | ||
| 93 | buttonText:{ | ||
| 94 | type: String, | ||
| 95 | default: '上传文件' | ||
| 92 | } | 96 | } |
| 93 | }) | 97 | }) |
| 94 | const accept = computed(() => { | 98 | const accept = computed(() => { | ... | ... |
| ... | @@ -6,40 +6,21 @@ | ... | @@ -6,40 +6,21 @@ |
| 6 | 6 | ||
| 7 | <div class="home-menu forPc" style="margin: 0 20px"> | 7 | <div class="home-menu forPc" style="margin: 0 20px"> |
| 8 | <el-menu | 8 | <el-menu |
| 9 | v-if="language==0" | ||
| 10 | router :default-active="activeIndex" :mode="mode" :ellipsis="true" | 9 | router :default-active="activeIndex" :mode="mode" :ellipsis="true" |
| 11 | popper-effect="dark" @select="handleSelect" | 10 | popper-effect="dark" @select="handleSelect" |
| 12 | > | 11 | > |
| 13 | <el-menu-item index="/">首页</el-menu-item> | 12 | <el-menu-item index="/">{{ language==0?'首页':'HOME' }}</el-menu-item> |
| 14 | <el-menu-item index="/news">新闻资讯</el-menu-item> | 13 | <el-menu-item index="/news">{{ language==0?'新闻资讯':'NEWS' }}</el-menu-item> |
| 15 | <el-menu-item index="/notice">通知公告</el-menu-item> | 14 | <el-menu-item index="/notice">{{ language==0?'通知公告':'NOTICEBOARD' }}</el-menu-item> |
| 16 | <el-menu-item index="/match/list/0">大赛报名</el-menu-item> | 15 | <el-menu-item index="/match/list/0">{{ language==0?'大赛报名':'SIGN UP' }}</el-menu-item> |
| 17 | <el-menu-item index="/saiC">赛程安排</el-menu-item> | 16 | <el-menu-item index="/saiC">{{ language==0?'赛程安排':'COMPETITIONS' }}</el-menu-item> |
| 18 | <el-menu-item index="/meta">媒体中心</el-menu-item> | 17 | <el-menu-item index="/meta">{{ language==0?'媒体中心':'MEDIA' }}</el-menu-item> |
| 19 | <el-menu-item index="/guide">参赛指南</el-menu-item> | 18 | <el-menu-item index="/guide">{{ language==0?'参赛指南':'GUIDELINE' }}</el-menu-item> |
| 20 | <el-sub-menu index="/about"> | ||
| 21 | <template #title>关于我们</template> | ||
| 22 | <el-menu-item index="/about/wuDao">舞蹈节</el-menu-item> | ||
| 23 | <el-menu-item index="/about/culture">地方文化</el-menu-item> | ||
| 24 | </el-sub-menu> | ||
| 25 | </el-menu> | ||
| 26 | <el-menu | ||
| 27 | v-if="language==1" | ||
| 28 | router :default-active="activeIndex" mode="horizontal" :ellipsis="true" | ||
| 29 | popper-effect="dark" @select="handleSelect" | ||
| 30 | > | ||
| 31 | <el-menu-item index="/">HOME</el-menu-item> | ||
| 32 | <el-menu-item index="/news">NEWS</el-menu-item> | ||
| 33 | <el-menu-item index="/notice">NOTICEBOARD</el-menu-item> | ||
| 34 | <el-menu-item index="/match/list/0">SIGN UP</el-menu-item> | ||
| 35 | <el-menu-item index="/saiC">COMPETITIONS</el-menu-item> | ||
| 36 | <el-menu-item index="/meta">MEDIA</el-menu-item> | ||
| 37 | <el-menu-item index="/guide">GUIDELINE</el-menu-item> | ||
| 38 | <el-sub-menu index="/about"> | 19 | <el-sub-menu index="/about"> |
| 39 | <template #title>CONTACT & MORE</template> | 20 | <template #title>{{ language==0?'关于我们':'CONTACT & MORE' }}</template> |
| 40 | <el-menu-item index="/about/wuDao">About Us</el-menu-item> | 21 | <el-menu-item index="/about/wuDao">{{ language==0?'舞蹈节':'About Us' }}</el-menu-item> |
| 41 | <el-menu-item index="/about/regulations">Rules & Regulations</el-menu-item> | 22 | <el-menu-item index="/about/regulations" v-if="language==1">Rules & Regulations</el-menu-item> |
| 42 | <el-menu-item index="/about/culture">Culture</el-menu-item> | 23 | <el-menu-item index="/about/culture">{{ language==0?'地方文化':'Culture' }}</el-menu-item> |
| 43 | </el-sub-menu> | 24 | </el-sub-menu> |
| 44 | </el-menu> | 25 | </el-menu> |
| 45 | </div> | 26 | </div> |
| ... | @@ -49,25 +30,19 @@ | ... | @@ -49,25 +30,19 @@ |
| 49 | <el-button :icon="Search" circle @click="searchNews" /> | 30 | <el-button :icon="Search" circle @click="searchNews" /> |
| 50 | </div> | 31 | </div> |
| 51 | <div class="languageBtn"> | 32 | <div class="languageBtn"> |
| 52 | <span v-if="language==0" :class="language==0?'active':''" @click="changeLanguage(0)">中文</span> | 33 | <span :class="language==0?'active':''" @click="changeLanguage(0)">{{ language==0?'中文':'CN' }}</span> |
| 53 | <span v-else :class="language==0?'active':''" @click="changeLanguage(0)">CN</span> | ||
| 54 | | | 34 | | |
| 55 | <span :class="language==1?'active':''" @click="changeLanguage(1)">EN</span> | 35 | <span :class="language==1?'active':''" @click="changeLanguage(1)">EN</span> |
| 56 | </div> | 36 | </div> |
| 57 | <div class="ml20 forPc" > | 37 | <div class="ml20 forPc" > |
| 58 | <el-button v-if="!isLogin" style="border-radius: 20px;" class="loginBtn"> | 38 | <el-button v-if="!isLogin" style="border-radius: 20px;" class="loginBtn"> |
| 59 | <span v-if="language==0" @click="goLogin">登录</span> | 39 | <span @click="goLogin">{{ language==0?'登录':'LOGIN' }}</span> |
| 60 | <span v-if="language==1" @click="goLogin">LOGIN</span> | ||
| 61 | <!-- | <span @click="goRegister">注册</span>--> | 40 | <!-- | <span @click="goRegister">注册</span>--> |
| 62 | </el-button> | 41 | </el-button> |
| 63 | 42 | ||
| 64 | <el-button v-if="language==0&&isLogin" style="border-radius: 20px;" class="loginBtn"> | 43 | <el-button v-if="isLogin" style="border-radius: 20px;" class="loginBtn"> |
| 65 | <span @click="router.push('/center/myInfo')">个人中心</span> | 44 | <span @click="router.push('/center/myInfo')">{{ language==0?'个人中心':'Personal' }}</span> |
| 66 | | <span @click="logout()">退出</span> | 45 | | <span @click="logout()">{{language==0?'退出':'Exit'}}</span> |
| 67 | </el-button> | ||
| 68 | <el-button v-if="language==1&&isLogin" style="border-radius: 20px;" class="loginBtn"> | ||
| 69 | <span @click="router.push('/center/myInfo')">Personal</span> | ||
| 70 | | <span @click="logout()">Exit</span> | ||
| 71 | </el-button> | 46 | </el-button> |
| 72 | </div> | 47 | </div> |
| 73 | </div> | 48 | </div> | ... | ... |
| ... | @@ -522,10 +522,16 @@ export const constantRoutes = [ | ... | @@ -522,10 +522,16 @@ export const constantRoutes = [ |
| 522 | meta: { title: '我的报名' } | 522 | meta: { title: '我的报名' } |
| 523 | }, | 523 | }, |
| 524 | { | 524 | { |
| 525 | path: 'myTrain', | 525 | path: 'myReservation', |
| 526 | component: () => import('@/viewsPc/center/myTrain'), | 526 | component: () => import('@/viewsPc/center/myReservation'), |
| 527 | name: 'myTrain', | 527 | name: 'myReservation', |
| 528 | meta: { title: '我的预定' } | 528 | meta: { title: '我的预定' } |
| 529 | }, | ||
| 530 | { | ||
| 531 | path: 'mySms', | ||
| 532 | component: () => import('@/viewsPc/center/mySms'), | ||
| 533 | name: 'mySms', | ||
| 534 | meta: { title: '系统消息' } | ||
| 529 | } | 535 | } |
| 530 | ] | 536 | ] |
| 531 | } | 537 | } | ... | ... |
| ... | @@ -278,6 +278,12 @@ export const constantRoutes = [ | ... | @@ -278,6 +278,12 @@ export const constantRoutes = [ |
| 278 | redirect: '/match/list', | 278 | redirect: '/match/list', |
| 279 | children: [ | 279 | children: [ |
| 280 | { | 280 | { |
| 281 | path: 'pay', | ||
| 282 | component: () => import('@/viewsPc/match/pay'), | ||
| 283 | name: 'signPay', | ||
| 284 | meta: { title: '缴费清单' } | ||
| 285 | }, | ||
| 286 | { | ||
| 281 | path: 'list', | 287 | path: 'list', |
| 282 | component: () => import('@/viewsPc/match/index'), | 288 | component: () => import('@/viewsPc/match/index'), |
| 283 | name: 'matchList', | 289 | name: 'matchList', |
| ... | @@ -324,6 +330,12 @@ export const constantRoutes = [ | ... | @@ -324,6 +330,12 @@ export const constantRoutes = [ |
| 324 | component: () => import('@/viewsPc/match/expenseDetails'), | 330 | component: () => import('@/viewsPc/match/expenseDetails'), |
| 325 | name: 'expenseDetails', | 331 | name: 'expenseDetails', |
| 326 | meta: { title: '费用明细' } | 332 | meta: { title: '费用明细' } |
| 333 | }, | ||
| 334 | { | ||
| 335 | path: 'list/:id/signPreview', | ||
| 336 | component: () => import('@/viewsPc/match/signPreview'), | ||
| 337 | name: 'signPreview', | ||
| 338 | meta: { title: '提交审核' } | ||
| 327 | } | 339 | } |
| 328 | ] | 340 | ] |
| 329 | }, | 341 | }, |
| ... | @@ -391,26 +403,43 @@ export const constantRoutes = [ | ... | @@ -391,26 +403,43 @@ export const constantRoutes = [ |
| 391 | meta: { title: '个人中心' } | 403 | meta: { title: '个人中心' } |
| 392 | }, | 404 | }, |
| 393 | { | 405 | { |
| 394 | path: 'myTeam', | 406 | path: 'myPassword', |
| 395 | component: () => import('@/viewsPc/center/teamInfo'), | 407 | component: () => import('@/viewsPc/center/myPassword'), |
| 396 | name: 'myTeam', | 408 | name: 'myPassword', |
| 397 | meta: { title: '我的团队' } | 409 | meta: { title: '修改密码' } |
| 410 | }, | ||
| 411 | { | ||
| 412 | path: 'myCertification', | ||
| 413 | component: () => import('@/viewsPc/center/myCertification'), | ||
| 414 | name: 'myCertification', | ||
| 415 | meta: { title: 'institutional accreditation' } | ||
| 416 | }, | ||
| 417 | { | ||
| 418 | path: 'myMember', | ||
| 419 | component: () => import('@/viewsPc/center/myMember'), | ||
| 420 | name: 'myMember', | ||
| 421 | meta: { title: 'Player Management' } | ||
| 398 | }, | 422 | }, |
| 399 | { | 423 | { |
| 400 | path: 'myMatch', | 424 | path: 'myMatch', |
| 401 | component: () => import('@/viewsPc/center/myMatch'), | 425 | component: () => import('@/viewsPc/center/myMatch'), |
| 402 | name: 'myMatch', | 426 | name: 'myMatch', |
| 403 | meta: { title: '我的赛事' } | 427 | meta: { title: 'My registration' } |
| 404 | }, | 428 | }, |
| 405 | { | 429 | { |
| 406 | path: 'myTrain', | 430 | path: 'myReservation', |
| 407 | component: () => import('@/viewsPc/center/myTrain'), | 431 | component: () => import('@/viewsPc/center/myReservation'), |
| 408 | name: 'myTrain', | 432 | name: 'myReservation', |
| 409 | meta: { title: '我的培训' } | 433 | meta: { title: 'My reservation' } |
| 410 | } | 434 | }, |
| 411 | ] | 435 | { |
| 436 | path: 'mySms', | ||
| 437 | component: () => import('@/viewsPc/center/mySms'), | ||
| 438 | name: 'mySms', | ||
| 439 | meta: { title: 'System messages' } | ||
| 412 | } | 440 | } |
| 413 | ] | 441 | ] |
| 442 | }] | ||
| 414 | } | 443 | } |
| 415 | ] | 444 | ] |
| 416 | 445 | ... | ... |
| ... | @@ -14,6 +14,7 @@ import { saveAs } from 'file-saver' | ... | @@ -14,6 +14,7 @@ import { saveAs } from 'file-saver' |
| 14 | import useUserStore from '@/store/modules/user' | 14 | import useUserStore from '@/store/modules/user' |
| 15 | import { sendNotification } from '@/assets/lib/extend' | 15 | import { sendNotification } from '@/assets/lib/extend' |
| 16 | import _ from 'lodash' | 16 | import _ from 'lodash' |
| 17 | const language = cache.local.get('language') || 0 | ||
| 17 | 18 | ||
| 18 | let downloadLoadingInstance | 19 | let downloadLoadingInstance |
| 19 | // 是否显示重新登录 | 20 | // 是否显示重新登录 |
| ... | @@ -21,7 +22,7 @@ export const isRelogin = { show: false } | ... | @@ -21,7 +22,7 @@ export const isRelogin = { show: false } |
| 21 | 22 | ||
| 22 | axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' | 23 | axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' |
| 23 | // 对应国际化资源文件后缀 | 24 | // 对应国际化资源文件后缀 |
| 24 | axios.defaults.headers['Content-Language'] = 'zh_CN' | 25 | axios.defaults.headers['Content-Language'] = (language==0? 'zh_CN':'en_US' ) |
| 25 | // 创建axios实例 | 26 | // 创建axios实例 |
| 26 | const service = axios.create({ | 27 | const service = axios.create({ |
| 27 | // axios中请求配置有baseURL选项,表示请求URL公共部分 | 28 | // axios中请求配置有baseURL选项,表示请求URL公共部分 | ... | ... |
| ... | @@ -4,7 +4,7 @@ | ... | @@ -4,7 +4,7 @@ |
| 4 | <el-row :gutter="20"> | 4 | <el-row :gutter="20"> |
| 5 | <el-col :lg="5" :md="5" :xl="6" :sm="8" :xs="8"> | 5 | <el-col :lg="5" :md="5" :xl="6" :sm="8" :xs="8"> |
| 6 | <el-card class="mb20"> | 6 | <el-card class="mb20"> |
| 7 | <div class="center-menu"> | 7 | <div :class="language==0?'center-menu':'center-menu en-menu'"> |
| 8 | <ul v-if="user.utype=='2'"> | 8 | <ul v-if="user.utype=='2'"> |
| 9 | <li | 9 | <li |
| 10 | v-for="(m, i) in menus" | 10 | v-for="(m, i) in menus" |
| ... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
| 13 | > | 13 | > |
| 14 | <a href="javascript:void(0)" @click="toInfo(m)"> | 14 | <a href="javascript:void(0)" @click="toInfo(m)"> |
| 15 | <img :src="m.isActive ? m.picUrl2 : m.picUrl1"> | 15 | <img :src="m.isActive ? m.picUrl2 : m.picUrl1"> |
| 16 | {{ m.name }} | 16 | {{m.name}} |
| 17 | </a> | 17 | </a> |
| 18 | </li> | 18 | </li> |
| 19 | </ul> | 19 | </ul> |
| ... | @@ -46,6 +46,8 @@ import {useRoute, useRouter} from 'vue-router' | ... | @@ -46,6 +46,8 @@ import {useRoute, useRouter} from 'vue-router' |
| 46 | import {onMounted} from '@vue/runtime-core' | 46 | import {onMounted} from '@vue/runtime-core' |
| 47 | import useUserStore from '@/store/modules/user' | 47 | import useUserStore from '@/store/modules/user' |
| 48 | import _ from 'lodash' | 48 | import _ from 'lodash' |
| 49 | import cache from "@/plugins/cache"; | ||
| 50 | const language = ref(cache.local.get('language') || 0) | ||
| 49 | 51 | ||
| 50 | const route = useRoute() | 52 | const route = useRoute() |
| 51 | const router = useRouter() | 53 | const router = useRouter() |
| ... | @@ -53,50 +55,50 @@ const router = useRouter() | ... | @@ -53,50 +55,50 @@ const router = useRouter() |
| 53 | const user = ref({}) | 55 | const user = ref({}) |
| 54 | const menus = ref([ | 56 | const menus = ref([ |
| 55 | { | 57 | { |
| 56 | name: '基础信息', | 58 | name: language.value==0?'基础信息':'Basic Information', |
| 57 | routeName: 'myInfo', | 59 | routeName: 'myInfo', |
| 58 | picUrl1: '/img/nav_26.png', | 60 | picUrl1: '/img/nav_26.png', |
| 59 | picUrl2: '/img/nav_26_dwn.png', | 61 | picUrl2: '/img/nav_26_dwn.png', |
| 60 | isActive: false | 62 | isActive: false |
| 61 | }, | 63 | }, |
| 62 | { | 64 | { |
| 63 | name: '修改密码', | 65 | name: language.value==0?'修改密码':'Change Password', |
| 64 | routeName: 'myPassword', | 66 | routeName: 'myPassword', |
| 65 | picUrl1: '/img/nav_27.png', | 67 | picUrl1: '/img/nav_27.png', |
| 66 | picUrl2: '/img/nav_27_dwn.png', | 68 | picUrl2: '/img/nav_27_dwn.png', |
| 67 | isActive: false | 69 | isActive: false |
| 68 | }, | 70 | }, |
| 69 | { | 71 | { |
| 70 | name: '团队认证', | 72 | name: language.value==0?'团队认证':'Institutional Accreditation', |
| 71 | routeName: 'myCertification', | 73 | routeName: 'myCertification', |
| 72 | picUrl1: '/img/nav_32.png', | 74 | picUrl1: '/img/nav_32.png', |
| 73 | picUrl2: '/img/nav_32_dwn.png', | 75 | picUrl2: '/img/nav_32_dwn.png', |
| 74 | isActive: false | 76 | isActive: false |
| 75 | }, | 77 | }, |
| 76 | { | 78 | { |
| 77 | name: '选手管理', | 79 | name: language.value==0?'选手管理':'Player Management', |
| 78 | routeName: 'myMember', | 80 | routeName: 'myMember', |
| 79 | picUrl1: '/img/nav_31.png', | 81 | picUrl1: '/img/nav_31.png', |
| 80 | picUrl2: '/img/nav_31_dwn.png', | 82 | picUrl2: '/img/nav_31_dwn.png', |
| 81 | isActive: false | 83 | isActive: false |
| 82 | }, | 84 | }, |
| 83 | { | 85 | { |
| 84 | name: '我的报名', | 86 | name: language.value==0?'我的报名':'My Eegistration', |
| 85 | routeName: 'myMatch', | 87 | routeName: 'myMatch', |
| 86 | picUrl1: '/img/nav_28.png', | 88 | picUrl1: '/img/nav_28.png', |
| 87 | picUrl2: '/img/nav_28_dwn.png', | 89 | picUrl2: '/img/nav_28_dwn.png', |
| 88 | isActive: false | 90 | isActive: false |
| 89 | }, | 91 | }, |
| 90 | { | 92 | { |
| 91 | name: '我的预定', | 93 | name: language.value==0?'我的预定':'My Reservation', |
| 92 | routeName: 'myMatch', | 94 | routeName: 'myReservation', |
| 93 | picUrl1: '/img/nav_29.png', | 95 | picUrl1: '/img/nav_29.png', |
| 94 | picUrl2: '/img/nav_29_dwn.png', | 96 | picUrl2: '/img/nav_29_dwn.png', |
| 95 | isActive: false | 97 | isActive: false |
| 96 | }, | 98 | }, |
| 97 | { | 99 | { |
| 98 | name: '系统消息', | 100 | name: language.value==0?'系统消息':'System messages', |
| 99 | routeName: 'myTrain', | 101 | routeName: 'mySms', |
| 100 | picUrl1: '/img/nav_30.png', | 102 | picUrl1: '/img/nav_30.png', |
| 101 | picUrl2: '/img/nav_30_dwn.png', | 103 | picUrl2: '/img/nav_30_dwn.png', |
| 102 | isActive: false | 104 | isActive: false |
| ... | @@ -104,36 +106,36 @@ const menus = ref([ | ... | @@ -104,36 +106,36 @@ const menus = ref([ |
| 104 | ]) | 106 | ]) |
| 105 | const menusPersonal = ref([ | 107 | const menusPersonal = ref([ |
| 106 | { | 108 | { |
| 107 | name: '基础信息', | 109 | name: language.value==0?'基础信息':'Basic Information', |
| 108 | routeName: 'myInfo', | 110 | routeName: 'myInfo', |
| 109 | picUrl1: '/img/nav_26.png', | 111 | picUrl1: '/img/nav_26.png', |
| 110 | picUrl2: '/img/nav_26_dwn.png', | 112 | picUrl2: '/img/nav_26_dwn.png', |
| 111 | isActive: false | 113 | isActive: false |
| 112 | }, | 114 | }, |
| 113 | { | 115 | { |
| 114 | name: '修改密码', | 116 | name: language.value==0?'修改密码':'Change Password', |
| 115 | routeName: 'myPassword', | 117 | routeName: 'myPassword', |
| 116 | picUrl1: '/img/nav_27.png', | 118 | picUrl1: '/img/nav_27.png', |
| 117 | picUrl2: '/img/nav_27_dwn.png', | 119 | picUrl2: '/img/nav_27_dwn.png', |
| 118 | isActive: false | 120 | isActive: false |
| 119 | }, | 121 | }, |
| 120 | { | 122 | { |
| 121 | name: '我的报名', | 123 | name: language.value==0?'我的报名':'My Eegistration', |
| 122 | routeName: 'myMatch', | 124 | routeName: 'myMatch', |
| 123 | picUrl1: '/img/nav_28.png', | 125 | picUrl1: '/img/nav_28.png', |
| 124 | picUrl2: '/img/nav_28_dwn.png', | 126 | picUrl2: '/img/nav_28_dwn.png', |
| 125 | isActive: false | 127 | isActive: false |
| 126 | }, | 128 | }, |
| 127 | { | 129 | { |
| 128 | name: '我的预定', | 130 | name: language.value==0?'我的预定':'My Reservation', |
| 129 | routeName: 'myMatch', | 131 | routeName: 'myReservation', |
| 130 | picUrl1: '/img/nav_29.png', | 132 | picUrl1: '/img/nav_29.png', |
| 131 | picUrl2: '/img/nav_29_dwn.png', | 133 | picUrl2: '/img/nav_29_dwn.png', |
| 132 | isActive: false | 134 | isActive: false |
| 133 | }, | 135 | }, |
| 134 | { | 136 | { |
| 135 | name: '系统消息', | 137 | name: language.value==0?'系统消息':'System messages', |
| 136 | routeName: 'myTrain', | 138 | routeName: 'mySms', |
| 137 | picUrl1: '/img/nav_30.png', | 139 | picUrl1: '/img/nav_30.png', |
| 138 | picUrl2: '/img/nav_30_dwn.png', | 140 | picUrl2: '/img/nav_30_dwn.png', |
| 139 | isActive: false | 141 | isActive: false |
| ... | @@ -174,12 +176,18 @@ const toInfo = (item) => { | ... | @@ -174,12 +176,18 @@ const toInfo = (item) => { |
| 174 | li { | 176 | li { |
| 175 | margin-bottom: 15px; | 177 | margin-bottom: 15px; |
| 176 | } | 178 | } |
| 179 | &.en-menu{text-align: left; | ||
| 180 | li{padding: 6px 0 6px 14px; | ||
| 181 | a{display: flex;align-items: center;} | ||
| 182 | } | ||
| 183 | img{padding: 0;width: 26px;} | ||
| 184 | } | ||
| 177 | } | 185 | } |
| 178 | 186 | ||
| 179 | li img { | 187 | li img { |
| 180 | display: inline-block; | 188 | display: inline-block; |
| 181 | vertical-align: middle; | 189 | vertical-align: middle; |
| 182 | margin-right: 20px; | 190 | margin-right: 10px; |
| 183 | padding: 5px; | 191 | padding: 5px; |
| 184 | } | 192 | } |
| 185 | 193 | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <el-card :body-style="{'padding':'0'}"> | 2 | <el-card :body-style="{'padding':'0'}" class="mb20"> |
| 3 | <div class="indexTitle"><h3 class="leftboderTT">团队认证</h3></div> | 3 | <div class="indexTitle"> |
| 4 | <h3 class="leftboderTT">{{ language==0?'团队认证':'Institutional Accreditation' }}</h3> | ||
| 5 | </div> | ||
| 4 | 6 | ||
| 5 | <div class="pd20"> | 7 | <div class="pd20"> |
| 6 | <el-form :model="form" label-width="160px"> | 8 | <el-form :model="form" label-width="160px" :label-position="language==0?'left':'top'"> |
| 7 | <fieldset class="fieldset-form"> | 9 | <fieldset class="fieldset-form"> |
| 8 | <legend>机构类型</legend> | 10 | <legend>{{ language==0?'机构类型':'Institution Type' }}</legend> |
| 9 | <div class="pt30"> | 11 | <div class="pt30"> |
| 10 | <el-form-item label="选择机构类型" required> | 12 | <el-form-item :label="language==0?'选择机构类型':'Select institution type'" required> |
| 11 | <el-radio-group v-model="form.type"> | 13 | <el-radio-group v-model="form.type"> |
| 12 | <el-radio-button label="0">普通院校</el-radio-button> | 14 | <el-radio-button label="0">{{ language==0?'普通院校':'School' }}</el-radio-button> |
| 13 | <el-radio-button label="1">专业舞蹈学校</el-radio-button> | 15 | <el-radio-button label="1">{{ language==0?'专业舞蹈学校':'Professional dance school' }}</el-radio-button> |
| 14 | <el-radio-button label="2">培训机构/俱乐部</el-radio-button> | 16 | <el-radio-button label="2">{{ language==0?'培训机构/俱乐部':'Company/Club' }}</el-radio-button> |
| 15 | <el-radio-button label="3">地方协会</el-radio-button> | 17 | <el-radio-button label="3">{{ language==0?'地方协会':'Local Association' }}</el-radio-button> |
| 16 | <el-radio-button label="4">国家协会</el-radio-button> | 18 | <el-radio-button label="4">{{ language==0?'国家协会':'National Association' }}</el-radio-button> |
| 17 | </el-radio-group> | 19 | </el-radio-group> |
| 18 | </el-form-item> | 20 | </el-form-item> |
| 19 | </div> | 21 | </div> |
| 20 | </fieldset> | 22 | </fieldset> |
| 21 | <fieldset class="fieldset-form mt30"> | 23 | <fieldset class="fieldset-form mt30"> |
| 22 | <legend>机构基础信息 </legend> | 24 | <legend>{{ language==0?'机构基础信息':'Institutional Basic Information' }} </legend> |
| 23 | <div class="pt30" style="max-width: 500px"> | 25 | <div class="pt30" style="max-width: 500px"> |
| 24 | <el-form-item label="所属国家" required> | 26 | <el-form-item :label="language==0?'所属国家':'Nationality'" required> |
| 25 | <el-select filterable v-model="form.countryId"> | 27 | <el-select filterable v-model="form.countryId"> |
| 26 | <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id" /> | 28 | <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id" /> |
| 27 | </el-select> | 29 | </el-select> |
| 28 | </el-form-item> | 30 | </el-form-item> |
| 29 | <el-form-item label="详细地址" required prop="address"> | 31 | <el-form-item :label="language==0?'详细地址':'Detailed Address'" required prop="address"> |
| 30 | <el-cascader v-if="form.countryId == 240" | 32 | <el-cascader v-if="form.countryId == 240" |
| 31 | v-model="form.regionId" | 33 | v-model="form.regionId" |
| 32 | style="width: 100%;" | 34 | style="width: 100%;" |
| 33 | :options="regionsList" | 35 | :options="regionsList" |
| 34 | :props="{ label:'text' }" | 36 | :props="{ label:'text' }" |
| 35 | /> | 37 | /> |
| 36 | <el-input type="textarea" v-model="form.address" class="mt10" placeholder="请输入详细地址"/> | 38 | <el-input type="textarea" v-model="form.address" class="mt10"/> |
| 37 | </el-form-item> | 39 | </el-form-item> |
| 38 | <el-form-item label="机构名称" required prop="name"> | 40 | <el-form-item :label="language==0?'机构名称':'Team Name'" required prop="name"> |
| 39 | <el-input type="text" v-model="form.name" placeholder="请输入内容"/> | 41 | <el-input type="text" v-model="form.name" :placeholder="language==0?'请输入内容':''"/> |
| 40 | </el-form-item> | 42 | </el-form-item> |
| 41 | <el-form-item label="联系人姓名" required prop="contactPerson"> | 43 | <el-form-item :label="language==0?'联系人姓名':'Contact Person'" required prop="contactPerson"> |
| 42 | <el-input type="text" v-model="form.contactPerson" placeholder="请输入内容"/> | 44 | <el-input type="text" v-model="form.contactPerson" :placeholder="language==0?'请输入内容':''"/> |
| 43 | </el-form-item> | 45 | </el-form-item> |
| 44 | <el-form-item label="联系人电话" required prop="contactTelno"> | 46 | <el-form-item :label="language==0?'联系人电话':'Contact Phone'" required prop="contactTelno"> |
| 45 | <el-input v-model="form.contactTelno" type="phone" placeholder="请输入内容"/> | 47 | <el-input v-model="form.contactTelno" type="phone" :placeholder="language==0?'请输入内容':''"/> |
| 46 | </el-form-item> | 48 | </el-form-item> |
| 47 | <el-form-item label="联系人邮箱" required prop="contactEmail"> | 49 | <el-form-item :label="language==0?'联系人邮箱':'Contact Email'" required prop="contactEmail"> |
| 48 | <el-input v-model="form.contactEmail" type="email" placeholder="请输入内容"/> | 50 | <el-input v-model="form.contactEmail" type="email" :placeholder="language==0?'请输入内容':''"/> |
| 49 | </el-form-item> | 51 | </el-form-item> |
| 50 | 52 | ||
| 51 | </div> | 53 | </div> |
| 52 | </fieldset> | 54 | </fieldset> |
| 53 | <fieldset class="fieldset-form mt30"> | 55 | <fieldset class="fieldset-form mt30"> |
| 54 | <legend>机构认证信息 </legend> | 56 | <legend>{{ language==0?'机构认证信息':'Institutional certification information' }} </legend> |
| 55 | <div class="pt30" style="max-width: 500px"> | 57 | <div class="pt30" style="max-width: 500px"> |
| 56 | <el-form-item label="机构代码" required prop="orgCode"> | 58 | <el-form-item :label="language==0?'机构代码':'Organization Code'" required prop="orgCode"> |
| 57 | <el-input type="text" v-model="form.orgCode" placeholder="请输入内容"/> | 59 | <el-input type="text" v-model="form.orgCode" :placeholder="language==0?'请输入内容':''"/> |
| 58 | </el-form-item> | 60 | </el-form-item> |
| 59 | <el-form-item label="机构证件" required prop="orgCert"> | 61 | <el-form-item :label="language==0?'机构证件':'Institutional documents'" required prop="orgCert"> |
| 60 | <file-upload v-model="form.orgCert"/> | 62 | <file-upload v-model="form.orgCert" :button-text="language==0?'上传文件':'Upload'"/> |
| 61 | </el-form-item> | 63 | </el-form-item> |
| 62 | 64 | ||
| 63 | </div> | 65 | </div> |
| 64 | </fieldset> | 66 | </fieldset> |
| 65 | <fieldset class="fieldset-form mt30"> | 67 | <fieldset class="fieldset-form mt30"> |
| 66 | <legend>机构法人信息 </legend> | 68 | <legend>{{ language==0?'机构法人信息':'Institutional legal person information' }} </legend> |
| 67 | <div class="pt30" style="max-width: 500px"> | 69 | <div class="pt30" style="max-width: 500px"> |
| 68 | <el-form-item label="法人姓名" required prop="orgCode"> | 70 | <el-form-item :label="language==0?'法人姓名':'Legal Person Name'" required prop="orgCode"> |
| 69 | <el-input type="text" v-model="form.orgCode" placeholder="请输入内容"/> | 71 | <el-input type="text" v-model="form.orgCode" :placeholder="language==0?'请输入内容':''"/> |
| 70 | </el-form-item> | 72 | </el-form-item> |
| 71 | <el-form-item label="法定代表人身份文件" required prop="orgCert"> | 73 | <el-form-item :label="language==0?'法定代表人身份文件':'Identity documents of the legal representative'" required prop="orgCert"> |
| 72 | <file-upload v-model="form.orgCert"/> | 74 | <file-upload v-model="form.orgCert" :button-text="language==0?'上传文件':'Upload'"/> |
| 73 | </el-form-item> | 75 | </el-form-item> |
| 74 | 76 | ||
| 75 | </div> | 77 | </div> |
| ... | @@ -77,7 +79,7 @@ | ... | @@ -77,7 +79,7 @@ |
| 77 | 79 | ||
| 78 | </el-form> | 80 | </el-form> |
| 79 | <div class="text-center mt30"> | 81 | <div class="text-center mt30"> |
| 80 | <el-button type="primary" class="btn-lineG w200px" round>提交审核</el-button> | 82 | <el-button type="primary" class="btn-lineG w200px" round>{{ language==0?'提交审核':'Submit' }}</el-button> |
| 81 | </div> | 83 | </div> |
| 82 | </div> | 84 | </div> |
| 83 | </el-card> | 85 | </el-card> |
| ... | @@ -91,9 +93,12 @@ import {useRouter} from 'vue-router' | ... | @@ -91,9 +93,12 @@ import {useRouter} from 'vue-router' |
| 91 | import {ElMessage, ElMessageBox} from 'element-plus' | 93 | import {ElMessage, ElMessageBox} from 'element-plus' |
| 92 | import FileUpload from "@/components/FileUpload"; | 94 | import FileUpload from "@/components/FileUpload"; |
| 93 | import * as match from "@/apiPc/match"; | 95 | import * as match from "@/apiPc/match"; |
| 96 | import cache from "@/plugins/cache"; | ||
| 97 | const language = ref(cache.local.get('language') || 0) | ||
| 94 | 98 | ||
| 95 | const form = ref({}) | 99 | const form = ref({}) |
| 96 | const regionsList = ref([]) | 100 | const regionsList = ref([]) |
| 101 | const countryList = ref([]) | ||
| 97 | function submit() { | 102 | function submit() { |
| 98 | commitAudit().then(res => { | 103 | commitAudit().then(res => { |
| 99 | 104 | ||
| ... | @@ -101,9 +106,15 @@ function submit() { | ... | @@ -101,9 +106,15 @@ function submit() { |
| 101 | } | 106 | } |
| 102 | 107 | ||
| 103 | onMounted(() => { | 108 | onMounted(() => { |
| 109 | getCountryList() | ||
| 104 | getRegionsList() | 110 | getRegionsList() |
| 105 | getData() | 111 | getData() |
| 106 | }) | 112 | }) |
| 113 | function getCountryList() { | ||
| 114 | match.countryList().then(res => { | ||
| 115 | countryList.value = res.data | ||
| 116 | }) | ||
| 117 | } | ||
| 107 | function getRegionsList() { | 118 | function getRegionsList() { |
| 108 | match.regionsList().then(res => { | 119 | match.regionsList().then(res => { |
| 109 | regionsList.value = res.data | 120 | regionsList.value = res.data | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | <el-card :body-style="{'padding':'0'}"> | 3 | <el-card :body-style="{'padding':'0'}"> |
| 4 | <div class="indexTitle"><h3 class="leftboderTT">机构基础信息</h3></div> | 4 | <div class="indexTitle"><h3 class="leftboderTT">{{ language==0?'机构基础信息':'Institutional Basic Information' }}</h3></div> |
| 5 | <!-- uType字段 1 是个人 2是团体--> | 5 | <!-- uType字段 1 是个人 2是团体--> |
| 6 | <!-- {{user}}--> | 6 | <!-- {{user}}--> |
| 7 | <team-info :form="myform" v-if="user.utype=='2'"/> | 7 | <team-info :form="myform" :language="language" v-if="user.utype=='2'"/> |
| 8 | 8 | ||
| 9 | </el-card> | 9 | </el-card> |
| 10 | 10 | ||
| ... | @@ -20,7 +20,8 @@ import { ElMessage, ElMessageBox } from 'element-plus' | ... | @@ -20,7 +20,8 @@ import { ElMessage, ElMessageBox } from 'element-plus' |
| 20 | import { nationList } from '@/assets/js/data' | 20 | import { nationList } from '@/assets/js/data' |
| 21 | import {getGroupInfo} from "@/apiPc/match"; | 21 | import {getGroupInfo} from "@/apiPc/match"; |
| 22 | import TeamInfo from "@/viewsPc/center/teamInfo"; | 22 | import TeamInfo from "@/viewsPc/center/teamInfo"; |
| 23 | 23 | import cache from "@/plugins/cache"; | |
| 24 | const language = ref(cache.local.get('language') || 0) | ||
| 24 | const router = useRouter() | 25 | const router = useRouter() |
| 25 | const { proxy } = getCurrentInstance() | 26 | const { proxy } = getCurrentInstance() |
| 26 | const props = defineProps({ | 27 | const props = defineProps({ | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <el-card> | 2 | <el-card class="mb20"> |
| 3 | <div class="grid-content"> | ||
| 4 | <!-- <el-tabs v-model="activeName">--> | ||
| 5 | <!-- <el-tab-pane label="报项" name="first">--> | ||
| 6 | <div class="pad20"> | 3 | <div class="pad20"> |
| 7 | <el-form :model="query" :inline="true"> | 4 | <el-form :model="query" :inline="true"> |
| 8 | <el-form-item label="赛事名称"> | 5 | <el-form-item label="赛事名称"> |
| 9 | <el-input v-model="query.name" style="width: 214px;" @change="getList" /> | 6 | <el-input v-model="query.name" style="width: 214px;" @change="getList"/> |
| 10 | </el-form-item> | 7 | </el-form-item> |
| 11 | <el-form-item label="赛事时间"> | 8 | <el-form-item label="赛事时间"> |
| 12 | <el-date-picker | 9 | <el-date-picker |
| ... | @@ -23,8 +20,33 @@ | ... | @@ -23,8 +20,33 @@ |
| 23 | <el-button type="info" @click="reset(query)">重置</el-button> | 20 | <el-button type="info" @click="reset(query)">重置</el-button> |
| 24 | </el-form-item> | 21 | </el-form-item> |
| 25 | </el-form> | 22 | </el-form> |
| 23 | |||
| 24 | <div class="pd20"> | ||
| 25 | <div class="matchItem" v-for="n in tableData" :key="n.id" @click="goDetail(n.id)"> | ||
| 26 | <el-row :gutter="15"> | ||
| 27 | <el-col :lg="6" :md="8" :xl="10"> | ||
| 28 | <img class="mauto" :src="fillImgUrl(n.coverUrl)"> | ||
| 29 | </el-col> | ||
| 30 | <el-col :lg="18" :md="16" :xl="14"> | ||
| 31 | <div class="info"> | ||
| 32 | <h3>{{ n.name }}</h3> | ||
| 33 | <p class="ppl"><label>比赛时间:</label>{{ n.beginTime?.slice(0, 10) }} 至 {{ n.endTime?.slice(0, 10) }} | ||
| 34 | </p> | ||
| 35 | <p class="ppl"><label>地    点:</label>{{ n.address }}</p> | ||
| 36 | <p class="ppl"><label>报名截止:</label>{{ n.signEndTime?.slice(0, 10) }}</p> | ||
| 37 | |||
| 38 | <p class="ppl"><label>联系人员:</label>{{ n.contactPerson }}</p> | ||
| 39 | <p class="ppl"><label>联系电话:</label>{{ n.contactTelno }}</p> | ||
| 40 | <p class="ppl"><label>邮    箱:</label>{{ n.contactEmail }}</p> | ||
| 41 | |||
| 42 | </div> | ||
| 43 | </el-col> | ||
| 44 | </el-row> | ||
| 45 | </div> | ||
| 46 | </div> | ||
| 47 | |||
| 26 | <el-table :data="tableData" style="width: 100%"> | 48 | <el-table :data="tableData" style="width: 100%"> |
| 27 | <el-table-column type="index" label="序号" width="80" align="center" /> | 49 | <el-table-column type="index" label="序号" width="80" align="center"/> |
| 28 | <el-table-column label="赛事名称" min-width="260"> | 50 | <el-table-column label="赛事名称" min-width="260"> |
| 29 | <template #default="scope"> | 51 | <template #default="scope"> |
| 30 | {{ scope.row.name }} | 52 | {{ scope.row.name }} |
| ... | @@ -59,6 +81,7 @@ | ... | @@ -59,6 +81,7 @@ |
| 59 | </template> | 81 | </template> |
| 60 | </el-table-column> | 82 | </el-table-column> |
| 61 | </el-table> | 83 | </el-table> |
| 84 | |||
| 62 | <pagination | 85 | <pagination |
| 63 | v-show="total > 0" | 86 | v-show="total > 0" |
| 64 | v-model:page="query.pageNum" | 87 | v-model:page="query.pageNum" |
| ... | @@ -67,199 +90,28 @@ | ... | @@ -67,199 +90,28 @@ |
| 67 | @pagination="getList" | 90 | @pagination="getList" |
| 68 | /> | 91 | /> |
| 69 | </div> | 92 | </div> |
| 70 | <!-- </el-tab-pane>--> | ||
| 71 | <!-- <el-tab-pane label="订单" name="two">--> | ||
| 72 | <!-- <div class="pad20">--> | ||
| 73 | <!-- <el-form :model="query2" :inline="true">--> | ||
| 74 | <!-- <el-form-item label="订单状态">--> | ||
| 75 | <!-- <el-select v-model="query2.payStatus" @change="getBillList">--> | ||
| 76 | <!-- <el-option value="" label="全部" />--> | ||
| 77 | <!-- <el-option value="0" label="待支付" />--> | ||
| 78 | <!-- <el-option value="3" label="已完成" />--> | ||
| 79 | <!-- <el-option value="5" label="已退回" />--> | ||
| 80 | <!-- </el-select>--> | ||
| 81 | <!-- </el-form-item>--> | ||
| 82 | <!-- <el-form-item label="支付方式">--> | ||
| 83 | <!-- <el-select v-model="query2.payTypeParam" @change="getBillList">--> | ||
| 84 | <!-- <el-option value="" label="全部">全部</el-option>--> | ||
| 85 | <!-- <el-option value="0" label="线上支付">线上支付</el-option>--> | ||
| 86 | <!-- <el-option value="1" label="线下支付">线下支付</el-option>--> | ||
| 87 | <!-- <el-option value="2" label="会员卡支付">会员卡支付</el-option>--> | ||
| 88 | <!-- <el-option value="3" label="微信支付">微信支付</el-option>--> | ||
| 89 | <!-- </el-select>--> | ||
| 90 | <!-- </el-form-item>--> | ||
| 91 | <!-- <el-form-item label="订单号">--> | ||
| 92 | <!-- <el-input v-model="query2.code" />--> | ||
| 93 | <!-- </el-form-item>--> | ||
| 94 | <!-- <el-form-item label="订单名称">--> | ||
| 95 | <!-- <el-input v-model="query2.cptName" style="width: 214px;" @change="getBillList" />--> | ||
| 96 | <!-- </el-form-item>--> | ||
| 97 | <!-- <el-form-item label="付款时间">--> | ||
| 98 | <!-- <el-date-picker--> | ||
| 99 | <!-- v-model="payTimeArr"--> | ||
| 100 | <!-- format="YYYY-MM-DD" type="daterange"--> | ||
| 101 | <!-- value-format="YYYY-MM-DD" range-separator="至"--> | ||
| 102 | <!-- start-placeholder="开始时间"--> | ||
| 103 | <!-- end-placeholder="结束时间"--> | ||
| 104 | <!-- @change="getBillList"--> | ||
| 105 | <!-- />--> | ||
| 106 | <!-- </el-form-item>--> | ||
| 107 | <!-- <el-form-item label="下单时间">--> | ||
| 108 | <!-- <el-date-picker--> | ||
| 109 | <!-- v-model="commitTimeArr"--> | ||
| 110 | <!-- format="YYYY-MM-DD" type="daterange"--> | ||
| 111 | <!-- value-format="YYYY-MM-DD" range-separator="至"--> | ||
| 112 | <!-- start-placeholder="开始时间"--> | ||
| 113 | <!-- end-placeholder="结束时间"--> | ||
| 114 | <!-- @change="getBillList"--> | ||
| 115 | <!-- />--> | ||
| 116 | <!-- </el-form-item>--> | ||
| 117 | <!-- <el-form-item>--> | ||
| 118 | <!-- <el-button type="primary" @click="getBillList">查询</el-button>--> | ||
| 119 | <!-- <el-button type="info" @click="reset(query2)">重置</el-button>--> | ||
| 120 | <!-- </el-form-item>--> | ||
| 121 | |||
| 122 | <!-- </el-form>--> | ||
| 123 | |||
| 124 | <!-- <el-table v-if="billList.length>0" :data="billList" style="width: 100%">--> | ||
| 125 | <!-- <!– <el-table-column type="selection" width="80" />–>--> | ||
| 126 | <!-- <el-table-column prop="id" label="订单编号" min-width="200" />--> | ||
| 127 | <!-- <el-table-column prop="cptName" label="订单名称" min-width="200" />--> | ||
| 128 | <!-- <el-table-column prop="commitTime" label="下单时间" min-width="180" />--> | ||
| 129 | <!-- <el-table-column prop="payTime" label="付款时间" min-width="180" />--> | ||
| 130 | <!-- <el-table-column label="支付金额" min-width="120" align="center">--> | ||
| 131 | <!-- <template #default="scope">--> | ||
| 132 | <!-- <span v-if="scope.row.needPay=='0'" class="green">免费订单</span>--> | ||
| 133 | <!-- <span v-else>¥{{ scope.row.totalAmount }}</span>--> | ||
| 134 | <!-- </template>--> | ||
| 135 | <!-- </el-table-column>--> | ||
| 136 | <!-- <!– <el-table-column label="已付金额" min-width="120" align="center">–>--> | ||
| 137 | <!-- <!– <template #default="scope">–>--> | ||
| 138 | <!-- <!– <span v-if="scope.row.needPay=='0'" class="green">免费订单</span>–>--> | ||
| 139 | <!-- <!– <span v-else-if="scope.row.totalPayAmount" class="orange">¥{{ scope.row.totalPayAmount }}</span>–>--> | ||
| 140 | <!-- <!– <span v-else>--</span>–>--> | ||
| 141 | <!-- <!– </template>–>--> | ||
| 142 | <!-- <!– </el-table-column>–>--> | ||
| 143 | <!-- <el-table-column label="付款方式" min-width="120" align="center">--> | ||
| 144 | <!-- <template #default="scope">--> | ||
| 145 | <!-- <span v-if="scope.row.payType=='0'">会员卡支付</span>--> | ||
| 146 | <!-- <span v-else-if="scope.row.payType=='1'">微信支付</span>--> | ||
| 147 | <!-- <span v-else-if="scope.row.payType=='2'">线下支付</span>--> | ||
| 148 | <!-- </template>--> | ||
| 149 | <!-- </el-table-column>--> | ||
| 150 | <!-- <el-table-column prop="name" label="支付状态" min-width="120" align="center">--> | ||
| 151 | <!-- <template #default="scope">--> | ||
| 152 | <!-- <span v-if="scope.row.needPay=='0'" class="green">免费订单</span>--> | ||
| 153 | <!-- <div v-else>--> | ||
| 154 | <!-- <span v-if="scope.row.payStatus=='0'">待支付</span>--> | ||
| 155 | <!-- <span v-if="scope.row.payStatus=='1'">待核销</span>--> | ||
| 156 | <!-- <span v-if="scope.row.payStatus=='2'">付款中</span>--> | ||
| 157 | <!-- <span v-if="scope.row.payStatus=='3'" class="green">已完成</span>--> | ||
| 158 | <!-- <span v-if="scope.row.payStatus=='4'">退款中</span>--> | ||
| 159 | <!-- <span v-if="scope.row.payStatus=='5'" class="text-danger">已退回</span>--> | ||
| 160 | <!-- <span v-if="scope.row.payStatus=='6'">退款核销中</span>--> | ||
| 161 | <!-- </div>--> | ||
| 162 | <!-- </template>--> | ||
| 163 | <!-- </el-table-column>--> | ||
| 164 | <!-- <el-table-column prop="name" label="审核状态" min-width="120" align="center">--> | ||
| 165 | <!-- <template #default="scope">--> | ||
| 166 | <!-- <!– 待核销,待审核,审核拒绝,审核通过,已取消–>--> | ||
| 167 | <!-- <span v-if="scope.row.auditStatus=='1'" class="text-warning">审核中</span>--> | ||
| 168 | <!-- <span v-if="scope.row.auditStatus=='2'" class="green">审核通过</span>--> | ||
| 169 | <!-- <span v-if="scope.row.auditStatus=='3'" class="text-danger">审核拒绝</span>--> | ||
| 170 | <!-- <span v-if="scope.row.auditStatus=='4'">已取消</span>--> | ||
| 171 | <!-- </template>--> | ||
| 172 | <!-- </el-table-column>--> | ||
| 173 | <!-- <el-table-column label="操作" align="center" fixed="right" class-name="small-padding" width="150">--> | ||
| 174 | <!-- <template #default="scope">--> | ||
| 175 | <!-- <el-button type="text" @click="billDetail(scope.row)">详情</el-button>--> | ||
| 176 | <!-- <el-button--> | ||
| 177 | <!-- v-if="scope.row.payType!='2'&&scope.row.payStatus=='0'&&scope.row.auditStatus=='0'" type="text"--> | ||
| 178 | <!-- @click="goPay(scope.row)"--> | ||
| 179 | <!-- >支付--> | ||
| 180 | <!-- </el-button>--> | ||
| 181 | <!-- <el-button--> | ||
| 182 | <!-- v-if="scope.row.payStatus=='0'&&scope.row.auditStatus=='0'&&scope.row.payType!='2'" type="text"--> | ||
| 183 | <!-- @click="cancelBill(scope.row)"--> | ||
| 184 | <!-- >取消--> | ||
| 185 | <!-- </el-button>--> | ||
| 186 | <!-- </template>--> | ||
| 187 | <!-- </el-table-column>--> | ||
| 188 | <!-- </el-table>--> | ||
| 189 | <!-- <el-empty v-if="billList.length==0" description="暂无数据" />--> | ||
| 190 | <!-- <pagination--> | ||
| 191 | <!-- v-show="total > 0"--> | ||
| 192 | <!-- v-model:page="query2.pageNum"--> | ||
| 193 | <!-- v-model:limit="query2.pageSize"--> | ||
| 194 | <!-- :total="total2"--> | ||
| 195 | <!-- @pagination="getBillList"--> | ||
| 196 | <!-- />--> | ||
| 197 | <!-- </div>--> | ||
| 198 | <!-- </el-tab-pane>--> | ||
| 199 | |||
| 200 | <!-- </el-tabs>--> | ||
| 201 | 93 | ||
| 202 | <!-- 报项详情--> | 94 | <!-- 报项详情--> |
| 203 | <dialogModifySign :props="dialogModifySignProps" /> | 95 | <dialogModifySign :props="dialogModifySignProps"/> |
| 204 | <!-- 订单详情--> | 96 | <!-- 订单详情--> |
| 205 | <dialogModifyBill :props="dialogModifyBillProps" /> | 97 | <dialogModifyBill :props="dialogModifyBillProps"/> |
| 206 | |||
| 207 | <el-dialog v-model="payPop" title="请选择支付方式" width="720px"> | ||
| 208 | 98 | ||
| 209 | <div class="centerPrice"> | ||
| 210 | ¥<span>{{ nowBill?.totalAmount }}</span> | ||
| 211 | </div> | ||
| 212 | <div style="margin: 40px"> | ||
| 213 | <el-radio-group v-model="payType"> | ||
| 214 | <el-radio v-if="myBalance>'0'" label="0" size="large" border><img | ||
| 215 | src="@/assets/img/zf02.png" | ||
| 216 | style="width: 30px;" | ||
| 217 | > | ||
| 218 | 会员卡支付<span>(余额 <i class="orange">¥{{ myBalance }}</i>)</span> | ||
| 219 | </el-radio> | ||
| 220 | <el-radio label="1" size="large" border><img src="@/assets/img/zf_wx.png">微信</el-radio> | ||
| 221 | <el-radio label="2" size="large" border><img src="@/assets/img/zf_xj.png">线下支付</el-radio> | ||
| 222 | </el-radio-group> | ||
| 223 | </div> | ||
| 224 | <div class="panel-footer text-center"> | ||
| 225 | <el-button type="success" round @click="payBill">立即支付</el-button> | ||
| 226 | </div> | ||
| 227 | </el-dialog> | ||
| 228 | <el-dialog v-model="showOrganizerInfo" title=" 线下支付" width="400px"> | ||
| 229 | <ul class="orgbox"> | ||
| 230 | <li>单位:{{ org.organizerName }}</li> | ||
| 231 | <li>开户行:{{ org.organizerBank }}</li> | ||
| 232 | <li>账户:{{ org.organizerAccount }}</li> | ||
| 233 | <li>打款金额:<span class="orange">¥{{ org.organizerFee }}</span></li> | ||
| 234 | </ul> | ||
| 235 | <div class="text-center"> | ||
| 236 | <el-button type="success" round @click="payMationDone">我已复制</el-button> | ||
| 237 | </div> | ||
| 238 | </el-dialog> | ||
| 239 | <el-dialog v-model="showResult"> | ||
| 240 | <el-result | ||
| 241 | icon="success" | ||
| 242 | title="支付成功" | ||
| 243 | /> | ||
| 244 | </el-dialog> | ||
| 245 | <we-pay ref="wePayRef" @close="wePayDone" /> | ||
| 246 | </div> | ||
| 247 | </el-card> | 99 | </el-card> |
| 248 | 100 | ||
| 249 | </template> | 101 | </template> |
| 250 | 102 | ||
| 251 | <script setup> | 103 | <script setup> |
| 252 | import { ref } from 'vue' | 104 | import {ref} from 'vue' |
| 253 | import { useRouter } from 'vue-router' | 105 | import {useRouter} from 'vue-router' |
| 254 | import { getCurrentInstance, onMounted } from '@vue/runtime-core' | 106 | import {getCurrentInstance, onMounted} from '@vue/runtime-core' |
| 255 | import dialogModifySign from './component/modifySign' | 107 | import dialogModifySign from './component/modifySign' |
| 256 | import dialogModifyBill from './component/modifyBill' | 108 | import dialogModifyBill from './component/modifyBill' |
| 257 | import * as match from '@/apiPc/match' | 109 | import * as match from '@/apiPc/match' |
| 258 | import { ElMessage, ElMessageBox } from 'element-plus' | 110 | import {ElMessage, ElMessageBox} from 'element-plus' |
| 259 | import _ from 'lodash' | 111 | import _ from 'lodash' |
| 260 | 112 | ||
| 261 | const router = useRouter() | 113 | const router = useRouter() |
| 262 | const { proxy } = getCurrentInstance() | 114 | const {proxy} = getCurrentInstance() |
| 263 | const total = ref(0) | 115 | const total = ref(0) |
| 264 | const total2 = ref(0) | 116 | const total2 = ref(0) |
| 265 | const payMationDone = () => { | 117 | const payMationDone = () => { |
| ... | @@ -286,7 +138,7 @@ const cptPeriodArr = ref([]) | ... | @@ -286,7 +138,7 @@ const cptPeriodArr = ref([]) |
| 286 | const payTimeArr = ref([]) | 138 | const payTimeArr = ref([]) |
| 287 | const commitTimeArr = ref([]) | 139 | const commitTimeArr = ref([]) |
| 288 | const countryList = ref([]) | 140 | const countryList = ref([]) |
| 289 | const tableData = ref([]) | 141 | const tableData = ref([{name: '111'}]) |
| 290 | const billList = ref([]) | 142 | const billList = ref([]) |
| 291 | const query = ref({ | 143 | const query = ref({ |
| 292 | pageNum: 1, | 144 | pageNum: 1, |
| ... | @@ -305,8 +157,6 @@ const nowBill = ref({}) | ... | @@ -305,8 +157,6 @@ const nowBill = ref({}) |
| 305 | const org = ref({}) | 157 | const org = ref({}) |
| 306 | 158 | ||
| 307 | onMounted(() => { | 159 | onMounted(() => { |
| 308 | getCountryList() | ||
| 309 | getData() | ||
| 310 | getList() | 160 | getList() |
| 311 | getBillList() | 161 | getBillList() |
| 312 | }) | 162 | }) |
| ... | @@ -326,13 +176,6 @@ const reset = (form) => { | ... | @@ -326,13 +176,6 @@ const reset = (form) => { |
| 326 | getList() | 176 | getList() |
| 327 | } | 177 | } |
| 328 | 178 | ||
| 329 | function getData() { | ||
| 330 | match.getMyPersonInfo().then(res => { | ||
| 331 | myform.value = res.data | ||
| 332 | myform.value.labelArr = myform.value.label?.split(',') | ||
| 333 | groupList.value = myform.value.groups | ||
| 334 | }) | ||
| 335 | } | ||
| 336 | 179 | ||
| 337 | function wePayDone() { | 180 | function wePayDone() { |
| 338 | payPop.value = false | 181 | payPop.value = false |
| ... | @@ -344,10 +187,10 @@ function getList() { | ... | @@ -344,10 +187,10 @@ function getList() { |
| 344 | if (cptPeriodArr.value) { | 187 | if (cptPeriodArr.value) { |
| 345 | query.value.cptPeriod = cptPeriodArr.value.toString() | 188 | query.value.cptPeriod = cptPeriodArr.value.toString() |
| 346 | } | 189 | } |
| 347 | match.getMySignCptList(query.value).then(res => { | 190 | // match.getMySignCptList(query.value).then(res => { |
| 348 | tableData.value = res.rows | 191 | // tableData.value = res.rows |
| 349 | total.value = res.total | 192 | // total.value = res.total |
| 350 | }) | 193 | // }) |
| 351 | } | 194 | } |
| 352 | 195 | ||
| 353 | function getBillList() { | 196 | function getBillList() { |
| ... | @@ -360,18 +203,12 @@ function getBillList() { | ... | @@ -360,18 +203,12 @@ function getBillList() { |
| 360 | }) | 203 | }) |
| 361 | } | 204 | } |
| 362 | 205 | ||
| 363 | function getCountryList() { | ||
| 364 | match.countryList().then(res => { | ||
| 365 | countryList.value = res.data | ||
| 366 | }) | ||
| 367 | } | ||
| 368 | |||
| 369 | function signRow(row) { | 206 | function signRow(row) { |
| 370 | _.assign(dialogModifySignProps.value, dialogPropsBase, { | 207 | _.assign(dialogModifySignProps.value, dialogPropsBase, { |
| 371 | open: true, | 208 | open: true, |
| 372 | isView: true, | 209 | isView: true, |
| 373 | title: '报项详情', | 210 | title: '报项详情', |
| 374 | data: { ...row } | 211 | data: {...row} |
| 375 | }) | 212 | }) |
| 376 | } | 213 | } |
| 377 | 214 | ||
| ... | @@ -393,7 +230,7 @@ function payBill() { | ... | @@ -393,7 +230,7 @@ function payBill() { |
| 393 | ElMessage.error('请选择支付方式') | 230 | ElMessage.error('请选择支付方式') |
| 394 | return | 231 | return |
| 395 | } | 232 | } |
| 396 | match.payMatch({ orderId: nowBill.value.id, payType: payType.value }).then(res => { | 233 | match.payMatch({orderId: nowBill.value.id, payType: payType.value}).then(res => { |
| 397 | if (payType.value == 2) { | 234 | if (payType.value == 2) { |
| 398 | org.value = res.data.org | 235 | org.value = res.data.org |
| 399 | showOrganizerInfo.value = true | 236 | showOrganizerInfo.value = true |
| ... | @@ -411,7 +248,7 @@ function billDetail(bill) { | ... | @@ -411,7 +248,7 @@ function billDetail(bill) { |
| 411 | open: true, | 248 | open: true, |
| 412 | isView: true, | 249 | isView: true, |
| 413 | title: '订单详情', | 250 | title: '订单详情', |
| 414 | data: { ...bill } | 251 | data: {...bill} |
| 415 | }) | 252 | }) |
| 416 | } | 253 | } |
| 417 | 254 | ||
| ... | @@ -438,6 +275,53 @@ function downloadVoucher(row) { | ... | @@ -438,6 +275,53 @@ function downloadVoucher(row) { |
| 438 | </script> | 275 | </script> |
| 439 | 276 | ||
| 440 | <style scoped lang="scss"> | 277 | <style scoped lang="scss"> |
| 278 | .matchItem { | ||
| 279 | cursor: pointer; | ||
| 280 | margin: 0 0 20px; | ||
| 281 | padding: 0 0 20px; | ||
| 282 | background: #FFFFFF; | ||
| 283 | border-bottom: 1px solid #e5e5e5; | ||
| 284 | position: relative; | ||
| 285 | |||
| 286 | &:last-child { | ||
| 287 | border-bottom: none; | ||
| 288 | } | ||
| 289 | |||
| 290 | .el-avatar { | ||
| 291 | position: absolute; | ||
| 292 | left: 20px; | ||
| 293 | top: 30px; | ||
| 294 | |||
| 295 | img { | ||
| 296 | background: #fff; | ||
| 297 | } | ||
| 298 | } | ||
| 299 | |||
| 300 | .info { | ||
| 301 | p { | ||
| 302 | font-size: 14px; | ||
| 303 | } | ||
| 304 | } | ||
| 305 | |||
| 306 | .typeTag { | ||
| 307 | position: absolute; | ||
| 308 | right: 0; | ||
| 309 | top: 0; | ||
| 310 | } | ||
| 311 | |||
| 312 | h3 { | ||
| 313 | font-weight: 500; | ||
| 314 | margin: 0 0 10px; | ||
| 315 | font-size: 18px; | ||
| 316 | color: #000000; | ||
| 317 | text-overflow: ellipsis; | ||
| 318 | } | ||
| 319 | |||
| 320 | &:hover h3 { | ||
| 321 | color: var(--el-color-primary); | ||
| 322 | } | ||
| 323 | } | ||
| 324 | |||
| 441 | .centerPrice { | 325 | .centerPrice { |
| 442 | text-align: center; | 326 | text-align: center; |
| 443 | font-size: 26px; | 327 | font-size: 26px; |
| ... | @@ -449,13 +333,6 @@ function downloadVoucher(row) { | ... | @@ -449,13 +333,6 @@ function downloadVoucher(row) { |
| 449 | } | 333 | } |
| 450 | } | 334 | } |
| 451 | 335 | ||
| 452 | .app-container { | ||
| 453 | background: #F5F7F9; | ||
| 454 | } | ||
| 455 | |||
| 456 | .grid-content { | ||
| 457 | background: #fff; | ||
| 458 | } | ||
| 459 | 336 | ||
| 460 | :deep(.el-tabs__nav-wrap) { | 337 | :deep(.el-tabs__nav-wrap) { |
| 461 | padding: 0 15px; | 338 | padding: 0 15px; | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <el-card> | 2 | <el-card class="mb20"> |
| 3 | <div class="funcBtns"> | 3 | <div class="funcBtns"> |
| 4 | <el-button type="primary" @click="addMember">添加选手</el-button> | 4 | <el-button type="primary" @click="addMember">{{ language==0?'添加选手':'Add Player'}}</el-button> |
| 5 | <el-button type="primary" plain @click="importSportman">导入选手</el-button> | 5 | <el-button type="primary" plain @click="importSportman">{{ language==0?'导入选手':'Import Player' }}</el-button> |
| 6 | <el-button type="primary" plain> | 6 | <el-button type="primary" plain> |
| 7 | <a href="/file/sportsmanTemplate.xlsx" target="_blank">下载模板</a> | 7 | <a href="/file/sportsmanTemplate.xlsx" target="_blank">Download template</a> |
| 8 | </el-button> | 8 | </el-button> |
| 9 | </div> | 9 | </div> |
| 10 | <div class="from-Card"> | 10 | <div class="from-Card"> |
| 11 | <el-form :inline="true" :model="query" class="mt20" label-width="60" size="small"> | 11 | <el-form :inline="true" :model="query" class="mt20" label-width="60" size="small"> |
| 12 | <el-form-item label="姓名"> | 12 | <el-form-item :label="language==0?'姓名':'Name'"> |
| 13 | <el-input v-model="query.realName" style="width: 120px;" clearable/> | 13 | <el-input v-model="query.realName" style="width: 120px;" clearable/> |
| 14 | </el-form-item> | 14 | </el-form-item> |
| 15 | <el-form-item label="短名"> | 15 | <el-form-item :label="language==0?'短名':'Short Name'"> |
| 16 | <el-input v-model="query.shortName" style="width: 120px;" clearable/> | 16 | <el-input v-model="query.shortName" style="width: 120px;" clearable/> |
| 17 | </el-form-item> | 17 | </el-form-item> |
| 18 | <el-form-item label="手机号码"> | 18 | <el-form-item :label="language==0?'手机号码':'Phone Number'"> |
| 19 | <el-input v-model="query.phone" style="width: 120px;" clearable/> | 19 | <el-input v-model="query.phone" style="width: 120px;" clearable/> |
| 20 | </el-form-item> | 20 | </el-form-item> |
| 21 | <el-form-item label="邮箱"> | 21 | <el-form-item :label="language==0?'邮箱':'E-mail'"> |
| 22 | <el-input v-model="query.email" style="width: 120px;" clearable/> | 22 | <el-input v-model="query.email" style="width: 120px;" clearable/> |
| 23 | </el-form-item> | 23 | </el-form-item> |
| 24 | <el-form-item label="证件类型"> | 24 | <el-form-item :label="language==0?'证件类型':'ID Type'"> |
| 25 | <el-input v-model="query.idcType" style="width: 120px;" clearable/> | 25 | <el-input v-model="query.idcType" style="width: 120px;" clearable/> |
| 26 | </el-form-item> | 26 | </el-form-item> |
| 27 | <el-form-item label="证件号"> | 27 | <el-form-item :label="language==0?'证件号码':'ID NO.'"> |
| 28 | <el-input v-model="query.idcode" style="width: 120px;" clearable/> | 28 | <el-input v-model="query.idcode" style="width: 120px;" clearable/> |
| 29 | </el-form-item> | 29 | </el-form-item> |
| 30 | <el-form-item label="角色"> | 30 | <el-form-item :label="language==0?'会员角色':'Role'"> |
| 31 | <el-input v-model="query.label" style="width: 120px;" clearable/> | 31 | <el-select v-model="query.label" multiple> |
| 32 | <el-option v-for="l in labels" :key="l.value" :value="l.value" :label="language==0?(l.label):(l.enlabel)"/> | ||
| 33 | </el-select> | ||
| 32 | </el-form-item> | 34 | </el-form-item> |
| 33 | <el-form-item> | 35 | <el-form-item> |
| 34 | <el-button type="primary" @click="getList">查询</el-button> | 36 | <el-button type="primary" @click="getList">{{ language==0?'查询':'Search' }}</el-button> |
| 35 | </el-form-item> | 37 | </el-form-item> |
| 36 | </el-form> | 38 | </el-form> |
| 37 | </div> | 39 | </div> |
| 38 | 40 | ||
| 39 | <!-- 人员表格--> | 41 | <!-- 人员表格--> |
| 40 | <person-table :table-data="tableData" @edit="editCoach" @delete="delperson"/> | 42 | <person-table :table-data="tableData" @edit="editCoach" @delete="delperson"/> |
| 41 | <el-table :data="tableData" class="mt20"> | ||
| 42 | <el-table-column type="index" label="序号" width="80" align="center"/> | ||
| 43 | <el-table-column label="所属国家" prop="countryName"/> | ||
| 44 | <el-table-column label="姓氏" prop="xing"/> | ||
| 45 | <el-table-column label="名" prop="ming"/> | ||
| 46 | <el-table-column label="短名" prop="shortName"/> | ||
| 47 | <el-table-column label="性别" prop="sexStr"/> | ||
| 48 | <el-table-column label="年龄" prop="age"/> | ||
| 49 | <el-table-column label="出生日期" prop="birth" width="100"/> | ||
| 50 | <el-table-column label="手机号码" prop="phone" width="120"/> | ||
| 51 | <el-table-column label="邮箱" prop="email" width="150"/> | ||
| 52 | <el-table-column label="证件类型" prop="idcTypeStr"/> | ||
| 53 | <el-table-column label="证件号码" prop="idcCode" width="200"/> | ||
| 54 | <el-table-column label="会员角色"> | ||
| 55 | <template #default="scope"> | ||
| 56 | <span v-for="item in scope.row.label?.split(',')" :key="item.id"> | ||
| 57 | <el-tag type="primary" size="mini" v-if="item==='0'" effect="dark" class="ml10">运动员</el-tag> | ||
| 58 | <el-tag type="info" size="mini" v-if="item==='1'" effect="dark" class="ml10">教练</el-tag> | ||
| 59 | <el-tag type="info" size="mini" v-if="item==='2'" effect="dark" class="ml10">领队</el-tag> | ||
| 60 | <el-tag type="info" size="mini" v-if="item==='3'" effect="dark" class="ml10">队医</el-tag> | ||
| 61 | <el-tag type="info" size="mini" v-if="item==='4'" effect="dark" class="ml10">翻译</el-tag> | ||
| 62 | <el-tag type="info" size="mini" v-if="item==='5'" effect="dark" class="ml10">官员</el-tag> | ||
| 63 | <el-tag type="info" size="mini" v-if="item==='6'" effect="dark" class="ml10">其他</el-tag> | ||
| 64 | </span> | ||
| 65 | </template> | ||
| 66 | </el-table-column> | ||
| 67 | <el-table-column label="详细地址" prop="address"/> | ||
| 68 | <el-table-column label="操作" fixed="right" width="160" header-align="center" align="center"> | ||
| 69 | <template #default="scope"> | ||
| 70 | <a class="text-primary pd10" @click="editCoach(scope.row)">编辑</a> | ||
| 71 | <a class="text-primary pd10" @click="delperson(scope.row)">删除</a> | ||
| 72 | </template> | ||
| 73 | </el-table-column> | ||
| 74 | </el-table> | ||
| 75 | <paginationPc | 43 | <paginationPc |
| 76 | v-show="total>0" | 44 | v-show="total>0" |
| 77 | v-model:page="query.pageNum" | 45 | v-model:page="query.pageNum" |
| ... | @@ -100,20 +68,32 @@ import * as match from '@/apiPc/match' | ... | @@ -100,20 +68,32 @@ import * as match from '@/apiPc/match' |
| 100 | import {ElMessage, ElMessageBox} from 'element-plus' | 68 | import {ElMessage, ElMessageBox} from 'element-plus' |
| 101 | import {getGroupPersonList} from "@/apiPc/match"; | 69 | import {getGroupPersonList} from "@/apiPc/match"; |
| 102 | import PersonTable from "@/viewsPc/match/components/personTable"; | 70 | import PersonTable from "@/viewsPc/match/components/personTable"; |
| 103 | 71 | import cache from "@/plugins/cache"; | |
| 72 | import useUserStore from "@/store/modules/user"; | ||
| 73 | const language = ref(cache.local.get('language') || 0) | ||
| 104 | const tableData = ref([]) | 74 | const tableData = ref([]) |
| 75 | const labels = ref([ | ||
| 76 | {value: '0', label: '运动员', enlabel: 'Sportsman'}, | ||
| 77 | {value: '1', label: '教练', enlabel: 'Coach'}, | ||
| 78 | {value: '2', label: '领队', enlabel: 'Leader'}, | ||
| 79 | {value: '3', label: '队医', enlabel: 'Nurse'}, | ||
| 80 | {value: '4', label: '翻译', enlabel: 'Translator'}, | ||
| 81 | {value: '5', label: '官员', enlabel: 'Official'}, | ||
| 82 | {value: '6', label: '其他', enlabel: 'Other'} | ||
| 83 | ]) | ||
| 105 | const query = ref({ | 84 | const query = ref({ |
| 106 | pageNum: 1, pageSize: 10 | 85 | pageNum: 1, pageSize: 10 |
| 107 | }) | 86 | }) |
| 108 | const total = ref(0) | 87 | const total = ref(0) |
| 109 | const groupId = ref('1759813142128967681') | 88 | const group = useUserStore().group |
| 89 | const groupId = ref(group.id) | ||
| 110 | onMounted(() => { | 90 | onMounted(() => { |
| 111 | getList(groupId.value) | 91 | getList(groupId.value) |
| 112 | }) | 92 | }) |
| 113 | 93 | ||
| 114 | function addMember() { | 94 | function addMember() { |
| 115 | const params = { | 95 | const params = { |
| 116 | title: '添加人员', | 96 | title: language.value==0?'添加人员':'Add', |
| 117 | id: 0, | 97 | id: 0, |
| 118 | groupId: groupId.value | 98 | groupId: groupId.value |
| 119 | } | 99 | } |
| ... | @@ -122,7 +102,7 @@ function addMember() { | ... | @@ -122,7 +102,7 @@ function addMember() { |
| 122 | 102 | ||
| 123 | function importSportman() { | 103 | function importSportman() { |
| 124 | const params = { | 104 | const params = { |
| 125 | title: '批量导入选手', | 105 | title: language.value==0?'批量导入选手':'Import', |
| 126 | groupId: groupId.value | 106 | groupId: groupId.value |
| 127 | } | 107 | } |
| 128 | proxy.$refs['dialogImportProps'].open(params) | 108 | proxy.$refs['dialogImportProps'].open(params) |
| ... | @@ -135,23 +115,38 @@ function getList() { | ... | @@ -135,23 +115,38 @@ function getList() { |
| 135 | }) | 115 | }) |
| 136 | } | 116 | } |
| 137 | 117 | ||
| 138 | function editCoach(row) { | 118 | function editCoach(row,title) { |
| 139 | const params = { | 119 | const params = { |
| 140 | id: row.id, | 120 | id: row.id, |
| 141 | groupId: row.groupId | 121 | groupId: row.groupId, |
| 122 | title: title | ||
| 142 | } | 123 | } |
| 143 | proxy.$refs['dialogAddCoach'].open(params) | 124 | proxy.$refs['dialogAddCoach'].open(params) |
| 144 | } | 125 | } |
| 145 | 126 | ||
| 146 | function delperson(p) { | 127 | function delperson(p) { |
| 147 | //删除团队下的人 | 128 | //删除团队下的人 |
| 148 | ElMessageBox.confirm(`确定删除${p.realName}吗?`, '提示', { | 129 | let text = '' |
| 149 | confirmButtonText: '确定', | 130 | let t = '提示' |
| 150 | cancelButtonText: '取消', | 131 | let s = '确定' |
| 132 | let c = '取消' | ||
| 133 | let msg = '操作成功' | ||
| 134 | if (language.value==0){ | ||
| 135 | text = `确定删除${p.realName}吗?` | ||
| 136 | } else { | ||
| 137 | text = `Delete ${p.realName}?` | ||
| 138 | t = 'Tips' | ||
| 139 | s = 'Confirm' | ||
| 140 | c = 'Cancel' | ||
| 141 | msg = ' Successful!' | ||
| 142 | } | ||
| 143 | ElMessageBox.confirm(text, t, { | ||
| 144 | confirmButtonText: s, | ||
| 145 | cancelButtonText: c, | ||
| 151 | type: 'warning' | 146 | type: 'warning' |
| 152 | }).then(() => { | 147 | }).then(() => { |
| 153 | match.delPerson(p.id).then(res => { | 148 | match.delPerson(p.id).then(res => { |
| 154 | ElMessage.success('操作成功') | 149 | ElMessage.success(msg) |
| 155 | getList(groupId.value) | 150 | getList(groupId.value) |
| 156 | }) | 151 | }) |
| 157 | }) | 152 | }) | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div class="mb20"> |
| 3 | <el-card :body-style="{'padding':'0'}"> | 3 | <el-card :body-style="{'padding':'0'}"> |
| 4 | <div class="indexTitle"><h3 class="leftboderTT">修改密码</h3></div> | 4 | <div class="indexTitle"><h3 class="leftboderTT">{{ language==0?'修改密码':'Change Password' }}</h3></div> |
| 5 | 5 | ||
| 6 | <div class="pd20"> | 6 | <div class="pd20"> |
| 7 | <div class="d-form-border" style="margin-top: 0"> | 7 | <div class="d-form-border" style="margin-top: 0"> |
| 8 | <el-form class="d-form" ref="pwdRef" :model="user" :rules="rules" label-width="120px" | 8 | <el-form class="d-form" ref="pwdRef" :model="user" :rules="rules" |
| 9 | label-width="120px" :label-position="language==0?'left':'top'" | ||
| 9 | style="max-width: 500px;margin: auto"> | 10 | style="max-width: 500px;margin: auto"> |
| 10 | <el-form-item label="旧密码" prop="oldPassword"> | 11 | <el-form-item :label="language==0?'旧密码':'Old Password'" prop="oldPassword"> |
| 11 | <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/> | 12 | <el-input v-model="user.oldPassword" :placeholder="language==0?'请输入旧密码':''" type="password" show-password/> |
| 12 | </el-form-item> | 13 | </el-form-item> |
| 13 | <el-form-item label="新密码" prop="newPassword"> | 14 | <el-form-item :label="language==0?'新密码':'New Password'" prop="newPassword"> |
| 14 | <el-input v-model="user.newPassword" placeholder="请设置8位以上大小写字母、数字、特殊符号" type="password" | 15 | <el-input v-model="user.newPassword" :placeholder="language==0?'请设置8位以上大小写字母、数字、特殊符号':''" type="password" |
| 15 | show-password/> | 16 | show-password/> |
| 16 | </el-form-item> | 17 | </el-form-item> |
| 17 | <el-form-item label="确认密码" prop="confirmPassword"> | 18 | <el-form-item :label="language==0?'确认密码':'Confirm Password'" prop="confirmPassword"> |
| 18 | <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/> | 19 | <el-input v-model="user.confirmPassword" :placeholder="language==0?'请确认新密码':''" type="password" show-password/> |
| 19 | </el-form-item> | 20 | </el-form-item> |
| 20 | 21 | ||
| 21 | </el-form> | 22 | </el-form> |
| 22 | </div> | 23 | </div> |
| 23 | <el-row justify="center"> | 24 | <el-row justify="center"> |
| 24 | <el-button type="primary" class="btn-lineG" @click="submit">保存</el-button> | 25 | <el-button type="primary" class="btn-lineG" @click="submit">{{ language==0?'保存':'Save' }}</el-button> |
| 25 | </el-row> | 26 | </el-row> |
| 26 | </div> | 27 | </div> |
| 27 | </el-card> | 28 | </el-card> |
| ... | @@ -33,6 +34,8 @@ import {updateUserPwd} from '@/api/system/user' | ... | @@ -33,6 +34,8 @@ import {updateUserPwd} from '@/api/system/user' |
| 33 | import useUserStore from '@/store/modules/user' | 34 | import useUserStore from '@/store/modules/user' |
| 34 | import {reactive, ref, getCurrentInstance} from 'vue' | 35 | import {reactive, ref, getCurrentInstance} from 'vue' |
| 35 | import {validPassword} from '@/utils/validate' | 36 | import {validPassword} from '@/utils/validate' |
| 37 | import cache from "@/plugins/cache"; | ||
| 38 | const language = ref(cache.local.get('language') || 0) | ||
| 36 | 39 | ||
| 37 | const show = ref(false) | 40 | const show = ref(false) |
| 38 | const {proxy} = getCurrentInstance() | 41 | const {proxy} = getCurrentInstance() | ... | ... |
src/viewsPc/center/myReservation.vue
0 → 100644
| 1 | <template> | ||
| 2 | <div> | ||
| 3 | <el-card :body-style="{'padding':'0'}"> | ||
| 4 | <div class="indexTitle"><h3 class="leftboderTT">{{ language==0?'我的预订':'My reservation' }}</h3></div> | ||
| 5 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="list?.length == 0"/> | ||
| 6 | |||
| 7 | <div class="pd20"></div> | ||
| 8 | </el-card> | ||
| 9 | </div> | ||
| 10 | </template> | ||
| 11 | |||
| 12 | <script setup> | ||
| 13 | import cache from "@/plugins/cache"; | ||
| 14 | import {onMounted} from "@vue/runtime-core"; | ||
| 15 | const language = ref(cache.local.get('language') || 0) | ||
| 16 | const list = ref([]) | ||
| 17 | </script> | ||
| 18 | |||
| 19 | <style scoped lang="scss"> | ||
| 20 | .indexTitle { | ||
| 21 | margin: 20px 0 12px; | ||
| 22 | padding: 0 20px 15px; | ||
| 23 | border-bottom: 1px solid #e5e5e5; | ||
| 24 | |||
| 25 | h3 { | ||
| 26 | font-size: 16px; | ||
| 27 | color: var(--el-color-primary); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | |||
| 32 | </style> | ||
| 33 |
src/viewsPc/center/mySms.vue
0 → 100644
| 1 | <template> | ||
| 2 | <div> | ||
| 3 | <el-card :body-style="{'padding':'0'}"> | ||
| 4 | <div class="indexTitle"><h3 class="leftboderTT">{{ language==0?'系统消息':'System messages' }}</h3></div> | ||
| 5 | |||
| 6 | <ul> | ||
| 7 | <li v-for="(n,index) in list" :key="index"> | ||
| 8 | <div class="dot"></div> | ||
| 9 | <h3>{{ n.title }}</h3> | ||
| 10 | <span>{{ n.time }}</span> | ||
| 11 | </li> | ||
| 12 | </ul> | ||
| 13 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="list?.length == 0"/> | ||
| 14 | |||
| 15 | </el-card> | ||
| 16 | </div> | ||
| 17 | </template> | ||
| 18 | |||
| 19 | <script setup> | ||
| 20 | import cache from "@/plugins/cache"; | ||
| 21 | import {onMounted} from "@vue/runtime-core"; | ||
| 22 | const language = ref(cache.local.get('language') || 0) | ||
| 23 | const list = ref([]) | ||
| 24 | onMounted(()=>{ | ||
| 25 | getList() | ||
| 26 | }) | ||
| 27 | const getList =()=>{ | ||
| 28 | list.value = [] | ||
| 29 | } | ||
| 30 | </script> | ||
| 31 | |||
| 32 | <style scoped lang="scss"> | ||
| 33 | .indexTitle { | ||
| 34 | margin: 20px 0 12px; | ||
| 35 | padding: 0 20px 15px; | ||
| 36 | border-bottom: 1px solid #e5e5e5; | ||
| 37 | |||
| 38 | h3 { | ||
| 39 | font-size: 16px; | ||
| 40 | color: var(--el-color-primary); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | ul{padding: 20px; | ||
| 44 | li{background: #FBFCFD;position: relative;padding: 20px 20px 20px 40px;margin-bottom: 18px; | ||
| 45 | cursor: pointer; | ||
| 46 | &:hover{ | ||
| 47 | h3{color: var(--el-color-primary)} | ||
| 48 | } | ||
| 49 | .dot{position: absolute;width: 7px; | ||
| 50 | height: 7px;left: 20px;top: 24px; | ||
| 51 | background: #C5161E; | ||
| 52 | border-radius: 50%;} | ||
| 53 | h3{font-weight: 400;margin: 0; | ||
| 54 | font-size: 16px; | ||
| 55 | color: #29343C;} | ||
| 56 | span{font-weight: 400;display: inline-block; | ||
| 57 | font-size: 12px;margin: 10px 0 0; | ||
| 58 | color: #929AA0;} | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | </style> |
| ... | @@ -2,37 +2,37 @@ | ... | @@ -2,37 +2,37 @@ |
| 2 | <div class="pd20"> | 2 | <div class="pd20"> |
| 3 | <div class="d-form-border" style="margin-top: 0"> | 3 | <div class="d-form-border" style="margin-top: 0"> |
| 4 | <el-form class="d-form" size="large" :model="form" ref="registerRef" :rules="registerRules" label-width="120" | 4 | <el-form class="d-form" size="large" :model="form" ref="registerRef" :rules="registerRules" label-width="120" |
| 5 | style="max-width: 500px;margin: auto"> | 5 | :label-position="language==0?'left':'top'" style="max-width: 500px;margin: auto"> |
| 6 | <el-form-item label="用户名"> | 6 | <el-form-item :label="language==0?'用户名':'Account'"> |
| 7 | {{userName}} | 7 | {{userName}} |
| 8 | </el-form-item> | 8 | </el-form-item> |
| 9 | <el-form-item label="所属国家" required> | 9 | <el-form-item :label="language==0?'所属国家':'Nationality'" required> |
| 10 | <el-select filterable v-model="form.countryId"> | 10 | <el-select filterable v-model="form.countryId"> |
| 11 | <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id" /> | 11 | <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id" /> |
| 12 | </el-select> | 12 | </el-select> |
| 13 | </el-form-item> | 13 | </el-form-item> |
| 14 | <el-form-item label="详细地址" required prop="address"> | 14 | <el-form-item :label="language==0?'详细地址':'Detailed Address'" required prop="address"> |
| 15 | <el-cascader v-if="form.countryId == 240" | 15 | <el-cascader v-if="form.countryId == 240" |
| 16 | v-model="form.regionId" | 16 | v-model="form.regionId" |
| 17 | style="width: 100%;" | 17 | style="width: 100%;" |
| 18 | :options="regionsList" | 18 | :options="regionsList" |
| 19 | :props="{ label:'text' }" | 19 | :props="{ label:'text' }" |
| 20 | /> | 20 | /> |
| 21 | <el-input type="textarea" v-model="form.address" class="mt10" placeholder="请输入详细地址"/> | 21 | <el-input type="textarea" v-model="form.address" class="mt10" :placeholder="language==0?'请输入内容':''"/> |
| 22 | </el-form-item> | 22 | </el-form-item> |
| 23 | <el-form-item label="机构名称" required prop="name"> | 23 | <el-form-item :label="language==0?'机构名称':'Team Name'" required prop="name"> |
| 24 | <el-input type="text" v-model="form.name" placeholder="请输入内容"/> | 24 | <el-input type="text" v-model="form.name" :placeholder="language==0?'请输入内容':''"/> |
| 25 | </el-form-item> | 25 | </el-form-item> |
| 26 | <el-form-item label="联系人姓名" required prop="contactPerson"> | 26 | <el-form-item :label="language==0?'联系人姓名':'Contact Person'" required prop="contactPerson"> |
| 27 | <el-input type="text" v-model="form.contactPerson" placeholder="请输入内容"/> | 27 | <el-input type="text" v-model="form.contactPerson" :placeholder="language==0?'请输入内容':''"/> |
| 28 | </el-form-item> | 28 | </el-form-item> |
| 29 | <el-form-item label="联系人电话" required prop="contactTelno"> | 29 | <el-form-item :label="language==0?'联系人电话':'Contact Phone'" required prop="contactTelno"> |
| 30 | <el-input v-model="form.contactTelno" type="phone" placeholder="请输入内容"/> | 30 | <el-input v-model="form.contactTelno" type="phone" :placeholder="language==0?'请输入内容':''"/> |
| 31 | </el-form-item> | 31 | </el-form-item> |
| 32 | <el-form-item label="联系人邮箱" required prop="contactEmail"> | 32 | <el-form-item :label="language==0?'联系人邮箱':'Contact Email'" required prop="contactEmail"> |
| 33 | <el-input v-model="form.contactEmail" type="email" placeholder="请输入内容"/> | 33 | <el-input v-model="form.contactEmail" type="email" :placeholder="language==0?'请输入内容':''"/> |
| 34 | </el-form-item> | 34 | </el-form-item> |
| 35 | <el-form-item prop="imgUrl" required label="机构LOGO"> | 35 | <el-form-item prop="imgUrl" required :label="language==0?'机构Logo':'Group Logo'"> |
| 36 | <ImageUpload2 | 36 | <ImageUpload2 |
| 37 | v-model="form.imgUrl" :crop-height="200" :crop-width="200" :limit="1" | 37 | v-model="form.imgUrl" :crop-height="200" :crop-width="200" :limit="1" |
| 38 | :is-show-tip="false" | 38 | :is-show-tip="false" |
| ... | @@ -41,7 +41,7 @@ | ... | @@ -41,7 +41,7 @@ |
| 41 | </el-form> | 41 | </el-form> |
| 42 | </div> | 42 | </div> |
| 43 | <div class="text-center"> | 43 | <div class="text-center"> |
| 44 | <el-button type="primary" class="btn-lineG" round @click="save">确定修改</el-button> | 44 | <el-button type="primary" class="btn-lineG" round @click="save">{{ language==0?'确定修改':'Save' }}</el-button> |
| 45 | </div> | 45 | </div> |
| 46 | 46 | ||
| 47 | </div> | 47 | </div> |
| ... | @@ -62,6 +62,10 @@ const props = defineProps({ | ... | @@ -62,6 +62,10 @@ const props = defineProps({ |
| 62 | form:{ | 62 | form:{ |
| 63 | type:Object, | 63 | type:Object, |
| 64 | required:true | 64 | required:true |
| 65 | }, | ||
| 66 | language:{ | ||
| 67 | type:Number, | ||
| 68 | required:true | ||
| 65 | } | 69 | } |
| 66 | }) | 70 | }) |
| 67 | const countryList = ref([]) | 71 | const countryList = ref([]) | ... | ... |
| ... | @@ -3,12 +3,7 @@ | ... | @@ -3,12 +3,7 @@ |
| 3 | 3 | ||
| 4 | <div class="box ph-30"> | 4 | <div class="box ph-30"> |
| 5 | <el-card> | 5 | <el-card> |
| 6 | <el-steps :active="activeStep" align-center> | 6 | <team-sign-step :activeStep="activeStep" :language="language"/> |
| 7 | <el-step :title="language==0?'团队信息':'Team Information'" /> | ||
| 8 | <el-step :title="language==0?'教练/领队/其他':'Coach/Team Leader/Other'" /> | ||
| 9 | <el-step :title="language==0?'选手报名':'Participant Registration'" /> | ||
| 10 | <el-step :title="language==0?'提交审核':'Submit for review'" /> | ||
| 11 | </el-steps> | ||
| 12 | </el-card> | 7 | </el-card> |
| 13 | 8 | ||
| 14 | <el-row class="mt20" :gutter="20"> | 9 | <el-row class="mt20" :gutter="20"> |
| ... | @@ -17,7 +12,9 @@ | ... | @@ -17,7 +12,9 @@ |
| 17 | <template #header> | 12 | <template #header> |
| 18 | <div class="card-header"> | 13 | <div class="card-header"> |
| 19 | <img src="@/assets/sign/tag01.png"/> | 14 | <img src="@/assets/sign/tag01.png"/> |
| 20 | 教练<span class="tip">(教练/领队,至少选择一项)</span> | 15 | {{ language==0?'教练':'Coach' }} |
| 16 | <span class="tip" v-if="language==0">(教练/领队,至少选择一项)</span> | ||
| 17 | <span class="tip" v-else>(Coach/Team Leader, select at least one)</span> | ||
| 21 | </div> | 18 | </div> |
| 22 | </template> | 19 | </template> |
| 23 | <div class="chooseForm"> | 20 | <div class="chooseForm"> |
| ... | @@ -40,7 +37,9 @@ | ... | @@ -40,7 +37,9 @@ |
| 40 | <template #header> | 37 | <template #header> |
| 41 | <div class="card-header"> | 38 | <div class="card-header"> |
| 42 | <img src="@/assets/sign/tag02.png"/> | 39 | <img src="@/assets/sign/tag02.png"/> |
| 43 | 领队<span class="tip">(教练/领队,至少选择一项)</span> | 40 | {{ language==0?'领队':'Team leader' }} |
| 41 | <span class="tip" v-if="language==0">(教练/领队,至少选择一项)</span> | ||
| 42 | <span class="tip" v-else>(Coach/Team Leader, select at least one)</span> | ||
| 44 | </div> | 43 | </div> |
| 45 | </template> | 44 | </template> |
| 46 | <div class="chooseForm"> | 45 | <div class="chooseForm"> |
| ... | @@ -63,7 +62,7 @@ | ... | @@ -63,7 +62,7 @@ |
| 63 | <template #header> | 62 | <template #header> |
| 64 | <div class="card-header"> | 63 | <div class="card-header"> |
| 65 | <img src="@/assets/sign/tag03.png"/> | 64 | <img src="@/assets/sign/tag03.png"/> |
| 66 | 队医 | 65 | {{ language==0?'队医':'Team doctor' }} |
| 67 | </div> | 66 | </div> |
| 68 | </template> | 67 | </template> |
| 69 | <div class="chooseForm"> | 68 | <div class="chooseForm"> |
| ... | @@ -86,7 +85,7 @@ | ... | @@ -86,7 +85,7 @@ |
| 86 | <template #header> | 85 | <template #header> |
| 87 | <div class="card-header"> | 86 | <div class="card-header"> |
| 88 | <img src="@/assets/sign/tag04.png"/> | 87 | <img src="@/assets/sign/tag04.png"/> |
| 89 | 翻译 | 88 | {{ language==0?'翻译':'Translator' }} |
| 90 | </div> | 89 | </div> |
| 91 | </template> | 90 | </template> |
| 92 | <div class="chooseForm"> | 91 | <div class="chooseForm"> |
| ... | @@ -109,7 +108,7 @@ | ... | @@ -109,7 +108,7 @@ |
| 109 | <template #header> | 108 | <template #header> |
| 110 | <div class="card-header"> | 109 | <div class="card-header"> |
| 111 | <img src="@/assets/sign/tag05.png"/> | 110 | <img src="@/assets/sign/tag05.png"/> |
| 112 | 官员 | 111 | {{ language==0?'官员':'Official' }} |
| 113 | </div> | 112 | </div> |
| 114 | </template> | 113 | </template> |
| 115 | <div class="chooseForm"> | 114 | <div class="chooseForm"> |
| ... | @@ -132,7 +131,7 @@ | ... | @@ -132,7 +131,7 @@ |
| 132 | <template #header> | 131 | <template #header> |
| 133 | <div class="card-header"> | 132 | <div class="card-header"> |
| 134 | <img src="@/assets/sign/tag06.png"/> | 133 | <img src="@/assets/sign/tag06.png"/> |
| 135 | 其他 | 134 | {{ language==0?'其他':'Other' }} |
| 136 | </div> | 135 | </div> |
| 137 | </template> | 136 | </template> |
| 138 | <div class="chooseForm"> | 137 | <div class="chooseForm"> |
| ... | @@ -153,8 +152,8 @@ | ... | @@ -153,8 +152,8 @@ |
| 153 | </el-row> | 152 | </el-row> |
| 154 | <el-card class="mt20"> | 153 | <el-card class="mt20"> |
| 155 | <div class="text-center"> | 154 | <div class="text-center"> |
| 156 | <el-button type="primary" class="w200px" plain round @click="goPrev()">上一步</el-button> | 155 | <el-button type="primary" class="w200px" plain round @click="goPrev()">{{ language==0?'上一步':'Go back' }}</el-button> |
| 157 | <el-button type="primary" class="btn-lineG w200px" round @click="goNext()">下一步</el-button> | 156 | <el-button type="primary" class="btn-lineG w200px" round @click="goNext()">{{language==0?'下一步':'Next'}}</el-button> |
| 158 | </div> | 157 | </div> |
| 159 | </el-card> | 158 | </el-card> |
| 160 | 159 | ||
| ... | @@ -171,7 +170,8 @@ import {ref, reactive} from 'vue' | ... | @@ -171,7 +170,8 @@ import {ref, reactive} from 'vue' |
| 171 | import {getCurrentInstance, onMounted} from '@vue/runtime-core' | 170 | import {getCurrentInstance, onMounted} from '@vue/runtime-core' |
| 172 | import * as match from '@/apiPc/match' | 171 | import * as match from '@/apiPc/match' |
| 173 | import dialogAddCoach from './components/addCoach' | 172 | import dialogAddCoach from './components/addCoach' |
| 174 | import cache from '@/utils/cache' | 173 | import TeamSignStep from './components/teamSignStep' |
| 174 | import cache from "@/plugins/cache" | ||
| 175 | const {proxy} = getCurrentInstance() | 175 | const {proxy} = getCurrentInstance() |
| 176 | const router = useRouter() | 176 | const router = useRouter() |
| 177 | const route = useRoute() | 177 | const route = useRoute() |
| ... | @@ -326,7 +326,7 @@ function goNext() { | ... | @@ -326,7 +326,7 @@ function goNext() { |
| 326 | } | 326 | } |
| 327 | }) | 327 | }) |
| 328 | }) | 328 | }) |
| 329 | } else if (signType.value == '1') { | 329 | } else { |
| 330 | // 团队报名 | 330 | // 团队报名 |
| 331 | match.groupSignSavePerson(obj).then(res => { | 331 | match.groupSignSavePerson(obj).then(res => { |
| 332 | router.push({ | 332 | router.push({ | ... | ... |
| ... | @@ -2,12 +2,7 @@ | ... | @@ -2,12 +2,7 @@ |
| 2 | <div> | 2 | <div> |
| 3 | <div class="box ph-30"> | 3 | <div class="box ph-30"> |
| 4 | <el-card class="mb20"> | 4 | <el-card class="mb20"> |
| 5 | <el-steps :active="activeStep" align-center> | 5 | <team-sign-step :activeStep="activeStep" :language="language"/> |
| 6 | <el-step title="团队信息"/> | ||
| 7 | <el-step title="教练/领队/其他"/> | ||
| 8 | <el-step title="选手报名"/> | ||
| 9 | <el-step title="提交审核"/> | ||
| 10 | </el-steps> | ||
| 11 | </el-card> | 6 | </el-card> |
| 12 | 7 | ||
| 13 | <el-card :body-style="{'padding-top': '0'}"> | 8 | <el-card :body-style="{'padding-top': '0'}"> |
| ... | @@ -15,8 +10,9 @@ | ... | @@ -15,8 +10,9 @@ |
| 15 | <el-col :lg="8"> | 10 | <el-col :lg="8"> |
| 16 | <div class="panel border"> | 11 | <div class="panel border"> |
| 17 | <div class="panel-header "> | 12 | <div class="panel-header "> |
| 18 | <h3 class="panel-title">选择参赛运动员清单</h3> | 13 | <h3 class="panel-title" v-if="language==0">选择参赛运动员清单</h3> |
| 19 | <a class="fr" @click="emptyChoosed">清空</a> | 14 | <h3 class="panel-title" v-else>Select list of participating athletes</h3> |
| 15 | <a class="fr" @click="emptyChoosed">{{ language == 0 ? '清空' : 'Empty' }}</a> | ||
| 20 | </div> | 16 | </div> |
| 21 | <div class="panel-body"> | 17 | <div class="panel-body"> |
| 22 | <div class="chooseForm"> | 18 | <div class="chooseForm"> |
| ... | @@ -27,10 +23,10 @@ | ... | @@ -27,10 +23,10 @@ |
| 27 | <el-avatar fit="cover" v-else-if="c.sex == 0" :size="60" src="@/assets/img/head1.png"/> | 23 | <el-avatar fit="cover" v-else-if="c.sex == 0" :size="60" src="@/assets/img/head1.png"/> |
| 28 | <el-avatar fit="cover" v-else-if="c.sex == 1" :size="60" src="@/assets/img/head0.png"/> | 24 | <el-avatar fit="cover" v-else-if="c.sex == 1" :size="60" src="@/assets/img/head0.png"/> |
| 29 | 25 | ||
| 30 | <p class="name">{{ c.shortName }} | 26 | <p class="name">{{ c.shortName }}({{ c.sexStr }}) |
| 31 | <el-icon @click.stop="editPerson(c.id)"> | 27 | <!-- <el-icon @click.stop="editPerson(c.id)">--> |
| 32 | <Edit/> | 28 | <!-- <Edit/>--> |
| 33 | </el-icon> | 29 | <!-- </el-icon>--> |
| 34 | <!-- <el-icon @click.stop="delthischoosed(c)">--> | 30 | <!-- <el-icon @click.stop="delthischoosed(c)">--> |
| 35 | <!-- <Delete/>--> | 31 | <!-- <Delete/>--> |
| 36 | <!-- </el-icon>--> | 32 | <!-- </el-icon>--> |
| ... | @@ -44,20 +40,21 @@ | ... | @@ -44,20 +40,21 @@ |
| 44 | <el-col :lg="8"> | 40 | <el-col :lg="8"> |
| 45 | <div class="panel border"> | 41 | <div class="panel border"> |
| 46 | <div class="panel-header "> | 42 | <div class="panel-header "> |
| 47 | <h3 class="panel-title">选择一个参赛组合</h3> | 43 | <h3 class="panel-title" v-if="language==0">选择一个参赛组合</h3> |
| 44 | <h3 class="panel-title" v-else>Select a Participating team</h3> | ||
| 48 | </div> | 45 | </div> |
| 49 | <div class="panel-body"> | 46 | <div class="panel-body"> |
| 50 | <div class="chooseForm"> | 47 | <div class="chooseForm"> |
| 51 | <el-checkbox-group v-model="choosedchoosed" @change="changechoosed"> | 48 | <el-checkbox-group v-model="choosedchoosed" @change="changechoosed"> |
| 52 | <!-- v-show="choosedchoosed.indexOf(c.id) !== -1"--> | 49 | <!-- v-show="choosedchoosed.indexOf(c.id) !== -1"--> |
| 53 | <el-checkbox v-for="c in choosed2List" :label="c.id" checked> | 50 | <el-checkbox v-for="c in choosed2List" :label="c.id" checked> |
| 54 | <el-avatar fit="cover" v-if="c.picUrl" :size="60" :src="fillImgUrl(c.picUrl)"/> | 51 | <el-avatar fit="cover" v-if="c.picUrl" :size="60" :src="fillImgUrl(c.picUrl)"/> |
| 55 | <el-avatar fit="cover" v-else-if="c.sex == 0" :size="60" src="@/assets/img/head1.png"/> | 52 | <el-avatar fit="cover" v-else-if="c.sex == 0" :size="60" src="@/assets/img/head1.png"/> |
| 56 | <el-avatar fit="cover" v-else-if="c.sex == 1" :size="60" src="@/assets/img/head0.png"/> | 53 | <el-avatar fit="cover" v-else-if="c.sex == 1" :size="60" src="@/assets/img/head0.png"/> |
| 57 | <p class="name">{{ c.shortName }} | 54 | <p class="name">{{ c.shortName }}({{ c.sexStr }}) |
| 58 | <el-icon @click.stop="editPerson(c.id)"> | 55 | <!-- <el-icon @click.stop="editPerson(c.id)">--> |
| 59 | <Edit/> | 56 | <!-- <Edit/>--> |
| 60 | </el-icon> | 57 | <!-- </el-icon>--> |
| 61 | </p> | 58 | </p> |
| 62 | </el-checkbox> | 59 | </el-checkbox> |
| 63 | </el-checkbox-group> | 60 | </el-checkbox-group> |
| ... | @@ -68,13 +65,27 @@ | ... | @@ -68,13 +65,27 @@ |
| 68 | <el-col :lg="8"> | 65 | <el-col :lg="8"> |
| 69 | <div class="panel border"> | 66 | <div class="panel border"> |
| 70 | <div class="panel-header "> | 67 | <div class="panel-header "> |
| 71 | <h3 class="panel-title">可参与报名的项目</h3> | 68 | <h3 class="panel-title" v-if="language==0">可参与报名的项目</h3> |
| 69 | <h3 class="panel-title" v-else>Eligible Events for Registration</h3> | ||
| 72 | <div class="fr"> | 70 | <div class="fr"> |
| 73 | <el-input size="small" v-model="projectQuery.name" :prefix-icon="Search" @change="getProjectList" clearable/> | 71 | <el-input size="small" v-model="projectQuery.name" :prefix-icon="Search" @change="getProjectList" |
| 72 | clearable/> | ||
| 74 | </div> | 73 | </div> |
| 75 | </div> | 74 | </div> |
| 76 | <div class="panel-body" v-loading="loadingProject"> | 75 | <div class="panel-body" v-loading="loadingProject"> |
| 77 | <el-empty v-if="projectList.length==0" image="@/assets/img/order_no.png" image-size="228" description="无可选项目" /> | 76 | <el-checkbox-group v-model="projectIds"> |
| 77 | <el-checkbox class="w100" v-for="c in projectList" :label="c.id" :key="c.id"> | ||
| 78 | <div class="flexBetween w100"> | ||
| 79 | <div class="l"> | ||
| 80 | {{ c.code }}:{{ c.name }} | ||
| 81 | <div>{{ c.danceTypeDetailStr }}</div> | ||
| 82 | </div> | ||
| 83 | <div class="text-primary">¥{{ c.serviceFee }}</div> | ||
| 84 | </div> | ||
| 85 | </el-checkbox> | ||
| 86 | </el-checkbox-group> | ||
| 87 | <el-empty v-if="projectList.length==0" image="@/assets/img/order_no.png" image-size="228" | ||
| 88 | :description="language==0?'无可选项目':''"/> | ||
| 78 | </div> | 89 | </div> |
| 79 | </div> | 90 | </div> |
| 80 | </el-col> | 91 | </el-col> |
| ... | @@ -82,78 +93,77 @@ | ... | @@ -82,78 +93,77 @@ |
| 82 | <el-row class="mt20"> | 93 | <el-row class="mt20"> |
| 83 | <el-col :span="24"> | 94 | <el-col :span="24"> |
| 84 | <div class="text-center"> | 95 | <div class="text-center"> |
| 85 | <el-button type="primary" class="btn-lineG w200px" round>确定</el-button> | 96 | <el-button type="primary" class="btn-lineG w200px" round @click="signUp"> |
| 97 | {{ language == 0 ? '确定' : 'Confirm' }} | ||
| 98 | </el-button> | ||
| 86 | </div> | 99 | </div> |
| 87 | </el-col> | 100 | </el-col> |
| 88 | </el-row> | 101 | </el-row> |
| 89 | </el-card> | 102 | </el-card> |
| 90 | 103 | ||
| 91 | <el-card class="mt20" :body-style="{'padding-top': '0'}"> | 104 | <el-card class="mt20" :body-style="{'padding': '0'}"> |
| 92 | <div class="border-info mt20"> | 105 | <coach-info-row :names="names" :language="language"/> |
| 93 | <el-row> | 106 | <div class="m20"> |
| 94 | <el-col :lg="8"> | ||
| 95 | <div class="item"><label>教练</label> | ||
| 96 | <span v-for="c in names.coachList">{{ c.shortName }}</span> | ||
| 97 | </div> | ||
| 98 | <div class="item"><label>翻译</label> | ||
| 99 | <span v-for="c in names.translatorList">{{ c.shortName }}</span> | ||
| 100 | </div> | ||
| 101 | </el-col> | ||
| 102 | <el-col :lg="8"> | ||
| 103 | <div class="item"><label>领队</label> | ||
| 104 | <span v-for="c in names.leaderList">{{ c.shortName }}</span> | ||
| 105 | </div> | ||
| 106 | <div class="item"><label>官员</label> | ||
| 107 | <span class="mr5" v-for="c in names.officialList">{{ c.shortName }}</span> | ||
| 108 | <span v-if="!names.officialList">--</span> | ||
| 109 | </div> | ||
| 110 | </el-col> | ||
| 111 | <el-col :lg="8"> | ||
| 112 | <div class="item"><label>队医</label><span class="mr5" v-for="c in names.teamDoctorList">{{ | ||
| 113 | c.shortName | ||
| 114 | }}</span></div> | ||
| 115 | <div class="item"><label>其他</label><span class="mr5" v-for="c in names.otherList">{{ | ||
| 116 | c.shortName | ||
| 117 | }}</span></div> | ||
| 118 | </el-col> | ||
| 119 | </el-row> | ||
| 120 | </div> | ||
| 121 | |||
| 122 | <div> | ||
| 123 | 107 | ||
| 124 | <!-- <el-button type="success" @click="importSportman">批量导入人员</el-button>--> | 108 | <!-- <el-button type="success" @click="importSportman">批量导入人员</el-button>--> |
| 125 | <!-- <el-button type="success" @click="addCoach">新增运动员</el-button>--> | 109 | <!-- <el-button type="success" @click="addCoach">新增运动员</el-button>--> |
| 126 | 110 | <div class="ttbb"> | |
| 127 | <div class="fr mb20" @click="switchTabletype"> | 111 | <div :class="tableType==1 ? 'active' : ''" @click="switchTabletype">{{ language == 0 ? '按组别查看报项' : 'View Entries by Group' }}</div> |
| 128 | <el-button plain type="primary" :icon="Switch" v-if="tableType==1">按人员查看报项</el-button> | 112 | <div :class="tableType==0 ? 'active' : ''" @click="switchTabletype">{{ language == 0 ? '按人员查看报项' : 'View Entries by Participant' }}</div> |
| 129 | <el-button plain type="primary" :icon="Switch" v-else>按组别查看报项</el-button> | ||
| 130 | </div> | 113 | </div> |
| 114 | <!-- <div class="fr mb20" @click="switchTabletype">--> | ||
| 115 | <!-- <el-button plain type="primary" :icon="Switch" v-if="tableType==1">--> | ||
| 116 | <!-- {{ language == 0 ? '按人员查看报项' : 'View Entries by Participant' }}--> | ||
| 117 | <!-- </el-button>--> | ||
| 118 | <!-- <el-button plain type="primary" :icon="Switch" v-else>--> | ||
| 119 | <!-- {{ language == 0 ? '按组别查看报项' : 'View Entries by Group' }}--> | ||
| 120 | <!-- </el-button>--> | ||
| 121 | <!-- </div>--> | ||
| 131 | <el-table :data="signInfoTable" border style="width: 100%" v-if="tableType==0"> | 122 | <el-table :data="signInfoTable" border style="width: 100%" v-if="tableType==0"> |
| 132 | <el-table-column label="运动员" width="240px"> | 123 | <el-table-column :label="language==0?'所属国家':'Nationality'" prop="personInfo.countryName" min-width="100"/> |
| 124 | <el-table-column :label="language==0?'姓氏':'Last Name'" prop="personInfo.xing" min-width="100"/> | ||
| 125 | <el-table-column :label="language==0?'名':'First Name'" prop="personInfo.ming" min-width="100"/> | ||
| 126 | <el-table-column :label="language==0?'短名':'Short Name'" prop="personInfo.shortName" min-width="110"/> | ||
| 127 | <el-table-column :label="language==0?'性别':'Gender'" prop="personInfo.sexStr"/> | ||
| 128 | <el-table-column :label="language==0?'年龄':'Age'" prop="personInfo.age"/> | ||
| 129 | <el-table-column :label="language==0?'出生日期':'Birth'" prop="personInfo.birth" width="110"/> | ||
| 130 | <el-table-column :label="language==0?'手机号码':'Phone Number'" prop="personInfo.phone" width="120"/> | ||
| 131 | <el-table-column :label="language==0?'邮箱':'E-mail'" prop="personInfo.email" width="150"/> | ||
| 132 | <el-table-column :label="language==0?'证件类型':'ID Type'" prop="personInfo.idcTypeStr"/> | ||
| 133 | <el-table-column :label="language==0?'证件号码':'ID NO.'" prop="personInfo.idcCode" width="200"/> | ||
| 134 | <el-table-column :label="language==0?'会员角色':'Role'" width="150"> | ||
| 133 | <template #default="scope"> | 135 | <template #default="scope"> |
| 134 | <div style="display: flex;align-items: center;"> | 136 | <div class="esp"> |
| 135 | <!-- <el-image v-if="scope.row.personInfo.picUrl" style="width: 50px; height: 50px" fit="contain" :src="scope.row.personInfo.picUrl" />--> | 137 | <span v-for="item in scope.row.personInfo.label?.split(',')" :key="item.id" class="text-primary"> |
| 136 | <p>{{ scope.row.personInfo.shortName }}({{ scope.row.personInfo.sexStr }})</p> | 138 | <span v-if="item==='0'" class="ml5">{{ language==0?'运动员':'athletes' }}</span> |
| 139 | <span v-if="item==='1'" class="ml5">{{ language==0?'教练':'coach' }}</span> | ||
| 140 | <span v-if="item==='2'" class="ml5">{{ language==0?'领队':'team leader' }}</span> | ||
| 141 | <span v-if="item==='3'" class="ml5">{{ language==0?'队医':'team doctor' }}</span> | ||
| 142 | <span v-if="item==='4'" class="ml5">{{ language==0?'翻译':'translator' }}</span> | ||
| 143 | <span v-if="item==='5'" class="ml5">{{ language==0?'官员':'official' }}</span> | ||
| 144 | <span v-if="item==='6'" class="ml5">{{ language==0?'其他':'other' }}</span> | ||
| 145 | </span> | ||
| 137 | </div> | 146 | </div> |
| 138 | </template> | 147 | </template> |
| 139 | </el-table-column> | 148 | </el-table-column> |
| 140 | <el-table-column label="报项"> | 149 | <el-table-column :label="language==0?'详细地址':'Detailed Address'" prop="personInfo.address" min-width="140"/> |
| 150 | |||
| 151 | <el-table-column :label="language==0?'报项':'Entries'" width="300"> | ||
| 141 | <template #default="props"> | 152 | <template #default="props"> |
| 142 | <ol> | 153 | <ol> |
| 143 | <li v-for="s in props.row.signInfo"> | 154 | <li v-for="s in props.row.signInfo"> |
| 144 | {{ s.cptProjectName }} | 155 | {{ s.cptProjectName }} |
| 145 | {{ s.cptGroupName }}{{ s.cptLevelName }} | 156 | {{ s.cptGroupName }}{{ s.cptLevelName }} |
| 146 | <span v-show="s.cptSonLevelName">[{{ s.cptSonLevelName }}]</span> | 157 | <span v-show="s.cptSonLevelName">[{{ s.cptSonLevelName }}]</span> |
| 147 | {{ s.zu }} | 158 | <span v-show="s.zu">-{{ s.zu }}</span> |
| 148 | <el-button type="text" @click="editThis(s)">编辑</el-button> | 159 | <!-- <el-button type="text" @click="editThis(s)">{{ language == 0 ? '修改' : 'Edit' }}</el-button>--> |
| 149 | <!-- <el-button type="text" @click="editMates(s)">更换队友</el-button>--> | 160 | <!-- <el-button type="text" @click="editMates(s)">更换队友</el-button>--> |
| 150 | <el-button type="text" @click="removeThis(s.id)">删除</el-button> | 161 | <!-- <el-button type="text" @click="removeThis(s.id)">{{ language == 0 ? '删除' : 'Delete' }}</el-button>--> |
| 151 | |||
| 152 | </li> | 162 | </li> |
| 153 | </ol> | 163 | </ol> |
| 154 | </template> | 164 | </template> |
| 155 | </el-table-column> | 165 | </el-table-column> |
| 156 | 166 | <el-table-column :label="language==0?'保险费':'Premium'" prop="insuranceFee"/> | |
| 157 | <!-- 补充信息--> | 167 | <!-- 补充信息--> |
| 158 | <!-- <el-table-column v-for="(e,index) in extraTableHead" :key="index" :label="e">--> | 168 | <!-- <el-table-column v-for="(e,index) in extraTableHead" :key="index" :label="e">--> |
| 159 | <!-- <template #default="scope">--> | 169 | <!-- <template #default="scope">--> |
| ... | @@ -164,40 +174,54 @@ | ... | @@ -164,40 +174,54 @@ |
| 164 | <!-- <span v-else>{{ scope.row.signInfo[0].extraPersonInfoMapList[index]?.value }}</span>--> | 174 | <!-- <span v-else>{{ scope.row.signInfo[0].extraPersonInfoMapList[index]?.value }}</span>--> |
| 165 | <!-- </template>--> | 175 | <!-- </template>--> |
| 166 | <!-- </el-table-column>--> | 176 | <!-- </el-table-column>--> |
| 167 | <el-table-column label="操作" fixed="right" width="150" align="center"> | 177 | <el-table-column :label="language==0?'操作':'Actions'" fixed="right" width="150" align="center"> |
| 168 | <template #default="scope"> | 178 | <template #default="scope"> |
| 169 | <el-button v-if="extraform&&extraform.length>0" type="text" @click="goPersonInfo(scope.row)"> | 179 | <el-button v-if="extraform&&extraform.length>0" type="text" @click="goPersonInfo(scope.row)"> |
| 170 | <span v-if="scope.row.extraPersonInfo">修改</span> | 180 | <span v-if="scope.row.extraPersonInfo">{{ language == 0 ? '修改' : 'Edit' }}</span> |
| 171 | <span v-else class="red">完善补充信息</span> | 181 | <span v-else class="red">完善补充信息</span> |
| 172 | </el-button> | 182 | </el-button> |
| 173 | </template> | 183 | </template> |
| 174 | </el-table-column> | 184 | </el-table-column> |
| 175 | </el-table> | 185 | </el-table> |
| 176 | 186 | ||
| 177 | <el-table v-if="tableType==1" :data="signInfoTable" border style="width: 100%"> | 187 | <el-table v-if="tableType==1" :data="zuTable" border style="width: 100%"> |
| 178 | <el-table-column label="组别代码" width="120px"> | 188 | <el-table-column :label="language==0?'组别代码':'Group code'" width="120px" prop="zuName"/> |
| 189 | <el-table-column :label="language==0?'组别':'Group'" prop="project.name"/> | ||
| 190 | <el-table-column :label="language==0?'舞种':'Dance Style'" width="120px" prop="project.danceType"/> | ||
| 191 | <el-table-column :label="language==0?'参赛说明':'Participation Instructions'" prop="project.remarks"/> | ||
| 192 | <el-table-column :label="language==0?'参赛运动员':'Participating athletes'" width="120px"> | ||
| 179 | <template #default="scope"> | 193 | <template #default="scope"> |
| 180 | NO.1 | 194 | <div> |
| 195 | <span v-for="s in scope.row.athletes">{{ s.name }},</span> | ||
| 196 | </div> | ||
| 181 | </template> | 197 | </template> |
| 182 | </el-table-column> | 198 | </el-table-column> |
| 183 | <el-table-column label="组别" /> | 199 | <el-table-column :label="language==0?'报名费':'Registration Fee'" width="120px" prop=""> |
| 184 | <el-table-column label="舞种" width="120px"/> | ||
| 185 | <el-table-column label="参赛说明" /> | ||
| 186 | <el-table-column label="参赛运动员" width="120px"/> | ||
| 187 | <el-table-column label="报名费" width="120px"/> | ||
| 188 | <el-table-column label="操作" fixed="right" width="150" align="center"> | ||
| 189 | <template #default="scope"> | 200 | <template #default="scope"> |
| 190 | <el-button v-if="extraform&&extraform.length>0" type="text" @click="goPersonInfo(scope.row)"> | 201 | <div class="text-primary"> |
| 191 | <span v-if="scope.row.extraPersonInfo">修改</span> | 202 | ¥{{scope.row.project.serviceFee}} |
| 192 | <span v-else class="red">完善补充信息</span> | 203 | </div> |
| 193 | </el-button> | 204 | </template> |
| 194 | <el-button type="text" @click="goPersonInfo(scope.row)">删除</el-button> | 205 | </el-table-column> |
| 206 | <el-table-column :label="language==0?'操作':'Actions'" fixed="right" width="150" align="center"> | ||
| 207 | <template #default="scope"> | ||
| 208 | <!-- <el-button v-if="extraform&&extraform.length>0" type="text" @click="goPersonInfo(scope.row)">--> | ||
| 209 | <!-- <span v-if="scope.row.extraPersonInfo">{{ language == 0 ? '修改' : 'Edit' }}</span>--> | ||
| 210 | <!-- <span v-else class="red">--> | ||
| 211 | <!-- {{language == 0 ? '完善补充信息' : 'Complete Supplementary Information'}}</span>--> | ||
| 212 | <!-- </el-button>--> | ||
| 213 | <el-button type="text" @click="removeThis(scope.row.id)">{{ language == 0 ? '删除' : 'Delete' }}</el-button> | ||
| 214 | |||
| 195 | </template> | 215 | </template> |
| 196 | </el-table-column> | 216 | </el-table-column> |
| 197 | </el-table> | 217 | </el-table> |
| 198 | <div class="text-center mt20"> | 218 | <div class="text-center mt20"> |
| 199 | <el-button type="primary" class="w200px" plain round @click="goPrev()">上一步</el-button> | 219 | <el-button type="primary" class="w200px" plain round @click="goPrev()"> |
| 200 | <el-button type="primary" class="btn-lineG w200px" round @click="submitForm()">预览报名信息</el-button> | 220 | {{ language == 0 ? "上一步" : 'Go back' }} |
| 221 | </el-button> | ||
| 222 | <el-button type="primary" class="btn-lineG w200px" round @click="submitForm()"> | ||
| 223 | {{ language == 0 ? '预览报名信息' : 'Preview registration information' }} | ||
| 224 | </el-button> | ||
| 201 | </div> | 225 | </div> |
| 202 | </div> | 226 | </div> |
| 203 | </el-card> | 227 | </el-card> |
| ... | @@ -212,23 +236,23 @@ | ... | @@ -212,23 +236,23 @@ |
| 212 | <dialogImport ref="dialogImportProps" @submitForm="getMySignInfo"/> | 236 | <dialogImport ref="dialogImportProps" @submitForm="getMySignInfo"/> |
| 213 | 237 | ||
| 214 | <el-dialog v-model="showResult" :close-on-click-modal="false" :show-close="false"> | 238 | <el-dialog v-model="showResult" :close-on-click-modal="false" :show-close="false"> |
| 215 | <el-result icon="success" title="报名成功"> | 239 | <el-result icon="success" :title="language==0?'报名成功':'Sign up successful'"> |
| 216 | <template #extra> | 240 | <template #extra> |
| 217 | <el-button type="primary" @click="downloadVoucher">下载凭证</el-button> | 241 | <el-button type="primary" @click="downloadVoucher">下载凭证</el-button> |
| 218 | <el-button type="primary" @click="goMySign">查看报项</el-button> | 242 | <el-button type="primary" @click="goMySign">{{ language == 0 ? '查看报项' : 'View Entries' }}</el-button> |
| 219 | </template> | 243 | </template> |
| 220 | </el-result> | 244 | </el-result> |
| 221 | 245 | ||
| 222 | </el-dialog> | 246 | </el-dialog> |
| 223 | 247 | ||
| 224 | <!-- <dialogChangeCoach ref="popChangeCoach" @submitForm="getMySignInfo"/>--> | 248 | <!-- <dialogChangeCoach ref="popChangeCoach" @submitForm="getMySignInfo"/>--> |
| 225 | 249 | ||
| 226 | <dialogExtraForm ref="popExtraForm" @submitForm="getSignInfoList"/> | 250 | <dialogExtraForm ref="popExtraForm" @submitForm="getSignInfoList"/> |
| 227 | </div> | 251 | </div> |
| 228 | </template> | 252 | </template> |
| 229 | 253 | ||
| 230 | <script setup> | 254 | <script setup> |
| 231 | import {ref, reactive} from 'vue' | 255 | import {ref, reactive, toRefs} from 'vue' |
| 232 | import * as match from '@/apiPc/match' | 256 | import * as match from '@/apiPc/match' |
| 233 | import {getCurrentInstance, onMounted} from '@vue/runtime-core' | 257 | import {getCurrentInstance, onMounted} from '@vue/runtime-core' |
| 234 | import dialogAddCoach from './components/addCoach' | 258 | import dialogAddCoach from './components/addCoach' |
| ... | @@ -238,16 +262,26 @@ import dialogImport from './components/import' | ... | @@ -238,16 +262,26 @@ import dialogImport from './components/import' |
| 238 | import dialogChangeCoach from './components/changeCoach' | 262 | import dialogChangeCoach from './components/changeCoach' |
| 239 | import dialogExtraForm from './components/extraForm' | 263 | import dialogExtraForm from './components/extraForm' |
| 240 | import dialogMates from './components/dialogMates' | 264 | import dialogMates from './components/dialogMates' |
| 241 | import {Search,Switch} from "@element-plus/icons-vue"; | 265 | import {Search, Switch} from "@element-plus/icons-vue"; |
| 266 | |||
| 242 | const {proxy} = getCurrentInstance() | 267 | const {proxy} = getCurrentInstance() |
| 243 | const router = useRouter() | 268 | const router = useRouter() |
| 244 | const route = useRoute() | 269 | const route = useRoute() |
| 245 | import _ from 'lodash' | 270 | import _ from 'lodash' |
| 246 | import {ElMessage, ElMessageBox} from 'element-plus' | 271 | import {ElMessage, ElMessageBox} from 'element-plus' |
| 272 | import cache from "@/plugins/cache" | ||
| 273 | import TeamSignStep from "@/viewsPc/match/components/teamSignStep"; | ||
| 274 | import {getProjectPageByPerIds} from "@/apiPc/match"; | ||
| 275 | import CoachInfoRow from "@/viewsPc/match/components/coachInfo-row"; | ||
| 276 | |||
| 277 | const language = ref(cache.local.get('language') || 0) | ||
| 247 | 278 | ||
| 248 | const data = reactive({ | 279 | const data = reactive({ |
| 249 | coachForm: {}, activeStep: 2, | 280 | coachForm: {}, activeStep: 2, |
| 250 | tableData: [], signInfoTable: [], choosedList: [], | 281 | tableData: [], |
| 282 | signInfoTable: [], | ||
| 283 | zuTable: [], | ||
| 284 | choosedList: [], | ||
| 251 | extraPersonInfoMapList: [], | 285 | extraPersonInfoMapList: [], |
| 252 | teamList: [], | 286 | teamList: [], |
| 253 | extraform: [], | 287 | extraform: [], |
| ... | @@ -262,13 +296,14 @@ const data = reactive({ | ... | @@ -262,13 +296,14 @@ const data = reactive({ |
| 262 | activeTeam: '', | 296 | activeTeam: '', |
| 263 | names: {}, | 297 | names: {}, |
| 264 | choosedchoosed: [], | 298 | choosedchoosed: [], |
| 299 | projectIds: [], | ||
| 265 | projectList: [], | 300 | projectList: [], |
| 266 | choosed2List:[],projectQuery:{},tableType:0 | 301 | choosed2List: [], projectQuery: {}, tableType: 1 |
| 267 | }) | 302 | }) |
| 268 | const { | 303 | const { |
| 269 | activeTeam, names, tableData, signInfoTable, choosedList, showExtraForm, extraPersonInfoMapList, teamList, | 304 | activeTeam, names, tableData, signInfoTable, zuTable, choosedList, showExtraForm, extraPersonInfoMapList, teamList, |
| 270 | extraform, groupId, signType, coachOrLeaderFlag, showResult, noPhotoCanSign, extraTableHead, | 305 | extraform, groupId, signType, coachOrLeaderFlag, showResult, noPhotoCanSign, extraTableHead, |
| 271 | coachForm, choosedchoosed, activeStep,projectList,choosed2List,loadingProject,projectQuery,tableType | 306 | coachForm, projectIds, choosedchoosed, activeStep, projectList, choosed2List, loadingProject, projectQuery, tableType |
| 272 | } = toRefs(data) | 307 | } = toRefs(data) |
| 273 | let matchId = '' | 308 | let matchId = '' |
| 274 | let signInfoType = null | 309 | let signInfoType = null |
| ... | @@ -276,12 +311,8 @@ onMounted(() => { | ... | @@ -276,12 +311,8 @@ onMounted(() => { |
| 276 | groupId.value = route.query.groupId | 311 | groupId.value = route.query.groupId |
| 277 | signType.value = route.query.signType | 312 | signType.value = route.query.signType |
| 278 | matchId = route.query.matchId | 313 | matchId = route.query.matchId |
| 279 | if (signType.value == '2') { | ||
| 280 | // 团队-队伍报名-获取队伍 | ||
| 281 | getTeamList(matchId, groupId.value) | ||
| 282 | } else { | ||
| 283 | getSignInfoList() | 314 | getSignInfoList() |
| 284 | } | 315 | |
| 285 | if (signType.value == '0') { | 316 | if (signType.value == '0') { |
| 286 | geren() | 317 | geren() |
| 287 | } else { | 318 | } else { |
| ... | @@ -329,13 +360,13 @@ function getMySignInfo() { | ... | @@ -329,13 +360,13 @@ function getMySignInfo() { |
| 329 | } | 360 | } |
| 330 | 361 | ||
| 331 | function getSignInfoList() { | 362 | function getSignInfoList() { |
| 332 | // console.log(activeTeam.value) | ||
| 333 | match.getMySignInfoList({ | 363 | match.getMySignInfoList({ |
| 334 | cptId: matchId, | 364 | cptId: matchId, |
| 335 | groupId: groupId.value, | 365 | groupId: groupId.value, |
| 336 | teamId: activeTeam.value || '' | 366 | teamId: activeTeam.value || '' |
| 337 | }).then(res => { | 367 | }).then(res => { |
| 338 | signInfoTable.value = res.data | 368 | signInfoTable.value = res.data.singleData |
| 369 | zuTable.value = res.data.zuData | ||
| 339 | // if(signInfoTable.value.length>0){ | 370 | // if(signInfoTable.value.length>0){ |
| 340 | // let choosedIds = [] | 371 | // let choosedIds = [] |
| 341 | // for(let p of choosedList.value){ | 372 | // for(let p of choosedList.value){ |
| ... | @@ -358,28 +389,7 @@ function getTableHead() { | ... | @@ -358,28 +389,7 @@ function getTableHead() { |
| 358 | }) | 389 | }) |
| 359 | } | 390 | } |
| 360 | 391 | ||
| 361 | function getTeamList(a, b) { | ||
| 362 | match.getMyTeamList(a, b).then(res => { | ||
| 363 | teamList.value = res.data | ||
| 364 | activeTeam.value = teamList.value[0].id | ||
| 365 | getSignInfoList() | ||
| 366 | }) | ||
| 367 | } | ||
| 368 | |||
| 369 | function teamClick(tab, event) { | ||
| 370 | activeTeam.value = tab.props.name | ||
| 371 | getSignInfoList() | ||
| 372 | } | ||
| 373 | |||
| 374 | function submitForm() { | 392 | function submitForm() { |
| 375 | router.push({ | ||
| 376 | name: 'signPreview', | ||
| 377 | query: { | ||
| 378 | matchId: matchId, | ||
| 379 | groupId: groupId.value, | ||
| 380 | teamId: activeTeam.value | ||
| 381 | } | ||
| 382 | }) | ||
| 383 | if (signInfoType == '1') { | 393 | if (signInfoType == '1') { |
| 384 | ElMessageBox.confirm('已报项,前往我的报项', '提示', { | 394 | ElMessageBox.confirm('已报项,前往我的报项', '提示', { |
| 385 | confirmButtonText: '确定', | 395 | confirmButtonText: '确定', |
| ... | @@ -400,6 +410,7 @@ function submitForm() { | ... | @@ -400,6 +410,7 @@ function submitForm() { |
| 400 | for (const s of signInfoTable.value) { | 410 | for (const s of signInfoTable.value) { |
| 401 | if (s.extraPersonInfo == null && needBuchong) { | 411 | if (s.extraPersonInfo == null && needBuchong) { |
| 402 | ElMessage.error('请完善运动员补充信息') | 412 | ElMessage.error('请完善运动员补充信息') |
| 413 | tableType.value = 0 | ||
| 403 | return | 414 | return |
| 404 | } | 415 | } |
| 405 | } | 416 | } |
| ... | @@ -423,11 +434,22 @@ function submitForm() { | ... | @@ -423,11 +434,22 @@ function submitForm() { |
| 423 | } else { | 434 | } else { |
| 424 | afterRecover() | 435 | afterRecover() |
| 425 | } | 436 | } |
| 437 | router.push({ | ||
| 438 | name: 'signPreview', | ||
| 439 | query: { | ||
| 440 | matchId: matchId, | ||
| 441 | groupId: groupId.value | ||
| 442 | } | ||
| 443 | }) | ||
| 426 | } | 444 | } |
| 427 | 445 | ||
| 428 | function afterRecover() { | 446 | function afterRecover() { |
| 429 | if (signInfoTable.value.length == 0) { | 447 | if (signInfoTable.value.length == 0) { |
| 448 | if (language.value == 0) { | ||
| 430 | ElMessage.error('请至少选择一个项目') | 449 | ElMessage.error('请至少选择一个项目') |
| 450 | } else { | ||
| 451 | ElMessage.error('select at least one project') | ||
| 452 | } | ||
| 431 | return | 453 | return |
| 432 | } | 454 | } |
| 433 | // 判断是否收费 | 455 | // 判断是否收费 |
| ... | @@ -478,7 +500,7 @@ function chooseSportman() { | ... | @@ -478,7 +500,7 @@ function chooseSportman() { |
| 478 | } | 500 | } |
| 479 | 501 | ||
| 480 | const params = { | 502 | const params = { |
| 481 | title: '选择运动员', | 503 | title: language.value == 0 ? '选择运动员' : 'Participating athletes', |
| 482 | matchId: matchId, | 504 | matchId: matchId, |
| 483 | groupId: groupId.value, | 505 | groupId: groupId.value, |
| 484 | rankId: activeTeam.value, | 506 | rankId: activeTeam.value, |
| ... | @@ -493,7 +515,7 @@ function chooseSportman() { | ... | @@ -493,7 +515,7 @@ function chooseSportman() { |
| 493 | function changechoosed(e) { | 515 | function changechoosed(e) { |
| 494 | console.log(e) | 516 | console.log(e) |
| 495 | choosed2List.value = [] | 517 | choosed2List.value = [] |
| 496 | for(var c of choosedList.value){ | 518 | for (var c of choosedList.value) { |
| 497 | if (choosedchoosed.value.indexOf(c.id) > -1) { | 519 | if (choosedchoosed.value.indexOf(c.id) > -1) { |
| 498 | choosed2List.value.push(c) | 520 | choosed2List.value.push(c) |
| 499 | } | 521 | } |
| ... | @@ -501,22 +523,33 @@ function changechoosed(e) { | ... | @@ -501,22 +523,33 @@ function changechoosed(e) { |
| 501 | getProjectList() | 523 | getProjectList() |
| 502 | 524 | ||
| 503 | } | 525 | } |
| 526 | |||
| 504 | function getProjectList() { | 527 | function getProjectList() { |
| 505 | if(choosed2List.value.length==0){ | 528 | projectIds.value = [] |
| 506 | ElMessage.error('请先选择运动员') | 529 | if (choosed2List.value.length == 0) { |
| 530 | // ElMessage.error('请先选择运动员') | ||
| 531 | projectList.value = [] | ||
| 507 | return | 532 | return |
| 508 | } | 533 | } |
| 509 | loadingProject.value = true | 534 | loadingProject.value = true |
| 510 | //根据已选人员id 获取项目列表 | 535 | //根据已选人员id 获取项目列表 |
| 511 | match.getCanSignProjectList(matchId).then(res=>{ | 536 | var obj = { |
| 512 | projectList.value = res.data | 537 | cptId: matchId, |
| 538 | perIds: choosedchoosed.value.toString() | ||
| 539 | } | ||
| 540 | match.getProjectPageByPerIds(obj).then(res => { | ||
| 541 | projectList.value = res.rows | ||
| 542 | loadingProject.value = false | ||
| 543 | }).catch(err => { | ||
| 513 | loadingProject.value = false | 544 | loadingProject.value = false |
| 545 | ElMessage.error(err.msg) | ||
| 514 | }) | 546 | }) |
| 515 | } | 547 | } |
| 548 | |||
| 516 | function getChoosed(list) { | 549 | function getChoosed(list) { |
| 517 | console.log(list) | 550 | console.log(list) |
| 518 | choosedList.value = list | 551 | choosedList.value = list |
| 519 | console.log('选好了',choosedchoosed.value) | 552 | console.log('选好了', choosedchoosed.value) |
| 520 | } | 553 | } |
| 521 | 554 | ||
| 522 | function addCoach() { | 555 | function addCoach() { |
| ... | @@ -601,6 +634,21 @@ function editMates(row) { | ... | @@ -601,6 +634,21 @@ function editMates(row) { |
| 601 | proxy.$refs['dialogMatesRef'].open(params) | 634 | proxy.$refs['dialogMatesRef'].open(params) |
| 602 | } | 635 | } |
| 603 | 636 | ||
| 637 | function signUp() { | ||
| 638 | if (projectIds.value.length == 0) { | ||
| 639 | return | ||
| 640 | } | ||
| 641 | const obj = { | ||
| 642 | athleteIds: choosedchoosed.value.toString(), | ||
| 643 | projectIds: projectIds.value.toString(), | ||
| 644 | groupId: groupId.value | ||
| 645 | } | ||
| 646 | match.sportsmanDone(obj).then(res => { | ||
| 647 | |||
| 648 | getSignInfoList() | ||
| 649 | }) | ||
| 650 | } | ||
| 651 | |||
| 604 | function removeThis(id) { | 652 | function removeThis(id) { |
| 605 | ElMessageBox.confirm('确定移除这条报项吗?', '提示', { | 653 | ElMessageBox.confirm('确定移除这条报项吗?', '提示', { |
| 606 | confirmButtonText: '确定', | 654 | confirmButtonText: '确定', |
| ... | @@ -675,16 +723,30 @@ function editPerson(id) { | ... | @@ -675,16 +723,30 @@ function editPerson(id) { |
| 675 | groupId: groupId.value | 723 | groupId: groupId.value |
| 676 | }) | 724 | }) |
| 677 | } | 725 | } |
| 726 | |||
| 678 | function switchTabletype() { | 727 | function switchTabletype() { |
| 679 | if(tableType.value == 0){ | 728 | if (tableType.value == 0) { |
| 680 | tableType.value = 1 | 729 | tableType.value = 1 |
| 681 | }else{ | 730 | } else { |
| 682 | tableType.value = 0 | 731 | tableType.value = 0 |
| 683 | } | 732 | } |
| 684 | } | 733 | } |
| 685 | </script> | 734 | </script> |
| 686 | 735 | ||
| 687 | <style scoped lang="scss"> | 736 | <style scoped lang="scss"> |
| 737 | :deep(.el-checkbox__label) { | ||
| 738 | flex: 1 1 auto; | ||
| 739 | } | ||
| 740 | |||
| 741 | .flexBetween { | ||
| 742 | .l { | ||
| 743 | div { | ||
| 744 | margin: 4px 0 0; | ||
| 745 | color: #999; | ||
| 746 | } | ||
| 747 | } | ||
| 748 | } | ||
| 749 | |||
| 688 | .app-container { | 750 | .app-container { |
| 689 | padding: 0; | 751 | padding: 0; |
| 690 | background: #F5F7F9; | 752 | background: #F5F7F9; |
| ... | @@ -733,7 +795,7 @@ function switchTabletype() { | ... | @@ -733,7 +795,7 @@ function switchTabletype() { |
| 733 | } | 795 | } |
| 734 | 796 | ||
| 735 | .el-checkbox { | 797 | .el-checkbox { |
| 736 | height: auto; | 798 | height: auto;margin-right: 20px; |
| 737 | } | 799 | } |
| 738 | 800 | ||
| 739 | :deep(.el-checkbox__input) { | 801 | :deep(.el-checkbox__input) { |
| ... | @@ -750,5 +812,35 @@ function switchTabletype() { | ... | @@ -750,5 +812,35 @@ function switchTabletype() { |
| 750 | :deep(.el-avatar) > img { | 812 | :deep(.el-avatar) > img { |
| 751 | width: 100%; | 813 | width: 100%; |
| 752 | } | 814 | } |
| 753 | .panel{height: 100%;} | 815 | |
| 816 | .panel { | ||
| 817 | height: 100%; | ||
| 818 | } | ||
| 819 | |||
| 820 | .border-info { | ||
| 821 | .item { | ||
| 822 | margin: 5px 0; | ||
| 823 | color: #4C5359; | ||
| 824 | font-size: 14px; | ||
| 825 | |||
| 826 | label { | ||
| 827 | font-size: 14px; | ||
| 828 | margin-right: 14px | ||
| 829 | } | ||
| 830 | } | ||
| 831 | } | ||
| 832 | .ttbb{font-size: 14px; | ||
| 833 | color: #4C5359; | ||
| 834 | display: flex;justify-content: center; | ||
| 835 | div{padding: 20px;position: relative;cursor: pointer;} | ||
| 836 | div:first-child::after {content: '';position: absolute;right: 0; | ||
| 837 | background: #ccc;width: 1px;height: 14px;top:0;bottom: 0;margin: auto;} | ||
| 838 | |||
| 839 | .active{color: var(--el-color-primary); | ||
| 840 | &::before{width: 33px;content: '';position: absolute; | ||
| 841 | height: 2px;bottom: 14px;left: 0;right: 0;margin: auto; | ||
| 842 | background: #453DEA; | ||
| 843 | border-radius: 1px;} | ||
| 844 | } | ||
| 845 | } | ||
| 754 | </style> | 846 | </style> | ... | ... |
| ... | @@ -13,21 +13,20 @@ | ... | @@ -13,21 +13,20 @@ |
| 13 | :is-show-tip="false" | 13 | :is-show-tip="false" |
| 14 | /> | 14 | /> |
| 15 | </el-form-item> | 15 | </el-form-item> |
| 16 | <el-form-item label="姓氏" prop="xing" required> | 16 | <el-form-item :label="language==0?'姓氏':'surname'" prop="xing" required> |
| 17 | <el-input v-model="form.xing"/> | 17 | <el-input v-model="form.xing"/> |
| 18 | </el-form-item> | 18 | </el-form-item> |
| 19 | <el-form-item label="短名" prop="shortName" required> | 19 | <el-form-item :label="language==0?'短名':'short name'" prop="shortName" required> |
| 20 | <el-input v-model="form.shortName" placeholder="赛事用名"/> | 20 | <el-input v-model="form.shortName" placeholder="赛事用名"/> |
| 21 | </el-form-item> | 21 | </el-form-item> |
| 22 | <el-form-item label="出生日期" prop="birth" required> | 22 | <el-form-item :label="language==0?'出生日期':'birth'" prop="birth" required> |
| 23 | <el-date-picker | 23 | <el-date-picker |
| 24 | v-model="form.birth" | 24 | v-model="form.birth" |
| 25 | style="width: 100%;" | 25 | style="width: 100%;" |
| 26 | type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" | 26 | type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" |
| 27 | placeholder="请选择出生日期" | ||
| 28 | /> | 27 | /> |
| 29 | </el-form-item> | 28 | </el-form-item> |
| 30 | <el-form-item label="证件类型" prop="idcType" required> | 29 | <el-form-item :label="language==0?'证件类型':'ID type'" prop="idcType" required> |
| 31 | <el-select v-model="form.idcType" style="width: 100%;"> | 30 | <el-select v-model="form.idcType" style="width: 100%;"> |
| 32 | <el-option | 31 | <el-option |
| 33 | v-for="item in certificates" | 32 | v-for="item in certificates" |
| ... | @@ -37,17 +36,17 @@ | ... | @@ -37,17 +36,17 @@ |
| 37 | /> | 36 | /> |
| 38 | </el-select> | 37 | </el-select> |
| 39 | </el-form-item> | 38 | </el-form-item> |
| 40 | <el-form-item label="手机号码" prop="phone" required> | 39 | <el-form-item :label="language==0?'手机号码':'Phone'" prop="phone" required> |
| 41 | <el-input v-model="form.phone" type="number"/> | 40 | <el-input v-model="form.phone" type="number"/> |
| 42 | </el-form-item> | 41 | </el-form-item> |
| 43 | </el-col> | 42 | </el-col> |
| 44 | <el-col :lg="12"> | 43 | <el-col :lg="12"> |
| 45 | <el-form-item label="所属国家" prop="countryId" required> | 44 | <el-form-item :label="language==0?'所属国家':'Nationality'" prop="countryId" required> |
| 46 | <el-select v-model="form.countryId" style="width: 100%;" @change="changeCountryId"> | 45 | <el-select v-model="form.countryId" style="width: 100%;" @change="changeCountryId"> |
| 47 | <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id"/> | 46 | <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id"/> |
| 48 | </el-select> | 47 | </el-select> |
| 49 | </el-form-item> | 48 | </el-form-item> |
| 50 | <el-form-item label="详细地址" prop="address" required> | 49 | <el-form-item :label="language==0?'详细地址':'Address'" prop="address" required> |
| 51 | <el-cascader v-if="form.countryId == 240" | 50 | <el-cascader v-if="form.countryId == 240" |
| 52 | v-model="form.regionId" | 51 | v-model="form.regionId" |
| 53 | style="width: 100%;margin-bottom: 15px" | 52 | style="width: 100%;margin-bottom: 15px" |
| ... | @@ -57,24 +56,24 @@ | ... | @@ -57,24 +56,24 @@ |
| 57 | <el-input v-model="form.address" type="textarea" :rows="4"/> | 56 | <el-input v-model="form.address" type="textarea" :rows="4"/> |
| 58 | 57 | ||
| 59 | </el-form-item> | 58 | </el-form-item> |
| 60 | <el-form-item label="名" prop="ming" required> | 59 | <el-form-item :label="language==0?'名':'name'" prop="ming" required> |
| 61 | <el-input v-model="form.ming"/> | 60 | <el-input v-model="form.ming"/> |
| 62 | </el-form-item> | 61 | </el-form-item> |
| 63 | <el-form-item label="性别" prop="sex"> | 62 | <el-form-item :label="language==0?'性别':'sex'" prop="sex"> |
| 64 | <el-radio-group v-model="form.sex"> | 63 | <el-radio-group v-model="form.sex"> |
| 65 | <el-radio label="0">女</el-radio> | 64 | <el-radio label="0">{{ language==0?'女':'female' }}</el-radio> |
| 66 | <el-radio label="1">男</el-radio> | 65 | <el-radio label="1">{{ language==0?'男':'male' }}</el-radio> |
| 67 | </el-radio-group> | 66 | </el-radio-group> |
| 68 | </el-form-item> | 67 | </el-form-item> |
| 69 | <el-form-item label="邮箱" prop="idcCode" required> | 68 | <el-form-item :label="language==0?'邮箱':'Email'" prop="idcCode" required> |
| 70 | <el-input v-model="form.email"/> | 69 | <el-input v-model="form.email"/> |
| 71 | </el-form-item> | 70 | </el-form-item> |
| 72 | <el-form-item label="证件号码" prop="idcCode" required> | 71 | <el-form-item :label="language==0?'证件号码':'ID NO'" prop="idcCode" required> |
| 73 | <el-input v-model="form.idcCode" @blur="checkCode"/> | 72 | <el-input v-model="form.idcCode" @blur="checkCode"/> |
| 74 | </el-form-item> | 73 | </el-form-item> |
| 75 | <el-form-item label="主要会员角色" prop="labelArr"> | 74 | <el-form-item :label="language==0?'主要会员角色':'roles'" prop="labelArr"> |
| 76 | <el-select v-model="form.labelArr" multiple @change="labelvalue"> | 75 | <el-select v-model="form.labelArr" multiple @change="labelvalue"> |
| 77 | <el-option v-for="l in labels" :key="l.value" :value="l.value" :label="l.label"/> | 76 | <el-option v-for="l in labels" :key="l.value" :value="l.value" :label="language==0?l.label:l.enlabel"/> |
| 78 | </el-select> | 77 | </el-select> |
| 79 | </el-form-item> | 78 | </el-form-item> |
| 80 | </el-col> | 79 | </el-col> |
| ... | @@ -82,7 +81,7 @@ | ... | @@ -82,7 +81,7 @@ |
| 82 | </el-form> | 81 | </el-form> |
| 83 | <template #footer> | 82 | <template #footer> |
| 84 | <div class="dialog-footer text-center"> | 83 | <div class="dialog-footer text-center"> |
| 85 | <el-button type="primary" class="btn-lineG w200px" round @click="submitForm">确定</el-button> | 84 | <el-button type="primary" class="btn-lineG w200px" round @click="submitForm">{{ language==0?'确定':'Save' }}</el-button> |
| 86 | </div> | 85 | </div> |
| 87 | </template> | 86 | </template> |
| 88 | </el-dialog> | 87 | </el-dialog> |
| ... | @@ -96,6 +95,8 @@ import {certificates} from '@/assets/lib/nation' | ... | @@ -96,6 +95,8 @@ import {certificates} from '@/assets/lib/nation' |
| 96 | import {ElMessage} from 'element-plus' | 95 | import {ElMessage} from 'element-plus' |
| 97 | import {nationList} from '@/assets/js/data' | 96 | import {nationList} from '@/assets/js/data' |
| 98 | import _ from 'lodash' | 97 | import _ from 'lodash' |
| 98 | import cache from "@/plugins/cache"; | ||
| 99 | const language = ref(cache.local.get('language') || 0) | ||
| 99 | 100 | ||
| 100 | const {proxy} = getCurrentInstance() | 101 | const {proxy} = getCurrentInstance() |
| 101 | const emit = defineEmits(['submitForm']) | 102 | const emit = defineEmits(['submitForm']) |
| ... | @@ -122,13 +123,14 @@ const data = reactive({ | ... | @@ -122,13 +123,14 @@ const data = reactive({ |
| 122 | show: false, | 123 | show: false, |
| 123 | countryList: [], | 124 | countryList: [], |
| 124 | regionsList: [], | 125 | regionsList: [], |
| 125 | labels: [{value: '0', label: '运动员'}, | 126 | labels: [ |
| 126 | {value: '1', label: '教练'}, | 127 | {value: '0', label: '运动员', enlabel: 'Sportsman'}, |
| 127 | {value: '2', label: '领队'}, | 128 | {value: '1', label: '教练', enlabel: 'Coach'}, |
| 128 | {value: '3', label: '队医'}, | 129 | {value: '2', label: '领队', enlabel: 'Leader'}, |
| 129 | {value: '4', label: '翻译'}, | 130 | {value: '3', label: '队医', enlabel: 'Nurse'}, |
| 130 | {value: '5', label: '官员'}, | 131 | {value: '4', label: '翻译', enlabel: 'Translator'}, |
| 131 | {value: '6', label: '其他'} | 132 | {value: '5', label: '官员', enlabel: 'Official'}, |
| 133 | {value: '6', label: '其他', enlabel: 'Other'} | ||
| 132 | ], | 134 | ], |
| 133 | title: '添加选手信息', | 135 | title: '添加选手信息', |
| 134 | groupId: '0', | 136 | groupId: '0', | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <el-dialog v-model="show" :title="title" width="1000px" append-to-body> | 2 | <el-dialog v-model="show" :title="title" width="1000px" append-to-body> |
| 3 | <div class="funcBtns"> | 3 | <div class="funcBtns"> |
| 4 | <el-button type="primary" @click="addMember">添加选手</el-button> | 4 | <el-button type="primary" @click="addMember"> |
| 5 | <el-button type="primary" plain @click="importSportman">导入选手</el-button> | 5 | {{ language == 0 ? '添加选手' : 'Add Player' }} |
| 6 | </el-button> | ||
| 7 | <el-button type="primary" plain @click="importSportman"> | ||
| 8 | {{language == 0 ? '导入选手' : 'Import Player'}} | ||
| 9 | </el-button> | ||
| 6 | </div> | 10 | </div> |
| 7 | <div class="from-Card"> | 11 | <div class="from-Card"> |
| 8 | <el-form :inline="true" :model="query" class="mt20" label-width="60" size="small"> | 12 | <el-form :inline="true" :model="query" class="mt20" label-width="60" size="small"> |
| 9 | <el-form-item label="姓名"> | 13 | <el-form-item :label="language==0?'姓名':'Name'"> |
| 10 | <el-input v-model="query.realName" style="width: 120px;" clearable/> | 14 | <el-input v-model="query.realName" style="width: 120px;" clearable/> |
| 11 | </el-form-item> | 15 | </el-form-item> |
| 12 | <el-form-item label="短名"> | 16 | <el-form-item :label="language==0?'短名':'Short Name'"> |
| 13 | <el-input v-model="query.shortName" style="width: 120px;" clearable/> | 17 | <el-input v-model="query.shortName" style="width: 120px;" clearable/> |
| 14 | </el-form-item> | 18 | </el-form-item> |
| 15 | <el-form-item label="手机号码"> | 19 | <el-form-item :label="language==0?'手机号码':'Phone Number'"> |
| 16 | <el-input v-model="query.phone" style="width: 120px;" clearable/> | 20 | <el-input v-model="query.phone" style="width: 120px;" clearable/> |
| 17 | </el-form-item> | 21 | </el-form-item> |
| 18 | <el-form-item label="邮箱"> | 22 | <el-form-item :label="language==0?'邮箱':'E-mail'"> |
| 19 | <el-input v-model="query.email" style="width: 120px;" clearable/> | 23 | <el-input v-model="query.email" style="width: 120px;" clearable/> |
| 20 | </el-form-item> | 24 | </el-form-item> |
| 21 | <el-form-item label="证件类型"> | 25 | <el-form-item :label="language==0?'证件类型':'ID Type'"> |
| 22 | <el-input v-model="query.idcType" style="width: 120px;" clearable/> | 26 | <el-input v-model="query.idcType" style="width: 120px;" clearable/> |
| 23 | </el-form-item> | 27 | </el-form-item> |
| 24 | <el-form-item label="证件号"> | 28 | <el-form-item :label="language==0?'证件号码':'ID NO.'"> |
| 25 | <el-input v-model="query.idcode" style="width: 120px;" clearable/> | 29 | <el-input v-model="query.idcode" style="width: 120px;" clearable/> |
| 26 | </el-form-item> | 30 | </el-form-item> |
| 27 | <el-form-item label="角色"> | 31 | <!-- <el-form-item label="角色">--> |
| 28 | <el-input v-model="query.label" style="width: 120px;" clearable/> | 32 | <!-- <el-input v-model="query.label" style="width: 120px;" clearable/>--> |
| 29 | </el-form-item> | 33 | <!-- </el-form-item>--> |
| 30 | <el-form-item> | 34 | <el-form-item> |
| 31 | <el-button type="primary" @click="getList">查询</el-button> | 35 | <el-button type="primary" @click="getList">{{language==0?'查询':'Search'}}</el-button> |
| 32 | </el-form-item> | 36 | </el-form-item> |
| 33 | </el-form> | 37 | </el-form> |
| 34 | </div> | 38 | </div> |
| 35 | <p v-if="noPhotoCanSign == 0" class="text-danger">*需上传照片才可报名</p> | 39 | <p v-if="noPhotoCanSign == 0" class="text-danger">*需上传照片才可报名</p> |
| 36 | <el-table ref="allSportmenTable" v-loading="loading" :data="tableData" height="60vh" | 40 | <el-table ref="allSportmenTable" v-loading="loading" :data="tableData" height="60vh" |
| 37 | @selection-change="handleSelectionChange"> | 41 | @selection-change="handleSelectionChange"> |
| 38 | <el-table-column type="selection" label="选择" :selectable="selectable"/> | 42 | <el-table-column type="selection" :label="language==0?'选择':'Selection'" :selectable="selectable"/> |
| 39 | <el-table-column label="所属国家" prop="countryName"/> | 43 | <el-table-column :label="language==0?'所属国家':'Nationality'" prop="countryName" min-width="100"/> |
| 40 | <el-table-column label="姓氏" prop="xing"/> | 44 | <el-table-column :label="language==0?'姓氏':'Last Name'" prop="xing" min-width="100"/> |
| 41 | <el-table-column label="名" prop="ming"/> | 45 | <el-table-column :label="language==0?'名':'First Name'" prop="ming" min-width="100"/> |
| 42 | <el-table-column label="短名" prop="shortName"/> | 46 | <el-table-column :label="language==0?'短名':'Short Name'" prop="shortName" min-width="110"/> |
| 43 | <el-table-column label="性别" prop="sexStr"/> | 47 | <el-table-column :label="language==0?'性别':'Gender'" prop="sexStr"/> |
| 44 | <el-table-column label="年龄" prop="age"/> | 48 | <el-table-column :label="language==0?'年龄':'Age'" prop="age"/> |
| 45 | <el-table-column label="出生日期" prop="birth" width="100"/> | 49 | <el-table-column :label="language==0?'出生日期':'Birth'" prop="birth" width="110"/> |
| 46 | <el-table-column label="手机号码" prop="phone" width="120"/> | 50 | <el-table-column :label="language==0?'手机号码':'Phone Number'" prop="phone" width="120"/> |
| 47 | <el-table-column label="邮箱" prop="email" width="150"/> | 51 | <el-table-column :label="language==0?'邮箱':'E-mail'" prop="email" width="150"/> |
| 48 | <el-table-column label="证件类型" prop="idcTypeStr"/> | 52 | <el-table-column :label="language==0?'证件类型':'ID Type'" prop="idcTypeStr"/> |
| 49 | <el-table-column label="证件号码" prop="idcCode" width="200"/> | 53 | <el-table-column :label="language==0?'证件号码':'ID NO.'" prop="idcCode" width="200"/> |
| 50 | <el-table-column label="会员角色" width="200"> | 54 | <!-- <el-table-column label="会员角色" width="200">--> |
| 51 | <template #default="scope"> | 55 | <!-- <template #default="scope">--> |
| 52 | <div> | 56 | <!-- <div>--> |
| 53 | <div style="white-space: nowrap" class="esp"> | 57 | <!-- <div style="white-space: nowrap" class="esp">--> |
| 54 | <span v-for="item in scope.row.label?.split(',')" :key="item.id"> | 58 | <!-- <span v-for="item in scope.row.label?.split(',')" :key="item.id">--> |
| 55 | <el-tag type="warning" size="small" v-if="item==='0'" effect="plain" class="ml10">运动员</el-tag> | 59 | <!-- <span v-if="item==='0'" class="ml5">{{ language==0?'运动员':'athletes' }}</span>--> |
| 56 | <el-tag type="warning" size="small" v-if="item==='1'" effect="plain" class="ml10">教练</el-tag> | 60 | <!-- <span v-if="item==='1'" class="ml5">{{ language==0?'教练':'coach' }}</span>--> |
| 57 | <el-tag type="warning" size="small" v-if="item==='2'" effect="plain" class="ml10">领队</el-tag> | 61 | <!-- <span v-if="item==='2'" class="ml5">{{ language==0?'领队':'team leader' }}</span>--> |
| 58 | <el-tag type="warning" size="small" v-if="item==='3'" effect="plain" class="ml10">队医</el-tag> | 62 | <!-- <span v-if="item==='3'" class="ml5">{{ language==0?'队医':'team doctor' }}</span>--> |
| 59 | <el-tag type="warning" size="small" v-if="item==='4'" effect="plain" class="ml10">翻译</el-tag> | 63 | <!-- <span v-if="item==='4'" class="ml5">{{ language==0?'翻译':'translator' }}</span>--> |
| 60 | <el-tag type="warning" size="small" v-if="item==='5'" effect="plain" class="ml10">官员</el-tag> | 64 | <!-- <span v-if="item==='5'" class="ml5">{{ language==0?'官员':'official' }}</span>--> |
| 61 | <el-tag type="warning" size="small" v-if="item==='6'" effect="plain" class="ml10">其他</el-tag> | 65 | <!-- <span v-if="item==='6'" class="ml5">{{ language==0?'其他':'other' }}</span>--> |
| 62 | </span> | 66 | <!-- </span>--> |
| 63 | </div> | 67 | <!-- </div>--> |
| 64 | </div> | 68 | <!-- </div>--> |
| 65 | </template> | 69 | <!-- </template>--> |
| 66 | </el-table-column> | 70 | <!-- </el-table-column>--> |
| 67 | <el-table-column label="详细地址" prop="address"/> | 71 | <el-table-column :label="language==0?'详细地址':'Detailed Address'" prop="address" min-width="140"/> |
| 68 | 72 | <el-table-column :label="language==0?'操作':'Actions'" width="120" fixed="right" align="center"> | |
| 69 | <el-table-column label="操作" width="120" fixed="right" align="center"> | ||
| 70 | <template #default="scope"> | 73 | <template #default="scope"> |
| 71 | <el-button type="text" @click="editPerson(scope.row)">编辑</el-button> | 74 | <el-button type="text" @click="editPerson(scope.row)"> |
| 75 | {{language==0?'编辑':'Edit'}} | ||
| 76 | </el-button> | ||
| 72 | </template> | 77 | </template> |
| 73 | </el-table-column> | 78 | </el-table-column> |
| 74 | </el-table> | 79 | </el-table> |
| 75 | <template #footer> | 80 | <template #footer> |
| 76 | <div class="dialog-footer text-center"> | 81 | <div class="dialog-footer text-center"> |
| 77 | <el-button type="primary" @click="submitForm">确定</el-button> | 82 | <el-button type="primary" @click="submitForm">{{language==0?'确定':'Confirm'}}</el-button> |
| 78 | <el-button @click="cancel">取 消</el-button> | 83 | <el-button @click="cancel">{{language==0?'取消':'Cancel'}}</el-button> |
| 79 | </div> | 84 | </div> |
| 80 | </template> | 85 | </template> |
| 81 | </el-dialog> | 86 | </el-dialog> |
| ... | @@ -91,6 +96,9 @@ import * as match from '@/apiPc/match' | ... | @@ -91,6 +96,9 @@ import * as match from '@/apiPc/match' |
| 91 | import addCoach from '../components/addCoach' | 96 | import addCoach from '../components/addCoach' |
| 92 | import {getGroupPersonList} from "@/apiPc/match"; | 97 | import {getGroupPersonList} from "@/apiPc/match"; |
| 93 | import Import from '../components/import' | 98 | import Import from '../components/import' |
| 99 | import cache from "@/plugins/cache"; | ||
| 100 | |||
| 101 | const language = ref(cache.local.get('language') || 0) | ||
| 94 | 102 | ||
| 95 | const {proxy} = getCurrentInstance() | 103 | const {proxy} = getCurrentInstance() |
| 96 | const emit = defineEmits(['submitForm', 'transfer']) | 104 | const emit = defineEmits(['submitForm', 'transfer']) |
| ... | @@ -109,6 +117,7 @@ let groupId | ... | @@ -109,6 +117,7 @@ let groupId |
| 109 | let choosedList = [] | 117 | let choosedList = [] |
| 110 | const choosedIds = [] | 118 | const choosedIds = [] |
| 111 | const open = (params) => { | 119 | const open = (params) => { |
| 120 | title.value = params.title | ||
| 112 | matchId = params.matchId | 121 | matchId = params.matchId |
| 113 | groupId = params.groupId | 122 | groupId = params.groupId |
| 114 | noPhotoCanSign.value = params.noPhotoCanSign | 123 | noPhotoCanSign.value = params.noPhotoCanSign | ... | ... |
| 1 | <template> | ||
| 2 | <div class="border-info" style="margin: 20px"> | ||
| 3 | <el-row> | ||
| 4 | <el-col :lg="8"> | ||
| 5 | <div class="item"><label>{{ language == 0 ? '教练' : 'Coach' }}</label> | ||
| 6 | <span v-for="c in names.coachList">{{ c.shortName }}</span> | ||
| 7 | </div> | ||
| 8 | <div class="item"><label>{{ language == 0 ? '翻译' : 'Translator' }}</label> | ||
| 9 | <span v-for="c in names.translatorList">{{ c.shortName }}</span> | ||
| 10 | </div> | ||
| 11 | </el-col> | ||
| 12 | <el-col :lg="8"> | ||
| 13 | <div class="item"> | ||
| 14 | <label>{{ language == 0 ? '领队' : 'Team leader' }}</label> | ||
| 15 | <span v-for="c in names.leaderList">{{ c.shortName }}</span> | ||
| 16 | </div> | ||
| 17 | <div class="item"> | ||
| 18 | <label>{{ language == 0 ? '官员' : 'Official' }}</label> | ||
| 19 | <span class="mr5" v-for="c in names.officialList">{{ c.shortName }}</span> | ||
| 20 | <span v-if="!names.officialList">--</span> | ||
| 21 | </div> | ||
| 22 | </el-col> | ||
| 23 | <el-col :lg="8"> | ||
| 24 | <div class="item"> | ||
| 25 | <label>{{ language == 0 ? '队医' : 'Team doctor' }}</label> | ||
| 26 | <span class="mr5" v-for="c in names.teamDoctorList"> | ||
| 27 | {{ c.shortName }} | ||
| 28 | </span> | ||
| 29 | </div> | ||
| 30 | <div class="item"> | ||
| 31 | <label>{{ language == 0 ? '其他' : 'Other' }}</label> | ||
| 32 | <span class="mr5" v-for="c in names.otherList"> | ||
| 33 | {{ c.shortName }} | ||
| 34 | </span> | ||
| 35 | </div> | ||
| 36 | </el-col> | ||
| 37 | </el-row> | ||
| 38 | </div> | ||
| 39 | </template> | ||
| 40 | |||
| 41 | <script setup> | ||
| 42 | const props = defineProps({ | ||
| 43 | names: { | ||
| 44 | type: Object, | ||
| 45 | required: true | ||
| 46 | }, | ||
| 47 | language: { | ||
| 48 | type: Number, | ||
| 49 | required: true, | ||
| 50 | default: 0 | ||
| 51 | } | ||
| 52 | }) | ||
| 53 | </script> | ||
| 54 | |||
| 55 | <style scoped lang="scss"> | ||
| 56 | .border-info { | ||
| 57 | .item { | ||
| 58 | margin: 5px 0; | ||
| 59 | color: #4C5359; | ||
| 60 | font-size: 14px; | ||
| 61 | |||
| 62 | label { | ||
| 63 | font-size: 14px; | ||
| 64 | margin-right: 14px | ||
| 65 | } | ||
| 66 | } | ||
| 67 | } | ||
| 68 | </style> |
| 1 | <template> | ||
| 2 | <div class="border-info gray" style="margin: 20px"> | ||
| 3 | <el-row> | ||
| 4 | <el-col :lg="8"> | ||
| 5 | <el-row :gutter="15"> | ||
| 6 | <el-col :span="4"> | ||
| 7 | <img class="w100" :src="fillImgUrl(groupInfo.imgUrl)"/> | ||
| 8 | </el-col> | ||
| 9 | <el-col :span="20"> | ||
| 10 | <div class="item"><label>{{ language==0?'团体名称':'Team Name' }}</label>{{ groupInfo.name }}</div> | ||
| 11 | <div class="item"><label>{{ language==0?'团体类型':'Group type' }}</label>{{ groupInfo.typeStr }}</div> | ||
| 12 | </el-col> | ||
| 13 | </el-row> | ||
| 14 | </el-col> | ||
| 15 | <el-col :lg="8"> | ||
| 16 | <div class="item"><label>{{ language==0?'负责人姓名':'Contact Person' }}</label>{{ groupInfo.contactPerson }}</div> | ||
| 17 | <div class="item"><label>{{ language==0?'参赛队名称':'Name of participating team' }}</label>{{ groupInfo.abreviations }}</div> | ||
| 18 | |||
| 19 | </el-col> | ||
| 20 | <el-col :lg="8"> | ||
| 21 | <div class="item"><label>{{ language==0?'邮箱':'Email' }}</label>{{ groupInfo.contactEmail }}</div> | ||
| 22 | <div class="item"><label>{{ language==0?'详细地址':'Detailed Address' }}</label>{{ groupInfo.address }}</div> | ||
| 23 | </el-col> | ||
| 24 | </el-row> | ||
| 25 | </div> | ||
| 26 | </template> | ||
| 27 | |||
| 28 | <script setup> | ||
| 29 | const props = defineProps({ | ||
| 30 | groupInfo: { | ||
| 31 | type: Object, | ||
| 32 | required: true | ||
| 33 | }, | ||
| 34 | language: { | ||
| 35 | type: Number, | ||
| 36 | required: true, | ||
| 37 | default: 0 | ||
| 38 | } | ||
| 39 | }) | ||
| 40 | </script> | ||
| 41 | |||
| 42 | <style scoped lang="scss"> | ||
| 43 | .border-info{ | ||
| 44 | .item{margin: 5px 0;color: #4C5359; font-size: 14px; | ||
| 45 | label{font-size: 14px;margin-right: 14px} | ||
| 46 | } | ||
| 47 | } | ||
| 48 | </style> |
| 1 | <template> | ||
| 2 | <div class="border-info" style="margin: 20px"> | ||
| 3 | <el-row v-if="language==0"> | ||
| 4 | <el-col :lg="8"><div class="item"><label>赛事名称</label>{{matchInfo.name}}</div></el-col> | ||
| 5 | <el-col :lg="8"><div class="item"><label>赛事类型</label>{{matchInfo.name}}</div></el-col> | ||
| 6 | <el-col :lg="8"><div class="item"><label>赛事时间</label>{{matchInfo.beginTime?.slice(0,10)}} 至 {{ matchInfo.endTime?.slice(0,10) }}</div></el-col> | ||
| 7 | <el-col :lg="8"><div class="item"><label>报名时间</label>{{ matchInfo.signBeginTime?.slice(0,10) }} 至{{ matchInfo.signEndTime?.slice(0,10) }}</div></el-col> | ||
| 8 | <el-col :lg="16"><div class="item"><label>比赛地址</label>{{matchInfo.address}}</div></el-col> | ||
| 9 | </el-row> | ||
| 10 | <el-row v-else> | ||
| 11 | <el-col :lg="8"><div class="item"><label>Event Name</label>{{matchInfo.name}}</div></el-col> | ||
| 12 | <el-col :lg="8"><div class="item"><label>Event Type</label>{{matchInfo.name}}</div></el-col> | ||
| 13 | <el-col :lg="8"><div class="item"><label>Event Date</label>{{matchInfo.beginTime?.slice(0,10)}} ~ {{ matchInfo.endTime?.slice(0,10) }}</div></el-col> | ||
| 14 | <el-col :lg="8"><div class="item"><label>Registration Period</label>{{ matchInfo.signBeginTime?.slice(0,10) }} ~{{ matchInfo.signEndTime?.slice(0,10) }}</div></el-col> | ||
| 15 | <el-col :lg="16"><div class="item"><label>Event Address</label>{{matchInfo.address}}</div></el-col> | ||
| 16 | </el-row> | ||
| 17 | </div> | ||
| 18 | </template> | ||
| 19 | |||
| 20 | <script setup> | ||
| 21 | const props = defineProps({ | ||
| 22 | matchInfo: { | ||
| 23 | type: Object, | ||
| 24 | required: true | ||
| 25 | }, | ||
| 26 | language: { | ||
| 27 | type: Number, | ||
| 28 | required: true, | ||
| 29 | default: 0 | ||
| 30 | } | ||
| 31 | }) | ||
| 32 | </script> | ||
| 33 | |||
| 34 | <style scoped lang="scss"> | ||
| 35 | .border-info{ | ||
| 36 | .item{margin: 5px 0;color: #4C5359; font-size: 14px; | ||
| 37 | label{font-size: 14px;margin-right: 14px} | ||
| 38 | } | ||
| 39 | } | ||
| 40 | </style> |
| 1 | <template> | 1 | <template> |
| 2 | <!-- 人员表格--> | 2 | <!-- 人员表格--> |
| 3 | <el-table :data="tableData" class="mt20"> | 3 | <el-table :data="tableData" class="mt20"> |
| 4 | <el-table-column type="index" label="序号" width="80" align="center"/> | 4 | <el-table-column type="index" :label="language==0?'序号':'index'" width="80" align="center"/> |
| 5 | <el-table-column label="所属国家" prop="countryName"/> | 5 | <el-table-column :label="language==0?'所属国家':'Nationality'" prop="countryName" min-width="100"/> |
| 6 | <el-table-column label="姓氏" prop="xing"/> | 6 | <el-table-column :label="language==0?'姓氏':'Last Name'" prop="xing" min-width="100"/> |
| 7 | <el-table-column label="名" prop="ming"/> | 7 | <el-table-column :label="language==0?'名':'First Name'" prop="ming" min-width="100"/> |
| 8 | <el-table-column label="短名" prop="shortName"/> | 8 | <el-table-column :label="language==0?'短名':'Short Name'" prop="shortName" min-width="110"/> |
| 9 | <el-table-column label="性别" prop="sexStr"/> | 9 | <el-table-column :label="language==0?'性别':'Gender'" prop="sexStr"/> |
| 10 | <el-table-column label="年龄" prop="age"/> | 10 | <el-table-column :label="language==0?'年龄':'Age'" prop="age"/> |
| 11 | <el-table-column label="出生日期" prop="birth" width="100"/> | 11 | <el-table-column :label="language==0?'出生日期':'Birth'" prop="birth" width="110"/> |
| 12 | <el-table-column label="手机号码" prop="phone" width="120"/> | 12 | <el-table-column :label="language==0?'手机号码':'Phone Number'" prop="phone" width="120"/> |
| 13 | <el-table-column label="邮箱" prop="email" width="150"/> | 13 | <el-table-column :label="language==0?'邮箱':'E-mail'" prop="email" width="150"/> |
| 14 | <el-table-column label="证件类型" prop="idcTypeStr"/> | 14 | <el-table-column :label="language==0?'证件类型':'ID Type'" prop="idcTypeStr"/> |
| 15 | <el-table-column label="证件号码" prop="idcCode" width="200"/> | 15 | <el-table-column :label="language==0?'证件号码':'ID NO.'" prop="idcCode" width="200"/> |
| 16 | <el-table-column label="会员角色"> | 16 | <el-table-column :label="language==0?'会员角色':'Role'" width="150"> |
| 17 | <template #default="scope"> | 17 | <template #default="scope"> |
| 18 | <span v-for="item in scope.row.label?.split(',')" :key="item.id"> | 18 | <div class="esp"> |
| 19 | <el-tag type="primary" size="mini" v-if="item==='0'" effect="dark" class="ml10">运动员</el-tag> | 19 | <span v-for="item in scope.row.label?.split(',')" :key="item.id" class="text-primary"> |
| 20 | <el-tag type="info" size="mini" v-if="item==='1'" effect="dark" class="ml10">教练</el-tag> | 20 | <span v-if="item==='0'" class="ml5">{{ language==0?'运动员':'athletes' }}</span> |
| 21 | <el-tag type="info" size="mini" v-if="item==='2'" effect="dark" class="ml10">领队</el-tag> | 21 | <span v-if="item==='1'" class="ml5">{{ language==0?'教练':'coach' }}</span> |
| 22 | <el-tag type="info" size="mini" v-if="item==='3'" effect="dark" class="ml10">队医</el-tag> | 22 | <span v-if="item==='2'" class="ml5">{{ language==0?'领队':'team leader' }}</span> |
| 23 | <el-tag type="info" size="mini" v-if="item==='4'" effect="dark" class="ml10">翻译</el-tag> | 23 | <span v-if="item==='3'" class="ml5">{{ language==0?'队医':'team doctor' }}</span> |
| 24 | <el-tag type="info" size="mini" v-if="item==='5'" effect="dark" class="ml10">官员</el-tag> | 24 | <span v-if="item==='4'" class="ml5">{{ language==0?'翻译':'translator' }}</span> |
| 25 | <el-tag type="info" size="mini" v-if="item==='6'" effect="dark" class="ml10">其他</el-tag> | 25 | <span v-if="item==='5'" class="ml5">{{ language==0?'官员':'official' }}</span> |
| 26 | <span v-if="item==='6'" class="ml5">{{ language==0?'其他':'other' }}</span> | ||
| 26 | </span> | 27 | </span> |
| 28 | </div> | ||
| 27 | </template> | 29 | </template> |
| 28 | </el-table-column> | 30 | </el-table-column> |
| 29 | <el-table-column label="详细地址" prop="address"/> | 31 | <el-table-column :label="language==0?'详细地址':'Detailed Address'" prop="address" min-width="140"/> |
| 30 | <el-table-column label="操作" fixed="right" width="160" header-align="center" align="center"> | 32 | <el-table-column :label="language==0?'操作':'Actions'" fixed="right" width="160" header-align="center" |
| 33 | align="center"> | ||
| 31 | <template #default="scope"> | 34 | <template #default="scope"> |
| 32 | <a class="text-primary pd10" @click="editCoach(scope.row.id,scope.row.groupId)">编辑</a> | 35 | <a class="text-primary pd10" @click="editCoach(scope.row)"> |
| 33 | <a class="text-primary pd10" @click="delperson(scope.row)">删除</a> | 36 | {{language==0?'编辑':'Edit'}} |
| 37 | </a> | ||
| 38 | <a class="text-primary pd10" @click="delperson(scope.row)"> | ||
| 39 | {{language==0?'删除':'Delete'}} | ||
| 40 | </a> | ||
| 34 | </template> | 41 | </template> |
| 35 | </el-table-column> | 42 | </el-table-column> |
| 36 | </el-table> | 43 | </el-table> |
| 37 | <!-- <paginationPc--> | 44 | <!-- <paginationPc--> |
| 38 | <!-- v-show="total>0"--> | 45 | <!-- v-show="total>0"--> |
| 39 | <!-- v-model:page="query.pageNum"--> | 46 | <!-- v-model:page="query.pageNum"--> |
| 40 | <!-- v-model:limit="query.pageSize"--> | 47 | <!-- v-model:limit="query.pageSize"--> |
| 41 | <!-- :total="total"--> | 48 | <!-- :total="total"--> |
| 42 | <!-- @pagination="getList"--> | 49 | <!-- @pagination="getList"--> |
| 43 | <!-- />--> | 50 | <!-- />--> |
| 44 | </template> | 51 | </template> |
| 45 | 52 | ||
| 46 | <script setup> | 53 | <script setup> |
| 54 | import {ref} from "vue"; | ||
| 55 | import cache from "@/plugins/cache"; | ||
| 56 | const language = ref(cache.local.get('language') || 0) | ||
| 57 | const emit = defineEmits(['edit', 'delete']) | ||
| 58 | let title = '' | ||
| 47 | const props = defineProps({ | 59 | const props = defineProps({ |
| 48 | tableData:{ | 60 | tableData: { |
| 49 | type:Array, | 61 | type: Array, |
| 50 | required:true | 62 | required: true |
| 51 | } | 63 | } |
| 52 | }) | 64 | }) |
| 53 | const editCoach = () => { | 65 | const editCoach = (row) => { |
| 66 | // scope.row.id,scope.row.groupId | ||
| 67 | title = (language.value==0?'编辑人员':'Edit') | ||
| 68 | emit('edit', row,title) | ||
| 69 | } | ||
| 70 | const delperson = (row) => { | ||
| 71 | emit('delete', row) | ||
| 54 | 72 | ||
| 55 | } | 73 | } |
| 56 | </script> | 74 | </script> | ... | ... |
| 1 | <template> | ||
| 2 | <div class="pd20"> | ||
| 3 | <div class="matchItem" v-for="n in list" :key="n.id" @click="goDetail(n.id)"> | ||
| 4 | <el-row :gutter="15"> | ||
| 5 | <el-col :lg="7" :md="24" :xl="6"> | ||
| 6 | <img class="mauto w100" :src="fillImgUrl(n.coverUrl)"> | ||
| 7 | </el-col> | ||
| 8 | <el-col :lg="10" :md="12" :xl="12"> | ||
| 9 | <div class="info"> | ||
| 10 | <h3>{{ n.name }}</h3> | ||
| 11 | <p class="ppl"><label>{{ language==0?'比赛时间':'Playing Time' }}:</label>{{n.beginTime?.slice(0,10)}} 至 {{ n.endTime?.slice(0,10) }}</p> | ||
| 12 | <p class="ppl"><label>{{ language==0?'地    点':'Location' }}:</label>{{ n.address }}</p> | ||
| 13 | <p class="ppl"><label>{{ language==0?'报名截止':'Registration Deadline' }}:</label>{{ n.signEndTime?.slice(0,10) }}</p> | ||
| 14 | |||
| 15 | <p class="ppl"><label>{{ language==0?'联系人员':'Contact Person' }}:</label>{{ n.contactPerson }}</p> | ||
| 16 | <p class="ppl"><label>{{ language==0?'联系电话':'Phone' }}:</label>{{ n.contactTelno }}</p> | ||
| 17 | <p class="ppl"><label>{{ language==0?'邮    箱':'E-mail' }}:</label>{{ n.contactEmail }}</p> | ||
| 18 | |||
| 19 | </div> | ||
| 20 | </el-col> | ||
| 21 | <el-col :lg="7" :md="12" :xl="6"> | ||
| 22 | <p class="countDownTitle"> | ||
| 23 | <span v-if="language==0">报名截止倒计时</span> | ||
| 24 | <span v-else>Registration deadline countdown</span> | ||
| 25 | </p> | ||
| 26 | <van-count-down :time="n.time" format="DD 天 HH 时 mm 分 ss 秒"> | ||
| 27 | <template #default="timeData"> | ||
| 28 | <span class="block">{{ timeData.days }}</span> | ||
| 29 | <span class="colon">{{ language==0?'天':'Days' }}</span> | ||
| 30 | <span class="block">{{ timeData.hours }}</span> | ||
| 31 | <span class="colon">{{ language==0?'时':'Hrs' }}</span> | ||
| 32 | <span class="block">{{ timeData.minutes }}</span> | ||
| 33 | <span class="colon">{{ language==0?'分':'Min' }}</span> | ||
| 34 | <span class="block">{{ timeData.seconds }}</span> | ||
| 35 | <span class="colon">{{ language==0?'秒':'Sec' }}</span> | ||
| 36 | </template> | ||
| 37 | </van-count-down> | ||
| 38 | |||
| 39 | <div class="text-center mt30"> | ||
| 40 | <a class="btn-lineG mb20 mauto" style="display: block;"> | ||
| 41 | {{ language==0?'我要报名':'Application' }}</a> | ||
| 42 | </div> | ||
| 43 | </el-col> | ||
| 44 | </el-row> | ||
| 45 | </div> | ||
| 46 | </div> | ||
| 47 | |||
| 48 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="list?.length == 0" description=" "/> | ||
| 49 | </template> | ||
| 50 | |||
| 51 | <script setup> | ||
| 52 | import {ref} from "vue"; | ||
| 53 | import {onMounted} from "@vue/runtime-core"; | ||
| 54 | import {dayjs} from "element-plus" | ||
| 55 | import cache from "@/plugins/cache" | ||
| 56 | const language = ref(cache.local.get('language') || 0) | ||
| 57 | |||
| 58 | const router = useRouter() | ||
| 59 | const time = ref(0) | ||
| 60 | const props = defineProps({ | ||
| 61 | list: { | ||
| 62 | type: Array, | ||
| 63 | required: true | ||
| 64 | } | ||
| 65 | }) | ||
| 66 | onMounted(()=>{ | ||
| 67 | for(let n of props.list){ | ||
| 68 | var today = dayjs().format('YYYY-MM-DD HH:mm:ss') | ||
| 69 | n.time = dayjs(n.signEndTime).diff(today, 'millisecond') | ||
| 70 | } | ||
| 71 | }) | ||
| 72 | function goDetail(id) { | ||
| 73 | const routeData = router.resolve({ | ||
| 74 | path: `${id}` | ||
| 75 | }) | ||
| 76 | window.open(routeData.href, '_blank') | ||
| 77 | } | ||
| 78 | </script> | ||
| 79 | |||
| 80 | <style scoped lang="scss"> | ||
| 81 | .mt60{margin-top: 60px} | ||
| 82 | .matchItem { | ||
| 83 | cursor: pointer;margin: 0 0 20px;padding: 0 0 20px; | ||
| 84 | background: #FFFFFF;border-bottom: 1px solid #e5e5e5; | ||
| 85 | position: relative; | ||
| 86 | &:last-child { | ||
| 87 | border-bottom: none; | ||
| 88 | } | ||
| 89 | .el-avatar { | ||
| 90 | position: absolute; | ||
| 91 | left: 20px; | ||
| 92 | top: 30px; | ||
| 93 | |||
| 94 | img { | ||
| 95 | background: #fff; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | .info { | ||
| 100 | p { | ||
| 101 | font-size: 14px; | ||
| 102 | } | ||
| 103 | } | ||
| 104 | |||
| 105 | .typeTag { | ||
| 106 | position: absolute; | ||
| 107 | right: 0; | ||
| 108 | top: 0; | ||
| 109 | } | ||
| 110 | |||
| 111 | h3 { | ||
| 112 | font-weight: 500;margin: 0 0 10px; | ||
| 113 | font-size: 18px; | ||
| 114 | color: #000000; | ||
| 115 | text-overflow: ellipsis; | ||
| 116 | } | ||
| 117 | |||
| 118 | &:hover h3 { | ||
| 119 | color: var(--el-color-primary); | ||
| 120 | } | ||
| 121 | } | ||
| 122 | .countDownTitle { | ||
| 123 | text-align: center; | ||
| 124 | color: #525F6B; | ||
| 125 | position: relative; | ||
| 126 | width: 100%; | ||
| 127 | left: 0; | ||
| 128 | font-size: 14px; | ||
| 129 | } | ||
| 130 | |||
| 131 | .countDownTitle span { | ||
| 132 | background: #fff; | ||
| 133 | padding: 0 10px; | ||
| 134 | position: relative; | ||
| 135 | z-index: 1; | ||
| 136 | } | ||
| 137 | |||
| 138 | .countDownTitle::after { | ||
| 139 | position: absolute; | ||
| 140 | background: #ccc; | ||
| 141 | height: 1px; | ||
| 142 | content: ''; | ||
| 143 | top: 0; | ||
| 144 | bottom: 0; | ||
| 145 | margin: auto; | ||
| 146 | width: 100%; | ||
| 147 | left: 0; | ||
| 148 | } | ||
| 149 | .info .ppl{margin: 5px 0;} | ||
| 150 | .ppl{color: #29343C; | ||
| 151 | label{color: #929AA0;} | ||
| 152 | } | ||
| 153 | .van-count-down { | ||
| 154 | text-align: center; | ||
| 155 | margin: 20px 0; | ||
| 156 | } | ||
| 157 | |||
| 158 | .colon { | ||
| 159 | display: inline-block; | ||
| 160 | font-size: 16px; | ||
| 161 | margin: 0 8px; | ||
| 162 | color: #7B7F83; | ||
| 163 | } | ||
| 164 | |||
| 165 | .block { | ||
| 166 | display: inline-block; opacity: 0.7; | ||
| 167 | width: 52px; | ||
| 168 | color: #fff; | ||
| 169 | font-size: 26px; | ||
| 170 | font-weight: bold; | ||
| 171 | border-radius: 10px; | ||
| 172 | background: url(@/assets/img/djs_bg.png) left; | ||
| 173 | background-size: 100% 100%; | ||
| 174 | line-height: 50px; | ||
| 175 | text-align: center; | ||
| 176 | } | ||
| 177 | |||
| 178 | </style> |
| 1 | <template> | ||
| 2 | <el-steps :active="activeStep" align-center> | ||
| 3 | <el-step :title="language==0?'团队信息':'Team Information'" /> | ||
| 4 | <el-step :title="language==0?'教练/领队/其他':'Coach/Team Leader/Other'" /> | ||
| 5 | <el-step :title="language==0?'选手报名':'Participant Registration'" /> | ||
| 6 | <el-step :title="language==0?'提交审核':'Submit for review'" /> | ||
| 7 | </el-steps> | ||
| 8 | </template> | ||
| 9 | |||
| 10 | <script setup> | ||
| 11 | const props = defineProps({ | ||
| 12 | activeStep: { | ||
| 13 | type: Number, | ||
| 14 | required: true | ||
| 15 | }, | ||
| 16 | language: { | ||
| 17 | type: Number, | ||
| 18 | required: true, | ||
| 19 | default: 0 | ||
| 20 | } | ||
| 21 | }) | ||
| 22 | </script> | ||
| 23 | |||
| 24 | <style scoped> | ||
| 25 | |||
| 26 | </style> |
| ... | @@ -5,7 +5,7 @@ | ... | @@ -5,7 +5,7 @@ |
| 5 | <el-card class="mb20"> | 5 | <el-card class="mb20"> |
| 6 | <el-row :gutter="20"> | 6 | <el-row :gutter="20"> |
| 7 | <el-col :lg="7" :md="24" :xl="6" > | 7 | <el-col :lg="7" :md="24" :xl="6" > |
| 8 | <img class="mauto" :src="matchData.bgImgUrl" > | 8 | <img class="mauto w100" :src="fillImgUrl(matchData.coverUrl)" > |
| 9 | </el-col> | 9 | </el-col> |
| 10 | <el-col :lg="9" :md="12" :xl="10"> | 10 | <el-col :lg="9" :md="12" :xl="10"> |
| 11 | <h3> | 11 | <h3> |
| ... | @@ -88,90 +88,29 @@ | ... | @@ -88,90 +88,29 @@ |
| 88 | <matchInfo :form="matchData" v-if="menu[0].active==1"/> | 88 | <matchInfo :form="matchData" v-if="menu[0].active==1"/> |
| 89 | <div v-if="menu[1].active==1"> | 89 | <div v-if="menu[1].active==1"> |
| 90 | <div class="collapsebox"> | 90 | <div class="collapsebox"> |
| 91 | <el-collapse v-if="matchData.cptProjectList?.length > 0"> | ||
| 92 | <el-collapse-item :title="p.name" :name="index" :key="index" v-for="(p,index) in matchData.cptProjectList"> | ||
| 93 | <div class="pd20"> | 91 | <div class="pd20"> |
| 94 | <table class="table"> | 92 | <table class="table" cellspacing="0" cellpadding="0" v-if="matchData.cptProjectList?.length > 0"> |
| 95 | <tr> | 93 | <tr> |
| 96 | <td>日期</td> | 94 | <th>组别编号</th> |
| 97 | <td>单元</td> | 95 | <th>组别名称</th> |
| 98 | <td>组别</td> | 96 | <th>舞种</th> |
| 99 | <td>时间</td> | 97 | <th>舞种明细</th> |
| 100 | <td>阶段</td> | 98 | <th>参赛性别</th> |
| 99 | <th>参赛年龄</th> | ||
| 100 | <th>服务费(元)</th> | ||
| 101 | </tr> | 101 | </tr> |
| 102 | <tr> | 102 | <tr v-for="(p,index) in matchData.cptProjectList" :key="index"> |
| 103 | <td rowspan="4">2023/10/6(星期五)</td> | 103 | <td>{{ p.code }}</td> |
| 104 | <td rowspan="4">BRK01</td> | 104 | <td>{{ p.name }}</td> |
| 105 | <td>男子</td> | 105 | <td>{{ p.danceType }}</td> |
| 106 | <td>14:30 - 15:30</td> | 106 | <td>{{ p.danceTypeDetailStr }}</td> |
| 107 | <td>资格赛</td> | 107 | <td>{{ p.playTypeStr }}</td> |
| 108 | </tr> | 108 | <td>{{ p.birthPeriod }}</td> |
| 109 | <tr> | 109 | <td>¥{{ p.serviceFee }}</td> |
| 110 | <td>女子</td> | ||
| 111 | <td>14:30 - 15:30</td> | ||
| 112 | <td>资格赛</td> | ||
| 113 | </tr> | ||
| 114 | <tr> | ||
| 115 | <td>男子</td> | ||
| 116 | <td>14:30 - 15:30</td> | ||
| 117 | <td>循环赛</td> | ||
| 118 | </tr> | ||
| 119 | <tr> | ||
| 120 | <td>女子</td> | ||
| 121 | <td>14:30 - 15:30</td> | ||
| 122 | <td>循环赛</td> | ||
| 123 | </tr> | ||
| 124 | <tr> | ||
| 125 | <td rowspan="8">2023/10/7(星期六)</td> | ||
| 126 | <td rowspan="8">BRK02</td> | ||
| 127 | <td>男子</td> | ||
| 128 | <td>14:30 - 15:30</td> | ||
| 129 | <td>四分之一决赛</td> | ||
| 130 | </tr> | ||
| 131 | <tr> | ||
| 132 | <td>男子</td> | ||
| 133 | <td>14:30 - 15:30</td> | ||
| 134 | <td>四分之一决赛</td> | ||
| 135 | </tr> | ||
| 136 | <tr> | ||
| 137 | <td>女子</td> | ||
| 138 | <td>14:30 - 15:30</td> | ||
| 139 | <td>半决赛</td> | ||
| 140 | </tr> | ||
| 141 | <tr> | ||
| 142 | <td>女子</td> | ||
| 143 | <td>14:30 - 15:30</td> | ||
| 144 | <td>半决赛</td> | ||
| 145 | </tr> | ||
| 146 | <tr> | ||
| 147 | <td>男子</td> | ||
| 148 | <td>14:30 - 15:30</td> | ||
| 149 | <td>季军赛</td> | ||
| 150 | </tr> | ||
| 151 | <tr> | ||
| 152 | <td>女子</td> | ||
| 153 | <td>14:30 - 15:30</td> | ||
| 154 | <td>季军赛</td> | ||
| 155 | </tr> | ||
| 156 | <tr> | ||
| 157 | <td>男子</td> | ||
| 158 | <td>14:30 - 15:30</td> | ||
| 159 | <td>决赛</td> | ||
| 160 | </tr> | ||
| 161 | <tr> | ||
| 162 | <td>女子</td> | ||
| 163 | <td>14:30 - 15:30</td> | ||
| 164 | <td>决赛</td> | ||
| 165 | </tr> | ||
| 166 | <tr> | ||
| 167 | <td colspan="5" style="text-align: left"> | ||
| 168 | 注:竞赛日程将根据最终参赛人数和电视转播的要求进行调整 | ||
| 169 | </td> | ||
| 170 | </tr> | 110 | </tr> |
| 171 | </table> | 111 | </table> |
| 172 | </div> | 112 | </div> |
| 173 | </el-collapse-item> | 113 | |
| 174 | </el-collapse> | ||
| 175 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cptProjectList?.length == 0" description=" "/> | 114 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cptProjectList?.length == 0" description=" "/> |
| 176 | </div> | 115 | </div> |
| 177 | </div> | 116 | </div> |
| ... | @@ -231,38 +170,7 @@ | ... | @@ -231,38 +170,7 @@ |
| 231 | </ul> | 170 | </ul> |
| 232 | </div> | 171 | </div> |
| 233 | <!-- 分站赛--> | 172 | <!-- 分站赛--> |
| 234 | <div v-if="menu1[0].active==1"> | 173 | <substation-list v-if="menu1[0].active==1" :list="matchData.cpts"/> |
| 235 | <div class="matchItem" v-for="n in matchData.cpts" :key="n.id" @click="goDetail(n.id)"> | ||
| 236 | <el-avatar alt="logo" :size="100" :src="n.logoUrl" /> | ||
| 237 | <div class="info"> | ||
| 238 | <h3>{{ n.name }}</h3> | ||
| 239 | <p> | ||
| 240 | 报名截止:{{ n.signEndTime?.substring(0, 10) }} | ||
| 241 | <el-tag v-if="n.progressStatusCode==3" type="warning">即将开始</el-tag> | ||
| 242 | <el-tag v-if="n.progressStatusCode==2" type="success">报名中</el-tag> | ||
| 243 | <el-tag v-if="n.progressStatusCode==4">进行中</el-tag> | ||
| 244 | <el-tag v-if="n.progressStatusCode==5" type="info">已结束</el-tag> | ||
| 245 | <el-tag v-if="n.progressStatusCode==1" type="info">报名未开始</el-tag> | ||
| 246 | </p> | ||
| 247 | <p> | ||
| 248 | 比赛时间:{{ n.beginTime?.substring(0, 10) }}-{{ n.endTime?.substring(0, 10) }} | ||
| 249 | </p> | ||
| 250 | <p> | ||
| 251 | 比赛地点:{{ n.address }} | ||
| 252 | </p> | ||
| 253 | </div> | ||
| 254 | <div class="pobtns"> | ||
| 255 | <el-button v-if="n.progressStatusCode==2" round type="success" @click="goDetail(n.id)"> | ||
| 256 | 我要报名 | ||
| 257 | </el-button> | ||
| 258 | <el-button v-else-if="n.progressStatusCode==5" round type="info" @click="goDetail(n.id)"> | ||
| 259 | 报名结束 | ||
| 260 | </el-button> | ||
| 261 | <el-button v-else round type="warning" @click="goDetail(n.id)">查看详情</el-button> | ||
| 262 | </div> | ||
| 263 | </div> | ||
| 264 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cpts?.length == 0" description=" "/> | ||
| 265 | </div> | ||
| 266 | <matchInfo :form="matchData" v-if="menu1[1].active==1"/> | 174 | <matchInfo :form="matchData" v-if="menu1[1].active==1"/> |
| 267 | <match-schedule-list :match-data="matchData" v-if="menu1[2].active==1"/> | 175 | <match-schedule-list :match-data="matchData" v-if="menu1[2].active==1"/> |
| 268 | </el-card> | 176 | </el-card> |
| ... | @@ -273,10 +181,10 @@ | ... | @@ -273,10 +181,10 @@ |
| 273 | </template> | 181 | </template> |
| 274 | 182 | ||
| 275 | <script setup> | 183 | <script setup> |
| 276 | import groupDetail from '@/viewsPc/center/component/teamInfo_form' | 184 | import MatchInfo from '@/viewsPc/match/components/matchInfo' |
| 277 | import matchInfo from '@/viewsPc/match/components/matchInfo' | ||
| 278 | import MatchScheduleList from "@/viewsPc/match/components/matchScheduleList"; | 185 | import MatchScheduleList from "@/viewsPc/match/components/matchScheduleList"; |
| 279 | import MatchNews from "@/viewsPc/match/components/matchNews"; | 186 | import MatchNews from "@/viewsPc/match/components/matchNews"; |
| 187 | import SubstationList from "@/viewsPc/match/components/substation-list"; | ||
| 280 | 188 | ||
| 281 | import { getCurrentInstance, ref } from 'vue' | 189 | import { getCurrentInstance, ref } from 'vue' |
| 282 | import { reactive, onMounted } from '@vue/runtime-core' | 190 | import { reactive, onMounted } from '@vue/runtime-core' |
| ... | @@ -288,6 +196,7 @@ const { proxy } = getCurrentInstance() | ... | @@ -288,6 +196,7 @@ const { proxy } = getCurrentInstance() |
| 288 | import * as match from '@/apiPc/match' | 196 | import * as match from '@/apiPc/match' |
| 289 | import { toRefs } from '@vueuse/shared' | 197 | import { toRefs } from '@vueuse/shared' |
| 290 | import { ElMessage } from 'element-plus' | 198 | import { ElMessage } from 'element-plus' |
| 199 | import useUserStore from "@/store/modules/user"; | ||
| 291 | const data = reactive({ | 200 | const data = reactive({ |
| 292 | matchData: {}, | 201 | matchData: {}, |
| 293 | matchId: 0, | 202 | matchId: 0, |
| ... | @@ -299,11 +208,20 @@ const data = reactive({ | ... | @@ -299,11 +208,20 @@ const data = reactive({ |
| 299 | signDoneGroupList: [] | 208 | signDoneGroupList: [] |
| 300 | }) | 209 | }) |
| 301 | const {matchData,matchId,groupId,activeName2,popupGroupList,menu,menu1,signDoneGroupList} = toRefs(data) | 210 | const {matchData,matchId,groupId,activeName2,popupGroupList,menu,menu1,signDoneGroupList} = toRefs(data) |
| 211 | const group = useUserStore().group | ||
| 212 | const user = useUserStore().user | ||
| 302 | onMounted(() => { | 213 | onMounted(() => { |
| 303 | // matchId.value = route.params.id | 214 | groupId.value = group.id |
| 304 | matchId.value = '1759477811976183809' | 215 | match.getMaList().then((res) => { |
| 216 | if(route.params.id!=0){ | ||
| 217 | matchId.value = route.params.id | ||
| 218 | } else { | ||
| 219 | matchId.value = res.rows[0].id | ||
| 220 | } | ||
| 305 | getMatch(matchId.value) | 221 | getMatch(matchId.value) |
| 306 | getGroupListByCptId(matchId.value) | 222 | getGroupListByCptId(matchId.value) |
| 223 | }) | ||
| 224 | |||
| 307 | }) | 225 | }) |
| 308 | function building() { | 226 | function building() { |
| 309 | ElMessage.warning('暂未开发,敬请期待!') | 227 | ElMessage.warning('暂未开发,敬请期待!') |
| ... | @@ -329,38 +247,36 @@ function changeMenu(menu,l){ | ... | @@ -329,38 +247,36 @@ function changeMenu(menu,l){ |
| 329 | } | 247 | } |
| 330 | } | 248 | } |
| 331 | function choseSignType() { | 249 | function choseSignType() { |
| 332 | if (matchData.value.signType == '0') { | 250 | if(!user){ |
| 251 | ElMessage.warning('请登录') | ||
| 252 | return | ||
| 253 | } | ||
| 254 | console.log(matchData.value.signType) | ||
| 255 | // checkIsSign().then(() => { | ||
| 256 | if (matchData.value.signType == '0'||(matchData.value.signType == '2' && user.utype == '1')) { | ||
| 333 | // 个人报名 | 257 | // 个人报名 |
| 334 | checkIsSign(matchData.value.signType).then((res) => { | ||
| 335 | router.push({ | 258 | router.push({ |
| 336 | path: `${route.params.id}/singleSign` | 259 | path: `${matchId.value}/singleSign` |
| 337 | }) | ||
| 338 | }) | ||
| 339 | } else { | ||
| 340 | // 团队报名 团体-队伍报名 | ||
| 341 | match.getMyGroupList().then(res => { | ||
| 342 | checkIsSign(matchData.value.signType,res.data[0].id).then(() => { | ||
| 343 | goSignType2(res.data[0].id) | ||
| 344 | }) | 260 | }) |
| 345 | }) | ||
| 346 | |||
| 347 | } | 261 | } |
| 348 | } | 262 | if(matchData.value.signType == '1'||(matchData.value.signType == '2' && user.utype == '2')){ |
| 349 | function goSignType2(groupId) { | ||
| 350 | router.push({ | 263 | router.push({ |
| 351 | path: `${route.params.id}/teamSign`, | 264 | path: `${matchId.value}/teamSign`, |
| 352 | query: { | 265 | query: { |
| 353 | matchId: matchId.value, | 266 | matchId: matchId.value, |
| 354 | groupId: groupId, | 267 | groupId: groupId.value, |
| 355 | signType: matchData.value.signType | 268 | signType: matchData.value.signType |
| 356 | } | 269 | } |
| 357 | }) | 270 | }) |
| 271 | } | ||
| 272 | // }) | ||
| 358 | } | 273 | } |
| 274 | |||
| 359 | // 获取已报信息 | 275 | // 获取已报信息 |
| 360 | function checkIsSign(signType,groupId) { | 276 | function checkIsSign() { |
| 361 | var obj = { | 277 | var obj = { |
| 362 | cptId: matchId.value, | 278 | cptId: matchId.value, |
| 363 | groupId: groupId | 279 | groupId: groupId.value |
| 364 | } | 280 | } |
| 365 | return match.getMySignInfo(obj).then(res => { | 281 | return match.getMySignInfo(obj).then(res => { |
| 366 | if (res.data.type == '1') { | 282 | if (res.data.type == '1') { | ... | ... |
| ... | @@ -5,16 +5,16 @@ | ... | @@ -5,16 +5,16 @@ |
| 5 | <el-card class="mb20"> | 5 | <el-card class="mb20"> |
| 6 | <el-row :gutter="20"> | 6 | <el-row :gutter="20"> |
| 7 | <el-col :lg="7" :md="24" :xl="6" > | 7 | <el-col :lg="7" :md="24" :xl="6" > |
| 8 | <img class="mauto" :src="(matchData.enCpt.bgImgUrl)" > | 8 | <img class="mauto w100" :src="fillImgUrl(matchData.coverUrl)" > |
| 9 | </el-col> | 9 | </el-col> |
| 10 | <el-col :lg="9" :md="12" :xl="10"> | 10 | <el-col :lg="9" :md="12" :xl="10"> |
| 11 | <h3> | 11 | <h3> |
| 12 | {{ matchData.enCpt.name }} | 12 | {{ matchData.name }} |
| 13 | </h3> | 13 | </h3> |
| 14 | <p class="ppl"><label class="bm1">Playing Time:</label>{{matchData.enCpt.beginTime?.slice(0,10)}} ~ {{ matchData.enCpt.endTime?.slice(0,10) }}</p> | 14 | <p class="ppl"><label class="bm1">Playing Time:</label>{{matchData.beginTime?.slice(0,10)}} ~ {{ matchData.endTime?.slice(0,10) }}</p> |
| 15 | <p class="ppl"><label class="bm2">Event Level:</label>{{ matchData.enCpt.level }}</p> | 15 | <p class="ppl"><label class="bm2">Event Level:</label>{{ matchData.level }}</p> |
| 16 | <p class="ppl"><label class="bm3">Location:</label>{{ matchData.enCpt.address }}</p> | 16 | <p class="ppl"><label class="bm3">Location:</label>{{ matchData.address }}</p> |
| 17 | <p class="ppl"><label class="bm4">Registration Deadline:</label>{{ matchData.enCpt.signEndTime?.slice(0,10) }}</p> | 17 | <p class="ppl"><label class="bm4">Registration Deadline:</label>{{ matchData.signEndTime?.slice(0,10) }}</p> |
| 18 | </el-col> | 18 | </el-col> |
| 19 | <el-col :lg="8" :md="12" :xl="8" v-if="matchData.type=='0'"> | 19 | <el-col :lg="8" :md="12" :xl="8" v-if="matchData.type=='0'"> |
| 20 | <p class="countDownTitle"><span>Registration deadline countdown</span></p> | 20 | <p class="countDownTitle"><span>Registration deadline countdown</span></p> |
| ... | @@ -88,90 +88,29 @@ | ... | @@ -88,90 +88,29 @@ |
| 88 | <matchInfo :form="matchData" v-if="menu[0].active==1"/> | 88 | <matchInfo :form="matchData" v-if="menu[0].active==1"/> |
| 89 | <div v-if="menu[1].active==1"> | 89 | <div v-if="menu[1].active==1"> |
| 90 | <div class="collapsebox"> | 90 | <div class="collapsebox"> |
| 91 | <el-collapse v-if="matchData.cptProjectList?.length > 0"> | ||
| 92 | <el-collapse-item :title="p.name" :name="index" :key="index" v-for="(p,index) in matchData.cptProjectList"> | ||
| 93 | <div class="pd20"> | 91 | <div class="pd20"> |
| 94 | <table class="table"> | 92 | <table class="table" cellspacing="0" cellpadding="0" v-if="matchData.cptProjectList?.length > 0"> |
| 95 | <tr> | 93 | <tr> |
| 96 | <td>日期</td> | 94 | <th>Group code</th> |
| 97 | <td>单元</td> | 95 | <th>Group</th> |
| 98 | <td>组别</td> | 96 | <th>Dance Style</th> |
| 99 | <td>时间</td> | 97 | <th>Dance Detail</th> |
| 100 | <td>阶段</td> | 98 | <th>Sex</th> |
| 99 | <th>Age</th> | ||
| 100 | <th>Registration Fee</th> | ||
| 101 | </tr> | 101 | </tr> |
| 102 | <tr> | 102 | <tr v-for="(p,index) in matchData.cptProjectList" :key="index"> |
| 103 | <td rowspan="4">2023/10/6(星期五)</td> | 103 | <td>{{ p.code }}</td> |
| 104 | <td rowspan="4">BRK01</td> | 104 | <td>{{ p.name }}</td> |
| 105 | <td>男子</td> | 105 | <td>{{ p.danceType }}</td> |
| 106 | <td>14:30 - 15:30</td> | 106 | <td>{{ p.danceTypeDetailStr }}</td> |
| 107 | <td>资格赛</td> | 107 | <td>{{ p.playTypeStr }}</td> |
| 108 | </tr> | 108 | <td>{{ p.birthPeriod }}</td> |
| 109 | <tr> | 109 | <td>¥{{ p.serviceFee }}</td> |
| 110 | <td>女子</td> | ||
| 111 | <td>14:30 - 15:30</td> | ||
| 112 | <td>资格赛</td> | ||
| 113 | </tr> | ||
| 114 | <tr> | ||
| 115 | <td>男子</td> | ||
| 116 | <td>14:30 - 15:30</td> | ||
| 117 | <td>循环赛</td> | ||
| 118 | </tr> | ||
| 119 | <tr> | ||
| 120 | <td>女子</td> | ||
| 121 | <td>14:30 - 15:30</td> | ||
| 122 | <td>循环赛</td> | ||
| 123 | </tr> | ||
| 124 | <tr> | ||
| 125 | <td rowspan="8">2023/10/7(星期六)</td> | ||
| 126 | <td rowspan="8">BRK02</td> | ||
| 127 | <td>男子</td> | ||
| 128 | <td>14:30 - 15:30</td> | ||
| 129 | <td>四分之一决赛</td> | ||
| 130 | </tr> | ||
| 131 | <tr> | ||
| 132 | <td>男子</td> | ||
| 133 | <td>14:30 - 15:30</td> | ||
| 134 | <td>四分之一决赛</td> | ||
| 135 | </tr> | ||
| 136 | <tr> | ||
| 137 | <td>女子</td> | ||
| 138 | <td>14:30 - 15:30</td> | ||
| 139 | <td>半决赛</td> | ||
| 140 | </tr> | ||
| 141 | <tr> | ||
| 142 | <td>女子</td> | ||
| 143 | <td>14:30 - 15:30</td> | ||
| 144 | <td>半决赛</td> | ||
| 145 | </tr> | ||
| 146 | <tr> | ||
| 147 | <td>男子</td> | ||
| 148 | <td>14:30 - 15:30</td> | ||
| 149 | <td>季军赛</td> | ||
| 150 | </tr> | ||
| 151 | <tr> | ||
| 152 | <td>女子</td> | ||
| 153 | <td>14:30 - 15:30</td> | ||
| 154 | <td>季军赛</td> | ||
| 155 | </tr> | ||
| 156 | <tr> | ||
| 157 | <td>男子</td> | ||
| 158 | <td>14:30 - 15:30</td> | ||
| 159 | <td>决赛</td> | ||
| 160 | </tr> | ||
| 161 | <tr> | ||
| 162 | <td>女子</td> | ||
| 163 | <td>14:30 - 15:30</td> | ||
| 164 | <td>决赛</td> | ||
| 165 | </tr> | ||
| 166 | <tr> | ||
| 167 | <td colspan="5" style="text-align: left"> | ||
| 168 | 注:竞赛日程将根据最终参赛人数和电视转播的要求进行调整 | ||
| 169 | </td> | ||
| 170 | </tr> | 110 | </tr> |
| 171 | </table> | 111 | </table> |
| 172 | </div> | 112 | </div> |
| 173 | </el-collapse-item> | 113 | |
| 174 | </el-collapse> | ||
| 175 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cptProjectList?.length == 0" description=" "/> | 114 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cptProjectList?.length == 0" description=" "/> |
| 176 | </div> | 115 | </div> |
| 177 | </div> | 116 | </div> |
| ... | @@ -231,38 +170,7 @@ | ... | @@ -231,38 +170,7 @@ |
| 231 | </ul> | 170 | </ul> |
| 232 | </div> | 171 | </div> |
| 233 | <!-- 分站赛--> | 172 | <!-- 分站赛--> |
| 234 | <div v-if="menu1[0].active==1"> | 173 | <substation-list v-if="menu1[0].active==1" :list="matchData.cpts"/> |
| 235 | <div class="matchItem" v-for="n in matchData.cpts" :key="n.id" @click="goDetail(n.id)"> | ||
| 236 | <el-avatar alt="logo" :size="100" :src="n.logoUrl" /> | ||
| 237 | <div class="info"> | ||
| 238 | <h3>{{ n.name }}</h3> | ||
| 239 | <p> | ||
| 240 | Registration deadline:{{ n.signEndTime?.substring(0, 10) }} | ||
| 241 | <el-tag v-if="n.progressStatusCode==3" type="warning">About to begin</el-tag> | ||
| 242 | <el-tag v-if="n.progressStatusCode==2" type="success">Registration in progress</el-tag> | ||
| 243 | <el-tag v-if="n.progressStatusCode==4">In play</el-tag> | ||
| 244 | <el-tag v-if="n.progressStatusCode==5" type="info">Ended</el-tag> | ||
| 245 | <el-tag v-if="n.progressStatusCode==1" type="info">Not started</el-tag> | ||
| 246 | </p> | ||
| 247 | <p> | ||
| 248 | Playing time:{{ n.beginTime?.substring(0, 10) }}-{{ n.endTime?.substring(0, 10) }} | ||
| 249 | </p> | ||
| 250 | <p> | ||
| 251 | Location:{{ n.address }} | ||
| 252 | </p> | ||
| 253 | </div> | ||
| 254 | <div class="pobtns"> | ||
| 255 | <el-button v-if="n.progressStatusCode==2" round type="success" @click="goDetail(n.id)"> | ||
| 256 | Application | ||
| 257 | </el-button> | ||
| 258 | <el-button v-else-if="n.progressStatusCode==5" round type="info" @click="goDetail(n.id)"> | ||
| 259 | Registration ended | ||
| 260 | </el-button> | ||
| 261 | <el-button v-else round type="warning" @click="goDetail(n.id)">Detail</el-button> | ||
| 262 | </div> | ||
| 263 | </div> | ||
| 264 | <el-empty image="@/assets/img/order_no.png" image-size="228" v-if="matchData.cpts?.length == 0" description=" "/> | ||
| 265 | </div> | ||
| 266 | <matchInfo :form="matchData" v-if="menu1[1].active==1"/> | 174 | <matchInfo :form="matchData" v-if="menu1[1].active==1"/> |
| 267 | <match-schedule-list :match-data="matchData" v-if="menu1[2].active==1"/> | 175 | <match-schedule-list :match-data="matchData" v-if="menu1[2].active==1"/> |
| 268 | </el-card> | 176 | </el-card> |
| ... | @@ -275,10 +183,10 @@ | ... | @@ -275,10 +183,10 @@ |
| 275 | </template> | 183 | </template> |
| 276 | 184 | ||
| 277 | <script setup> | 185 | <script setup> |
| 278 | import groupDetail from '@/viewsPc/center/component/teamInfo_form' | 186 | import MatchInfo from '@/viewsPc/match/components/matchInfo' |
| 279 | import matchInfo from '@/viewsPc/match/components/matchInfo' | ||
| 280 | import MatchScheduleList from "@/viewsPc/match/components/matchScheduleList"; | 187 | import MatchScheduleList from "@/viewsPc/match/components/matchScheduleList"; |
| 281 | import MatchNews from "@/viewsPc/match/components/matchNews"; | 188 | import MatchNews from "@/viewsPc/match/components/matchNews"; |
| 189 | import SubstationList from "@/viewsPc/match/components/substation-list"; | ||
| 282 | 190 | ||
| 283 | import { getCurrentInstance, ref } from 'vue' | 191 | import { getCurrentInstance, ref } from 'vue' |
| 284 | import { reactive, onMounted } from '@vue/runtime-core' | 192 | import { reactive, onMounted } from '@vue/runtime-core' |
| ... | @@ -290,10 +198,11 @@ const { proxy } = getCurrentInstance() | ... | @@ -290,10 +198,11 @@ const { proxy } = getCurrentInstance() |
| 290 | import * as match from '@/apiPc/match' | 198 | import * as match from '@/apiPc/match' |
| 291 | import { toRefs } from '@vueuse/shared' | 199 | import { toRefs } from '@vueuse/shared' |
| 292 | import { ElMessage } from 'element-plus' | 200 | import { ElMessage } from 'element-plus' |
| 201 | import useUserStore from "@/store/modules/user"; | ||
| 202 | const user = useUserStore().user || {} | ||
| 203 | const group = useUserStore().group || {} | ||
| 293 | const data = reactive({ | 204 | const data = reactive({ |
| 294 | matchData: { | 205 | matchData: {}, |
| 295 | enCpt:{} | ||
| 296 | }, | ||
| 297 | matchId: 0, | 206 | matchId: 0, |
| 298 | groupId: '', | 207 | groupId: '', |
| 299 | activeName2:'first', | 208 | activeName2:'first', |
| ... | @@ -305,10 +214,16 @@ const data = reactive({ | ... | @@ -305,10 +214,16 @@ const data = reactive({ |
| 305 | }) | 214 | }) |
| 306 | const {matchData,matchId,groupId,activeName2,popupGroupList,menu,menu1,signDoneGroupList} = toRefs(data) | 215 | const {matchData,matchId,groupId,activeName2,popupGroupList,menu,menu1,signDoneGroupList} = toRefs(data) |
| 307 | onMounted(() => { | 216 | onMounted(() => { |
| 308 | // matchId.value = route.params.id | 217 | groupId.value = group.id |
| 309 | matchId.value = '1759477811976183809' | 218 | match.getMaList().then((res) => { |
| 219 | if(route.params.id!=0){ | ||
| 220 | matchId.value = route.params.id | ||
| 221 | } else { | ||
| 222 | matchId.value = res.rows[0].id | ||
| 223 | } | ||
| 310 | getMatch(matchId.value) | 224 | getMatch(matchId.value) |
| 311 | getGroupListByCptId(matchId.value) | 225 | getGroupListByCptId(matchId.value) |
| 226 | }) | ||
| 312 | }) | 227 | }) |
| 313 | function building() { | 228 | function building() { |
| 314 | ElMessage.warning('Building!') | 229 | ElMessage.warning('Building!') |
| ... | @@ -334,38 +249,35 @@ function changeMenu(menu,l){ | ... | @@ -334,38 +249,35 @@ function changeMenu(menu,l){ |
| 334 | } | 249 | } |
| 335 | } | 250 | } |
| 336 | function choseSignType() { | 251 | function choseSignType() { |
| 337 | if (matchData.value.signType == '0') { | 252 | if(!user){ |
| 253 | ElMessage.warning('Please login') | ||
| 254 | return | ||
| 255 | } | ||
| 256 | //判断signType,如果是2且utype是2,则跳转到团体报名 | ||
| 257 | // checkIsSign().then(() => { | ||
| 258 | if (matchData.value.signType == '0'||(matchData.value.signType == '2' && user.utype == '1')) { | ||
| 338 | // 个人报名 | 259 | // 个人报名 |
| 339 | checkIsSign(matchData.value.signType).then((res) => { | ||
| 340 | router.push({ | 260 | router.push({ |
| 341 | path: `${route.params.id}/singleSign` | 261 | path: `${route.params.id}/singleSign` |
| 342 | }) | 262 | }) |
| 343 | }) | ||
| 344 | } else { | ||
| 345 | // 团队报名 团体-队伍报名 | ||
| 346 | match.getMyGroupList().then(res => { | ||
| 347 | checkIsSign(matchData.value.signType,res.data[0].id).then(() => { | ||
| 348 | goSignType2(res.data[0].id) | ||
| 349 | }) | ||
| 350 | }) | ||
| 351 | |||
| 352 | } | 263 | } |
| 353 | } | 264 | if(matchData.value.signType == '1'||(matchData.value.signType == '2' && user.utype == '2')){ |
| 354 | function goSignType2(groupId) { | ||
| 355 | router.push({ | 265 | router.push({ |
| 356 | path: `${route.params.id}/teamSign`, | 266 | path: `${route.params.id}/teamSign`, |
| 357 | query: { | 267 | query: { |
| 358 | matchId: matchId.value, | 268 | matchId: matchId.value, |
| 359 | groupId: groupId, | 269 | groupId: groupId.value, |
| 360 | signType: matchData.value.signType | 270 | signType: matchData.value.signType |
| 361 | } | 271 | } |
| 362 | }) | 272 | }) |
| 273 | } | ||
| 274 | // }) | ||
| 363 | } | 275 | } |
| 364 | // 获取已报信息 | 276 | // 获取已报信息 |
| 365 | function checkIsSign(signType,groupId) { | 277 | function checkIsSign() { |
| 366 | var obj = { | 278 | var obj = { |
| 367 | cptId: matchId.value, | 279 | cptId: matchId.value, |
| 368 | groupId: groupId | 280 | groupId: groupId.value |
| 369 | } | 281 | } |
| 370 | return match.getMySignInfo(obj).then(res => { | 282 | return match.getMySignInfo(obj).then(res => { |
| 371 | if (res.data.type == '1') { | 283 | if (res.data.type == '1') { | ... | ... |
| ... | @@ -275,7 +275,7 @@ onMounted(() => { | ... | @@ -275,7 +275,7 @@ onMounted(() => { |
| 275 | }) | 275 | }) |
| 276 | function getTotalFee() { | 276 | function getTotalFee() { |
| 277 | match.getTotalFee({ | 277 | match.getTotalFee({ |
| 278 | entryId: entryId, | 278 | entryId: groupId, |
| 279 | cptId: cptId | 279 | cptId: cptId |
| 280 | }).then(res => { | 280 | }).then(res => { |
| 281 | form.value = res.data | 281 | form.value = res.data | ... | ... |
| ... | @@ -2,72 +2,13 @@ | ... | @@ -2,72 +2,13 @@ |
| 2 | <div> | 2 | <div> |
| 3 | <div class="box ph-30"> | 3 | <div class="box ph-30"> |
| 4 | <el-card class="mb20"> | 4 | <el-card class="mb20"> |
| 5 | <el-steps :active="activeStep" align-center> | 5 | <team-sign-step :language="language" :active-step="activeStep"/> |
| 6 | <el-step title="团队信息"/> | ||
| 7 | <el-step title="教练/领队/其他"/> | ||
| 8 | <el-step title="选手报名"/> | ||
| 9 | <el-step title="提交审核"/> | ||
| 10 | </el-steps> | ||
| 11 | </el-card> | 6 | </el-card> |
| 12 | <el-card> | 7 | <el-card :body-style="{ padding: '0px' }"> |
| 13 | <div class="border-info"> | 8 | <match-info-row :matchInfo="matchInfo" :language="language"/> |
| 14 | <el-row> | 9 | <group-info-row :groupInfo="groupInfo" :language="language"/> |
| 15 | <el-col :lg="8"> | 10 | <coach-info-row :names="names" :language="language"/> |
| 16 | <div class="item"><label>赛事名称</label>{{ matchInfo.name }}</div> | 11 | <div style="margin: 20px"> |
| 17 | </el-col> | ||
| 18 | <el-col :lg="8"> | ||
| 19 | <div class="item"><label>赛事类型</label>{{ matchInfo.name }}</div> | ||
| 20 | </el-col> | ||
| 21 | <el-col :lg="8"> | ||
| 22 | <div class="item"><label>赛事时间</label>{{ matchInfo.beginTime?.slice(0, 10) }} 至 | ||
| 23 | {{ matchInfo.endTime?.slice(0, 10) }} | ||
| 24 | </div> | ||
| 25 | </el-col> | ||
| 26 | <el-col :lg="8"> | ||
| 27 | <div class="item"><label>报名时间</label>{{ matchInfo.signBeginTime?.slice(0, 10) }} | ||
| 28 | 至{{ matchInfo.signEndTime?.slice(0, 10) }} | ||
| 29 | </div> | ||
| 30 | </el-col> | ||
| 31 | <el-col :lg="16"> | ||
| 32 | <div class="item"><label>比赛地址</label>{{ matchInfo.address }}</div> | ||
| 33 | </el-col> | ||
| 34 | </el-row> | ||
| 35 | |||
| 36 | </div> | ||
| 37 | <div class="border-info gray mt20"> | ||
| 38 | <el-row> | ||
| 39 | <el-col :lg="8"> | ||
| 40 | <img/> | ||
| 41 | <div class="item"><label>团队名称</label>{{ matchInfo.signFee }}</div> | ||
| 42 | <div class="item"><label>团队类型</label>{{ matchInfo.signFee }}</div> | ||
| 43 | </el-col> | ||
| 44 | <el-col :lg="8"> | ||
| 45 | <div class="item"><label>负责人姓名</label>{{ matchInfo.signFee }}</div> | ||
| 46 | <div class="item"><label>参赛队名称</label>{{ matchInfo.signFee }}</div> | ||
| 47 | |||
| 48 | </el-col> | ||
| 49 | <el-col :lg="8"> | ||
| 50 | <div class="item"><label>邮箱</label>{{ matchInfo.signFee }}</div> | ||
| 51 | <div class="item"><label>详细地址</label>{{ matchInfo.signFee }}</div> | ||
| 52 | </el-col> | ||
| 53 | </el-row> | ||
| 54 | </div> | ||
| 55 | <div class="border-info mt20"> | ||
| 56 | <el-row> | ||
| 57 | <el-col :lg="8"> | ||
| 58 | <div class="item"><label>教练</label>{{ matchInfo.signFee }}</div> | ||
| 59 | <div class="item"><label>翻译</label>{{ matchInfo.signFee }}</div> | ||
| 60 | </el-col> | ||
| 61 | <el-col :lg="8"> | ||
| 62 | <div class="item"><label>领队</label>{{ matchInfo.signFee }}</div> | ||
| 63 | <div class="item"><label>官员</label>{{ matchInfo.signFee }}</div> | ||
| 64 | </el-col> | ||
| 65 | <el-col :lg="8"> | ||
| 66 | <div class="item"><label>队医</label>{{ matchInfo.signFee }}</div> | ||
| 67 | <div class="item"><label>其他</label>{{ matchInfo.signFee }}</div> | ||
| 68 | </el-col> | ||
| 69 | </el-row> | ||
| 70 | </div> | ||
| 71 | 12 | ||
| 72 | <div class="mt20"> | 13 | <div class="mt20"> |
| 73 | <div class="leftboderTT">参赛人员清单</div> | 14 | <div class="leftboderTT">参赛人员清单</div> |
| ... | @@ -115,6 +56,7 @@ | ... | @@ -115,6 +56,7 @@ |
| 115 | </el-table-column> | 56 | </el-table-column> |
| 116 | </el-table> | 57 | </el-table> |
| 117 | </div> | 58 | </div> |
| 59 | </div> | ||
| 118 | 60 | ||
| 119 | 61 | ||
| 120 | </el-card> | 62 | </el-card> |
| ... | @@ -143,9 +85,68 @@ | ... | @@ -143,9 +85,68 @@ |
| 143 | </template> | 85 | </template> |
| 144 | 86 | ||
| 145 | <script setup> | 87 | <script setup> |
| 88 | import TeamSignStep from './components/teamSignStep' | ||
| 89 | import MatchInfoRow from "@/viewsPc/match/components/matchInfo-row" | ||
| 90 | import GroupInfoRow from "@/viewsPc/match/components/groupInfo-row" | ||
| 91 | import CoachInfoRow from "@/viewsPc/match/components/coachInfo-row" | ||
| 92 | |||
| 146 | import {ref} from "vue" | 93 | import {ref} from "vue" |
| 94 | import cache from "@/plugins/cache"; | ||
| 95 | import {onMounted} from "@vue/runtime-core"; | ||
| 96 | import * as match from "@/apiPc/match" | ||
| 97 | import {useRoute, useRouter} from "vue-router"; | ||
| 98 | import useUserStore from "@/store/modules/user"; | ||
| 99 | const route = useRoute() | ||
| 100 | const router = useRouter() | ||
| 147 | const activeStep = ref(3) | 101 | const activeStep = ref(3) |
| 148 | const matchInfo = ref({}) | 102 | const matchInfo = ref({}) |
| 103 | const groupInfo = useUserStore().group || {} | ||
| 104 | const language = ref(cache.local.get('language') || 0) | ||
| 105 | const groupId = ref() | ||
| 106 | const form = ref({}) | ||
| 107 | const matchId = ref() | ||
| 108 | const names = ref({}) | ||
| 109 | onMounted(()=>{ | ||
| 110 | console.log(route.query) | ||
| 111 | groupId.value = route.query.groupId || 0 | ||
| 112 | matchId.value = route.query.matchId | ||
| 113 | getMatch() | ||
| 114 | getFee() | ||
| 115 | if(groupId.value!=0){ | ||
| 116 | tuandui() | ||
| 117 | } else { | ||
| 118 | geren() | ||
| 119 | } | ||
| 120 | }) | ||
| 121 | const getMatch = () => { | ||
| 122 | match.getMatchById({ id: matchId.value }).then(res => { | ||
| 123 | matchInfo.value = res.data | ||
| 124 | }) | ||
| 125 | } | ||
| 126 | function geren() { | ||
| 127 | match.getChooseDoneSingleCoachs(matchId.value).then(res => { | ||
| 128 | names.value = res.data | ||
| 129 | }) | ||
| 130 | } | ||
| 131 | |||
| 132 | function tuandui() { | ||
| 133 | match.getChooseDoneGroupCoachs(matchId.value, groupId.value).then(res => { | ||
| 134 | names.value = res.data | ||
| 135 | }) | ||
| 136 | } | ||
| 137 | const goPrev = () => { | ||
| 138 | router.go(-1) | ||
| 139 | } | ||
| 140 | const getFee = () => { | ||
| 141 | console.log(groupId.value) | ||
| 142 | |||
| 143 | match.getTotalFee({ | ||
| 144 | entryId: groupId.value, | ||
| 145 | cptId: matchId.value | ||
| 146 | }).then(res => { | ||
| 147 | form.value = res.data | ||
| 148 | }) | ||
| 149 | } | ||
| 149 | </script> | 150 | </script> |
| 150 | 151 | ||
| 151 | <style scoped lang="scss"> | 152 | <style scoped lang="scss"> |
| ... | @@ -169,4 +170,9 @@ const matchInfo = ref({}) | ... | @@ -169,4 +170,9 @@ const matchInfo = ref({}) |
| 169 | .text-right{text-align: right; | 170 | .text-right{text-align: right; |
| 170 | a{margin-left: 20px;} | 171 | a{margin-left: 20px;} |
| 171 | } | 172 | } |
| 173 | .border-info{ | ||
| 174 | .item{margin: 5px 0;color: #4C5359; font-size: 14px; | ||
| 175 | label{font-size: 14px;margin-right: 14px} | ||
| 176 | } | ||
| 177 | } | ||
| 172 | </style> | 178 | </style> | ... | ... |
| ... | @@ -52,7 +52,7 @@ | ... | @@ -52,7 +52,7 @@ |
| 52 | </el-form-item> | 52 | </el-form-item> |
| 53 | <el-form-item label="国籍" prop="countryId"> | 53 | <el-form-item label="国籍" prop="countryId"> |
| 54 | <el-select v-model="form.countryId" class="m-2" @change="changeCountryId"> | 54 | <el-select v-model="form.countryId" class="m-2" @change="changeCountryId"> |
| 55 | <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id" /> | 55 | <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id" /> |
| 56 | </el-select> | 56 | </el-select> |
| 57 | </el-form-item> | 57 | </el-form-item> |
| 58 | <el-form-item label="民族" prop="nation"> | 58 | <el-form-item label="民族" prop="nation"> | ... | ... |
| ... | @@ -3,72 +3,56 @@ | ... | @@ -3,72 +3,56 @@ |
| 3 | 3 | ||
| 4 | <div class="box ph-30"> | 4 | <div class="box ph-30"> |
| 5 | <el-card> | 5 | <el-card> |
| 6 | <el-steps active="1" align-center> | 6 | <team-sign-step :language="language" :active-step="0"/> |
| 7 | <el-step :title="language==0?'团队信息':'Team Information'" /> | ||
| 8 | <el-step :title="language==0?'教练/领队/其他':'Coach/Team Leader/Other'" /> | ||
| 9 | <el-step :title="language==0?'选手报名':'Participant Registration'" /> | ||
| 10 | <el-step :title="language==0?'提交审核':'Submit for review'" /> | ||
| 11 | </el-steps> | ||
| 12 | </el-card> | 7 | </el-card> |
| 13 | <div class="h20"></div> | 8 | <div class="h20"></div> |
| 14 | <div class="panel" style="box-shadow: var(--el-box-shadow)"> | 9 | <div class="panel" style="box-shadow: var(--el-box-shadow)"> |
| 15 | <div class="border-info" style="margin: 20px"> | 10 | <match-info-row :matchInfo="matchInfo" :language="language"/> |
| 16 | <el-row v-if="language==0"> | ||
| 17 | <el-col :lg="8"><div class="item"><label>赛事名称</label>{{matchInfo.name}}</div></el-col> | ||
| 18 | <el-col :lg="8"><div class="item"><label>赛事类型</label>{{matchInfo.name}}</div></el-col> | ||
| 19 | <el-col :lg="8"><div class="item"><label>赛事时间</label>{{matchInfo.beginTime?.slice(0,10)}} 至 {{ matchInfo.endTime?.slice(0,10) }}</div></el-col> | ||
| 20 | <el-col :lg="8"><div class="item"><label>报名时间</label>{{ matchInfo.signBeginTime?.slice(0,10) }} 至{{ matchInfo.signEndTime?.slice(0,10) }}</div></el-col> | ||
| 21 | <el-col :lg="16"><div class="item"><label>比赛地址</label>{{matchInfo.address}}</div></el-col> | ||
| 22 | </el-row> | ||
| 23 | <el-row v-else> | ||
| 24 | <el-col :lg="8"><div class="item"><label>Event Name</label>{{matchInfo.name}}</div></el-col> | ||
| 25 | <el-col :lg="8"><div class="item"><label>Event Type</label>{{matchInfo.name}}</div></el-col> | ||
| 26 | <el-col :lg="8"><div class="item"><label>Event Date</label>{{matchInfo.beginTime?.slice(0,10)}} ~ {{ matchInfo.endTime?.slice(0,10) }}</div></el-col> | ||
| 27 | <el-col :lg="8"><div class="item"><label>Registration Period</label>{{ matchInfo.signBeginTime?.slice(0,10) }} ~{{ matchInfo.signEndTime?.slice(0,10) }}</div></el-col> | ||
| 28 | <el-col :lg="16"><div class="item"><label>Event Address</label>{{matchInfo.address}}</div></el-col> | ||
| 29 | </el-row> | ||
| 30 | |||
| 31 | </div> | ||
| 32 | <div class="h20"></div> | 11 | <div class="h20"></div> |
| 33 | <el-form ref="ruleFormRef" label-width="120px" class="signForm" :model="form" :rules="rules"> | 12 | <el-form ref="ruleFormRef" label-width="120px" class="signForm" |
| 13 | :model="form" :rules="rules" | ||
| 14 | :label-position="language==0?'left':'top'"> | ||
| 34 | <el-row> | 15 | <el-row> |
| 35 | <el-col :lg="8" :offset="2"> | 16 | <el-col :lg="8" :offset="2"> |
| 36 | <el-form-item label="团体Logo" prop="imgUrl"> | 17 | <el-form-item :label="language==0?'团体Logo':'Group Logo'" prop="imgUrl"> |
| 37 | <ImageUpload2 v-model="form.imgUrl" :crop-width="200" :crop-height="200" :limit="1"/> | 18 | <ImageUpload2 v-model="form.imgUrl" :crop-width="200" :crop-height="200" :limit="1"/> |
| 38 | <span class="tip">请上传不超过 <i>5M</i> 的文件 格式为 <i>png/jpg/jpeg</i> 的文件</span> | 19 | <span class="tip" v-if="language==0">请上传不超过 <i>5M</i> 的文件 格式为 <i>png/jpg/jpeg</i> 的文件</span> |
| 20 | <span class="tip" v-else>Please upload a file in the format of | ||
| 21 | <i>png/jpg/jpeg</i> that does not exceed <i>5MB</i> | ||
| 22 | </span> | ||
| 39 | </el-form-item> | 23 | </el-form-item> |
| 40 | </el-col> | 24 | </el-col> |
| 41 | <el-col :lg="10"> | 25 | <el-col :lg="10"> |
| 42 | <el-form-item label="团体名称" prop="name"> | 26 | <el-form-item :label="language==0?'团体名称':'Team Name'" prop="name"> |
| 43 | <el-input v-model="form.name" placeholder="请输入团体名称" /> | 27 | <el-input v-model="form.name" :placeholder="language==0?'请输入团体名称':''" /> |
| 44 | </el-form-item> | 28 | </el-form-item> |
| 45 | <el-form-item label="负责人姓名" prop="contactPerson"> | 29 | <el-form-item :label="language==0?'负责人姓名':'Contact Person'" prop="contactPerson"> |
| 46 | <el-input v-model="form.contactPerson" placeholder="请输入联系人" /> | 30 | <el-input v-model="form.contactPerson" placeholder="请输入联系人" /> |
| 47 | </el-form-item> | 31 | </el-form-item> |
| 48 | <el-form-item label="邮箱" required prop="contactEmail"> | 32 | <el-form-item :label="language==0?'邮箱':'Email'" required prop="contactEmail"> |
| 49 | <el-input v-model="form.contactEmail" type="email" placeholder="请输入内容"/> | 33 | <el-input v-model="form.contactEmail" type="email" placeholder="请输入内容"/> |
| 50 | </el-form-item> | 34 | </el-form-item> |
| 51 | <el-form-item label="详细地址" required prop="address"> | 35 | <el-form-item :label="language==0?'详细地址':'Detailed Address'" required prop="address"> |
| 52 | <el-input type="textarea" v-model="form.address" class="mt10" placeholder="请输入详细地址"/> | 36 | <el-input type="textarea" v-model="form.address" class="mt10" placeholder="请输入详细地址"/> |
| 53 | </el-form-item> | 37 | </el-form-item> |
| 54 | <el-form-item label="团体类型" prop="type"> | 38 | <el-form-item :label="language==0?'团体类型':'Group type'" prop="type"> |
| 55 | <el-select v-model="form.type" placeholder="请选择团体类型" style="width: 100%;"> | 39 | <el-select v-model="form.type" :placeholder="language==0?'请选择团体类型':''" style="width: 100%;"> |
| 56 | <el-option label="普通院校" value="0" /> | 40 | <el-option :label="language==0?'普通院校':'School'" value="0" /> |
| 57 | <el-option label="专业舞蹈学校" value="1" /> | 41 | <el-option :label="language==0?'专业舞蹈学校':'Professional dance school'" value="1" /> |
| 58 | <el-option label="培训机构/俱乐部" value="2" /> | 42 | <el-option :label="language==0?'培训机构/俱乐部':'Company/Club'" value="2" /> |
| 59 | <el-option label="地方协会" value="3" /> | 43 | <el-option :label="language==0?'地方协会':'Local Association'" value="3" /> |
| 60 | <el-option label="国家协会" value="4" /> | 44 | <el-option :label="language==0?'国家协会':'National Association'" value="4" /> |
| 61 | </el-select> | 45 | </el-select> |
| 62 | </el-form-item> | 46 | </el-form-item> |
| 63 | <el-form-item label="参赛队名称" required prop="abreviations"> | 47 | <el-form-item :label="language==0?'参赛队名称':'Name of participating team'" required prop="abreviations"> |
| 64 | <el-input type="text" v-model="form.abreviations" placeholder="请输入内容"/> | 48 | <el-input type="text" v-model="form.abreviations" :placeholder="language==0?'请输入内容':''"/> |
| 65 | </el-form-item> | 49 | </el-form-item> |
| 66 | 50 | ||
| 67 | </el-col> | 51 | </el-col> |
| 68 | </el-row> | 52 | </el-row> |
| 69 | <el-row v-if="participantsInfoArr&&participantsInfoArr.length>0"> | 53 | <el-row v-if="participantsInfoArr&&participantsInfoArr.length>0"> |
| 70 | <el-col :span="16" :offset="4"> | 54 | <el-col :span="16" :offset="4"> |
| 71 | <h3>补充信息</h3> | 55 | <h3>{{ language==0?'补充信息':'Supplemental information'}}</h3> |
| 72 | <el-form-item v-for="(s,index) in participantsInfoArr" :key="index"> | 56 | <el-form-item v-for="(s,index) in participantsInfoArr" :key="index"> |
| 73 | <template #label> | 57 | <template #label> |
| 74 | <span v-if="s.status == 0" class="red">*</span>{{ s.name }} | 58 | <span v-if="s.status == 0" class="red">*</span>{{ s.name }} |
| ... | @@ -104,6 +88,9 @@ import { reactive, ref } from 'vue' | ... | @@ -104,6 +88,9 @@ import { reactive, ref } from 'vue' |
| 104 | import { getCurrentInstance, onMounted } from '@vue/runtime-core' | 88 | import { getCurrentInstance, onMounted } from '@vue/runtime-core' |
| 105 | import { useRoute, useRouter } from 'vue-router' | 89 | import { useRoute, useRouter } from 'vue-router' |
| 106 | import { toRefs } from '@vueuse/shared' | 90 | import { toRefs } from '@vueuse/shared' |
| 91 | import TeamSignStep from './components/teamSignStep' | ||
| 92 | import MatchInfoRow from "@/viewsPc/match/components/matchInfo-row"; | ||
| 93 | |||
| 107 | import cache from "@/plugins/cache" | 94 | import cache from "@/plugins/cache" |
| 108 | const language = ref(cache.local.get('language') || 0) | 95 | const language = ref(cache.local.get('language') || 0) |
| 109 | 96 | ||
| ... | @@ -282,11 +269,7 @@ function goNext() { | ... | @@ -282,11 +269,7 @@ function goNext() { |
| 282 | padding: 0; | 269 | padding: 0; |
| 283 | background: #F5F7F9; | 270 | background: #F5F7F9; |
| 284 | } | 271 | } |
| 285 | .border-info{ | 272 | |
| 286 | .item{margin: 5px 0;color: #4C5359; font-size: 14px; | ||
| 287 | label{font-size: 14px;margin-right: 14px} | ||
| 288 | } | ||
| 289 | } | ||
| 290 | .panel-footer .el-button--success { | 273 | .panel-footer .el-button--success { |
| 291 | padding: 0 40px; | 274 | padding: 0 40px; |
| 292 | } | 275 | } | ... | ... |
| ... | @@ -5,8 +5,8 @@ | ... | @@ -5,8 +5,8 @@ |
| 5 | <!-- 国内-机构注册--> | 5 | <!-- 国内-机构注册--> |
| 6 | <el-card> | 6 | <el-card> |
| 7 | <el-steps :active="activeStep" finish-status="success" align-center> | 7 | <el-steps :active="activeStep" finish-status="success" align-center> |
| 8 | <el-step title="创建账号" /> | 8 | <el-step title="创建账号"/> |
| 9 | <el-step title="注册完成" /> | 9 | <el-step title="注册完成"/> |
| 10 | </el-steps> | 10 | </el-steps> |
| 11 | </el-card> | 11 | </el-card> |
| 12 | 12 | ||
| ... | @@ -14,12 +14,19 @@ | ... | @@ -14,12 +14,19 @@ |
| 14 | <div v-if="activeStep==0"> | 14 | <div v-if="activeStep==0"> |
| 15 | <el-card style="min-height: 50vh"> | 15 | <el-card style="min-height: 50vh"> |
| 16 | <div class="pt30"> | 16 | <div class="pt30"> |
| 17 | <el-form class="d-form" size="large" label-width="120" style="max-width: 500px;margin: auto"> | 17 | <el-form class="d-form" size="large" label-width="120" |
| 18 | style="max-width: 500px;margin: auto"> | ||
| 18 | <el-form-item label="WDSF卡号" required> | 19 | <el-form-item label="WDSF卡号" required> |
| 19 | <el-input type="text" v-model="form.WDSF" @change="resetCode" @blur="verifyCode"/> | 20 | <el-input type="text" v-model="form.WDSF" @change="resetCode(0)" @blur="verifyCode"> |
| 21 | <template #append> | ||
| 22 | <el-button type="primary" plain style="width: 110px" @click="checkwdsf"> | ||
| 23 | <span>校验卡号</span> | ||
| 24 | </el-button> | ||
| 25 | </template> | ||
| 26 | </el-input> | ||
| 20 | </el-form-item> | 27 | </el-form-item> |
| 21 | <el-form-item label="手机/邮箱" required> | 28 | <el-form-item label="手机/邮箱" required> |
| 22 | <el-input type="text" v-model="form.account" @change="resetCode" @blur="verifyCode"/> | 29 | <el-input type="text" v-model="form.account" @change="resetCode(1)" @blur="verifyCode"/> |
| 23 | </el-form-item> | 30 | </el-form-item> |
| 24 | <el-form-item label="验证码" required> | 31 | <el-form-item label="验证码" required> |
| 25 | <el-input v-model="form.code"> | 32 | <el-input v-model="form.code"> |
| ... | @@ -28,15 +35,10 @@ | ... | @@ -28,15 +35,10 @@ |
| 28 | <count-down v-if="counting" v-slot="{ totalSeconds }" :time="60000" @end="counting=false"> | 35 | <count-down v-if="counting" v-slot="{ totalSeconds }" :time="60000" @end="counting=false"> |
| 29 | {{ totalSeconds }} 秒 | 36 | {{ totalSeconds }} 秒 |
| 30 | </count-down> | 37 | </count-down> |
| 31 | <span v-else> | 38 | <span v-else>发送验证码</span> |
| 32 | 发送验证码 | ||
| 33 | </span> | ||
| 34 | </el-button> | 39 | </el-button> |
| 35 | </template> | 40 | </template> |
| 36 | </el-input> | 41 | </el-input> |
| 37 | <div class="vcodeBox" :style="isShow?'height:240px':'height:0'"> | ||
| 38 | <Vcode :show="isShow" type="inside" @success="codeSuccess" @close="codeClose" @fail='codeFail'></Vcode> | ||
| 39 | </div> | ||
| 40 | </el-form-item> | 42 | </el-form-item> |
| 41 | </el-form> | 43 | </el-form> |
| 42 | </div> | 44 | </div> |
| ... | @@ -47,17 +49,98 @@ | ... | @@ -47,17 +49,98 @@ |
| 47 | </el-card> | 49 | </el-card> |
| 48 | </div> | 50 | </div> |
| 49 | <div v-if="activeStep==1"> | 51 | <div v-if="activeStep==1"> |
| 52 | <Step3 :accont="form.account"/> | ||
| 50 | </div> | 53 | </div> |
| 51 | 54 | ||
| 52 | 55 | <Vcode :show="isShow" @success="codeSuccess()"></Vcode> | |
| 53 | </div> | 56 | </div> |
| 54 | </div> | 57 | </div> |
| 55 | </div> | 58 | </div> |
| 56 | </template> | 59 | </template> |
| 57 | 60 | ||
| 58 | <script setup> | 61 | <script setup> |
| 59 | import {ref} from "vue" | 62 | import {ref,toRefs,reactive} from "vue" |
| 60 | const activeStep = ref(0) | 63 | import {onMounted} from "@vue/runtime-core"; |
| 64 | import Step3 from "./team/step3" | ||
| 65 | import Vcode from "vue3-puzzle-vcode" | ||
| 66 | import { ElMessage } from 'element-plus' | ||
| 67 | import CountDown from '@chenfengyuan/vue-countdown' | ||
| 68 | import cache from '@/plugins/cache' | ||
| 69 | const language = ref(cache.local.get('language') || 0) | ||
| 70 | |||
| 71 | const data = reactive({ | ||
| 72 | isShow:false, | ||
| 73 | isCodeTrue:0, | ||
| 74 | counting:false, | ||
| 75 | form:{}, | ||
| 76 | activeStep: 0, | ||
| 77 | failVcode:'验证失败,请重试', | ||
| 78 | successVcode:'验证通过!', | ||
| 79 | sliderText: '拖动滑块完成拼图', | ||
| 80 | }) | ||
| 81 | const {isShow,isCodeTrue,counting,form,activeStep,failVcode,successVcode,sliderText} = toRefs(data) | ||
| 82 | onMounted(()=>{ | ||
| 83 | if(language.value==1){ | ||
| 84 | failVcode.value = 'Error!' | ||
| 85 | successVcode.value = 'Success!' | ||
| 86 | sliderText.value = 'Drag the slider to complete the puzzle' | ||
| 87 | } | ||
| 88 | }) | ||
| 89 | function sendsmsMsg() { | ||
| 90 | if(!form.value.account){ | ||
| 91 | if(language.value==0){ | ||
| 92 | ElMessage.error('请填写手机/邮箱') | ||
| 93 | } else { | ||
| 94 | ElMessage.error('Please fill in your phone/email address') | ||
| 95 | } | ||
| 96 | return | ||
| 97 | } | ||
| 98 | if(counting.value){ | ||
| 99 | return | ||
| 100 | } else { | ||
| 101 | isShow.value = true | ||
| 102 | } | ||
| 103 | } | ||
| 104 | function checkwdsf() { | ||
| 105 | if(!form.value.WDSF){ | ||
| 106 | if(language.value==0){ | ||
| 107 | ElMessage.error('请填写WDSF卡号') | ||
| 108 | } else { | ||
| 109 | ElMessage.error('Please fill in your WDSF code') | ||
| 110 | } | ||
| 111 | return | ||
| 112 | } | ||
| 113 | isShow.value = true | ||
| 114 | } | ||
| 115 | function verifyCode() { | ||
| 116 | if(!form.value.account){ | ||
| 117 | return | ||
| 118 | } | ||
| 119 | if(form.value.account.indexOf('@')>-1){ | ||
| 120 | //邮箱 | ||
| 121 | } | ||
| 122 | } | ||
| 123 | function codeSuccess(msg) { | ||
| 124 | console.log('验证通过' + msg); | ||
| 125 | isShow.value = false | ||
| 126 | isCodeTrue.value += 1 | ||
| 127 | if(isCodeTrue.value==1){ | ||
| 128 | |||
| 129 | } | ||
| 130 | if(isCodeTrue.value==2){ | ||
| 131 | counting.value = true | ||
| 132 | // getCaptchaSms({account:form.value.account}).then(res=>{ | ||
| 133 | // | ||
| 134 | // }) | ||
| 135 | } | ||
| 136 | |||
| 137 | } | ||
| 138 | function resetCode(n) { | ||
| 139 | isCodeTrue.value = n | ||
| 140 | } | ||
| 141 | function next() { | ||
| 142 | activeStep.value = 1 | ||
| 143 | } | ||
| 61 | </script> | 144 | </script> |
| 62 | 145 | ||
| 63 | <style scoped> | 146 | <style scoped> | ... | ... |
| ... | @@ -20,7 +20,7 @@ | ... | @@ -20,7 +20,7 @@ |
| 20 | </el-input> | 20 | </el-input> |
| 21 | <div class="vcodeBox" :style="isShow?'height:240px':'height:0'"> | 21 | <div class="vcodeBox" :style="isShow?'height:240px':'height:0'"> |
| 22 | <Vcode :show="isShow" :successText="successVcode" :failText="failVcode" :slider-text="sliderText" | 22 | <Vcode :show="isShow" :successText="successVcode" :failText="failVcode" :slider-text="sliderText" |
| 23 | type="inside" @success="codeSuccess" @close="codeClose" @fail='codeFail'></Vcode> | 23 | type="inside" @success="codeSuccess"></Vcode> |
| 24 | </div> | 24 | </div> |
| 25 | </el-form-item> | 25 | </el-form-item> |
| 26 | </el-form> | 26 | </el-form> |
| ... | @@ -96,12 +96,7 @@ function codeSuccess(msg) { | ... | @@ -96,12 +96,7 @@ function codeSuccess(msg) { |
| 96 | function resetCode() { | 96 | function resetCode() { |
| 97 | isCodeTrue.value = false | 97 | isCodeTrue.value = false |
| 98 | } | 98 | } |
| 99 | function codeFail() { | ||
| 100 | 99 | ||
| 101 | } | ||
| 102 | function codeClose() { | ||
| 103 | |||
| 104 | } | ||
| 105 | const goBack = () => { | 100 | const goBack = () => { |
| 106 | router.go(-1) | 101 | router.go(-1) |
| 107 | } | 102 | } | ... | ... |
| ... | @@ -27,7 +27,7 @@ | ... | @@ -27,7 +27,7 @@ |
| 27 | style="max-width: 500px;margin: auto"> | 27 | style="max-width: 500px;margin: auto"> |
| 28 | <el-form-item :label="language==0?'所属国家':'Nationality'" required> | 28 | <el-form-item :label="language==0?'所属国家':'Nationality'" required> |
| 29 | <el-select filterable v-model="form.countryId"> | 29 | <el-select filterable v-model="form.countryId"> |
| 30 | <el-option v-for="item in countryList" :key="item.id" :label="item.name" :value="item.id"/> | 30 | <el-option v-for="item in countryList" :key="item.id" :label="language==0?item.name:item.enName" :value="item.id"/> |
| 31 | </el-select> | 31 | </el-select> |
| 32 | </el-form-item> | 32 | </el-form-item> |
| 33 | <el-form-item :label="language==0?'详细地址':'Address'" required prop="address"> | 33 | <el-form-item :label="language==0?'详细地址':'Address'" required prop="address"> | ... | ... |
| ... | @@ -22,7 +22,9 @@ import {toRefs} from "@vueuse/shared/index"; | ... | @@ -22,7 +22,9 @@ import {toRefs} from "@vueuse/shared/index"; |
| 22 | import Vcode from "vue3-puzzle-vcode" | 22 | import Vcode from "vue3-puzzle-vcode" |
| 23 | import {ElMessage} from 'element-plus' | 23 | import {ElMessage} from 'element-plus' |
| 24 | import CountDown from '@chenfengyuan/vue-countdown' | 24 | import CountDown from '@chenfengyuan/vue-countdown' |
| 25 | import {getCaptchaSms, checkRegisterCode} from "@/apiPc/match"; | 25 | import {getCaptchaSms, checkRegisterCode} from "@/apiPc/match" |
| 26 | import cache from '@/plugins/cache' | ||
| 27 | const language = ref(cache.local.get('language') || 0) | ||
| 26 | const props = defineProps({ | 28 | const props = defineProps({ |
| 27 | accont:{ | 29 | accont:{ |
| 28 | type:String, | 30 | type:String, | ... | ... |
-
Please register or sign in to post a comment